How to learn Polygon programming

Issue #870 Building https://dev.to/dabit3/building-scalable-full-stack-apps-on-ethereum-with-polygon-2cfb Sidechain https://docs.polygon.technology/docs/home/new-to-polygon https://hackernoon.com/what-are-sidechains-and-childchains-7202cc9e5994 USDC Testnet https://mumbai.polygonscan.com/token/0x566368d78dbdec50f04b588e152de3cec0d5889f Mainnet https://polygonscan.com/token/0x2791bca1f2de4661ed88a30c99a7a9449aa84174 Faucet Testnet https://faucet.polygon.technology/

February 24, 2022 路 1 min 路 Khoa Pham

How to make simple Plist builder with resultBuilder in Swift

Issue #869 We can use PropertyListEncoder from Swift 4 let encoder = PropertyListEncoder() encoder.outputFormat = .xml let data = try encoder.encode(model) Or we can manually do with resultBuilder style Declare @resultBuilder for PlistBuilder that can support if else check import Foundation @resultBuilder enum PlistBuilder { static func buildBlock(_ components: PlistNode...) -> [PlistNode] { components } static func buildBlock(_ components: [PlistNode]...) -> [PlistNode] { components.flatMap { $0 } } static func buildEither(first component: [PlistNode]) -> [PlistNode] { component } static func buildEither(second component: [PlistNode]) -> [PlistNode] { component } static func buildOptional(_ component: [PlistNode]?...

February 18, 2022 路 2 min 路 Khoa Pham

How to generate JWT token for App Store Connect API in Swift

Issue #868 Use JWTKit and code from AppStoreConnect library import JWTKit public struct Credential { let issuerId: String let privateKeyId: String let privateKey: String public init( issuerId: String, privateKeyId: String, privateKey: String ) { self.issuerId = issuerId self.privateKeyId = privateKeyId self.privateKey = privateKey } func generateJWT() throws -> String { guard let signer = try? JWTSigner.es256( key: ECDSAKey.private(pem: privateKey)) else { throw AppStoreConnectError.invalidJWT } let payload = Payload( issueID: IssuerClaim(value: issuerId), expiration: ExpirationClaim( value: Date( timeInterval: 2 * 60, since: Date() ) ), audience: AudienceClaim( value: "appstoreconnect-v1" ) ) guard let jwt = try?...

February 16, 2022 路 1 min 路 Khoa Pham

How to send SPL token in Swift

Issue #867 Using https://github.com/ajamaica/Solana.Swift and the sendSPLToken method. Note that the from is the token account address and amount can have decimals solana.action.sendSPLTokens( mintAddress: MINT_ADDRESS, from: SENDER_TOKEN_ACCOUNT_ADDRESS, to: RECEIVER_WALLET_ADDDRESS, amount: UInt64(Float(amount) * units), allowUnfundedRecipient: true, onComplete: { result in continuation.resume(with: result) } ) We can also cross-reference to the solana web3.js library for how to create mint and transfer token import { clusterApiUrl, Connection, Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; import { createMint, getOrCreateAssociatedTokenAccount, mintTo, transfer } from '....

February 11, 2022 路 2 min 路 Khoa Pham

How to calculate Solana transaction fee

Issue #866 A simple way is to use a fixed fee of 0.000005 For example from https://solscan.io/tx/5DkApvwTYuMqCiA94MhUVKJoLn8MGma9gAWXhreRJKqAs395P5CqEK3R84m3MWjcTKMem53XcLwYErGkaJAbQC2h?cluster=testnet And call some exchange API, like Coingecko https://api.coingecko.com/api/v3/simple/price?ids=solana&vs_currencies=usd and show the price in USD { "solana": { "usd": 114.13 } }

February 10, 2022 路 1 min 路 Khoa Pham

How to parse large JSON Dictionary in Swift

Issue #865 We can define some typealias and build extensions on JSONDictionary to easily extract values typealias JSONDictionary = [String: Any] typealias JSONArray = [JSONDictionary] extension JSONDictionary { func dict(_ key: String) -> JSONDictionary? { self[key] as? JSONDictionary } func array(_ key: String) -> JSONArray? { self[key] as? JSONArray } func value<T>(_ key: String, as: T.Type) -> T? { self[key] as? T } } let responseJson = try JSONSerialization.jsonObject(with: data, options: []) guard let responseJson = responseJson as?...

February 7, 2022 路 1 min 路 Khoa Pham

How to make simple async URLSession in Swift

Issue #864 Since async URLSession.shared.data is available in iOS 15+, we can build a custom one with withCheckedThrowingContinuation import UIKit enum HTTPMethod: String { case get = "GET" case post = "POST" } extension URLSession { func asyncData( with url: URL, method: HTTPMethod = .get, headers: [String: String] = [:], body: Data? = nil ) async throws -> Data { var request = URLRequest(url: url) request.httpMethod = method.rawValue request.allHTTPHeaderFields = [ "Content-Type": "application/json" ] request....

February 7, 2022 路 1 min 路 Khoa Pham

How to check SPL token balance on Solana

Issue #863 We will check USDC token balance on Solana testnet. Firstly, we will use https://usdcfaucet.com/ to airdrop some USDC tokens into our wallet. Secondly, we check USDC token mint address on testnet cluster using Solana Explorer https://explorer.solana.com/address/CpMah17kQEL2wqyMKt3mZBdTnZbkbfx4nqmQMFDP5vwp?cluster=testnet Then we make an RPC call to POST https://api.testnet.solana.comhttps://api.testnet.solana.com using method getTokenAccountsByOwner, passing our wallet address and the token mint address { "jsonrpc": "2.0", "id": 1, "method": "getTokenAccountsByOwner", "params": [ "53THxwqa9qF3cn46wHVKbGMM8hUpZDJE5jS3T1qVL5bc", { "mint": "CpMah17kQEL2wqyMKt3mZBdTnZbkbfx4nqmQMFDP5vwp" }, { "encoding": "jsonParsed" } ] } The response looks like below....

February 7, 2022 路 2 min 路 Khoa Pham

How to learn Solana programming

Issue #862 General https://solanacookbook.com/#contributing https://learn.figment.io/protocols/solana https://dev.to/dabit3/the-complete-guide-to-full-stack-solana-development-with-react-anchor-rust-and-phantom-3291 https://dev.to/kelvinkirima014/a-gentle-introduction-to-solana-2h3k https://buildspace.so/learn-solana Transaction https://medium.com/@asmiller1989/solana-transactions-in-depth-1f7f7fe06ac2 Token program https://spl.solana.com/token https://www.brianfriel.xyz/how-to-create-a-token-on-solana/ https://pencilflip.medium.com/solanas-token-program-explained-de0ddce29714

February 7, 2022 路 1 min 路 Khoa Pham

How to use subscript in Swift

Issue #861 Make it easy to access common cases, for example UserDefaults extension UserDefaults { enum Key: String { case hasBackup } subscript(key: Key) -> Bool { get { bool(forKey: key.rawValue) } set { set(newValue, forKey: key.rawValue) } } } UserDefaults.standard.hasBackup] = true

February 5, 2022 路 1 min 路 Khoa Pham

How to encode JSON dictionary into JSONEncoder

Issue #860 JSONEncoder deals with type-safe, so we need to declare an enum JSONValue for all possible types. We also need a custom initializer to init JSONValue from a JSON Dictionary import Foundation enum JSONValue { case string(String) case int(Int) case double(Double) case bool(Bool) case object([String: JSONValue]) case array([JSONValue]) } extension JSONValue: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { case .string(let string): try container....

February 4, 2022 路 2 min 路 Khoa Pham

How to parse Apple Pay PKPayment in Swift

Issue #859 To parse PKPayment and used with Wyre CreateAppleOrder API, we can declare some Encodable structs import PassKit import Foundation struct PaymentObject: Encodable { var billingContact: Contact? var shippingContact: Contact? var token: JSONValue } extension PaymentObject { struct Contact: Encodable { var addressLines: [String]? var country: String? var countryCode: String? var familyName: String? var givenname: String? var locality: String? var postalCode: String? var administrativeArea: String? var subAdministrativeArea: String? var subLocality: String?...

February 4, 2022 路 1 min 路 Khoa Pham

How to pop multiple level with NavigationView and NavigationLink in SwiftUI

Issue #858 Use isActive and isDetailLink(false) Use Introspect .introspectNavigationController { nav in self.nav = nav } Read more https://www.cuvenx.com/post/swiftui-pop-to-root-view

January 27, 2022 路 1 min 路 Khoa Pham

How to generate Solana wallet acount in Swift

Issue #857 Use Solana.swift and Mnemonic seed phrase. For production, change endpoint to mainnet import UIKit import Solana import KeychainAccess enum SolanaError: Swift.Error { case accountFailed case unauthorized } final class SolanaClient { static let shared = SolanaClient() final class SolanaClient { static let shared = SolanaClient() private let solana: Solana private let accountStorage = KeychainAccountStorage() private let seedPharser = SeedPhraser() private let endpoint: RPCEndpoint = .devnetSolana private let network: NetworkingRouter init() { self....

January 26, 2022 路 2 min 路 Khoa Pham

How to use Apple Pay in iOS

Issue #856 Use PKPaymentRequest and PKPaymentAuthorizationViewController @MainActor final class WalletViewModel: NSObject, ObservableObject { var canMakePayments: Bool { PKPaymentAuthorizationViewController.canMakePayments() } func showApplePay(amount: Amount, from window: UIWindow) { let request = PKPaymentRequest() request.supportedNetworks = [PKPaymentNetwork.amex, .discover, .masterCard, .visa] request.countryCode = "US" request.currencyCode = "USD" request.merchantIdentifier = "merchant.\(Bundle.main.bundleIdentifier!)" request.merchantCapabilities = .capability3DS let item = PKPaymentSummaryItem(label: "Add Cash", amount: amount.toNsDecimal) request.paymentSummaryItems = [item] guard let vc = PKPaymentAuthorizationViewController(paymentRequest: request) else { return } vc.delegate = self window....

January 17, 2022 路 1 min 路 Khoa Pham

How to show QR code in SwiftUI

Issue #855 Use CoreImage to generate QR image import SwiftUI import CoreImage.CIFilterBuiltins struct QRView: View { let qrCode: String @State private var image: UIImage? var body: some View { ZStack { if let image = image { Image(uiImage: image) .resizable() .interpolation(.none) .frame(width: 210, height: 210) } } .onAppear { generateImage() } } private func generateImage() { guard image == nil else { return } let context = CIContext() let filter = CIFilter....

January 15, 2022 路 1 min 路 Khoa Pham

How to not encode with Enum key in Swift

Issue #854 If you use enum case as key in Dictionary, JSONEncoder will encode it as Array. For example enum Vehicle: String, Codable { case car case truck } struct Container: Codable { var map: [Vehicle: String] } struct Container2: Codable { var map: [String: String] } let container = Container(map: [ .car: "Car 1" ]) let container2 = Container2(map: [ "car": "Car 1" ]) let data = try! JSONEncoder().encode(container) print(String(data: data, encoding: ....

January 10, 2022 路 2 min 路 Khoa Pham

How to disable with ButtonStyle in SwiftUI

Issue #853 With ButtonStyle, the disabled modifier does not seem to work, we need to use allowsHitTesting. import SwiftUI struct ActionButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { HStack { Text("Button") } .padding() .disabled(true) // does not work .allowsHitTesting(false) } } We need to call disabled outside, after buttonStyle. In case we have onTapGesture on the entire view, touching on that disabled button will also trigger our whole view action, which is not what we want....

December 4, 2021 路 1 min 路 Khoa Pham

How to query document id in array in Firestore

Issue #852 Supposed we have Book object struct Book: Identifiable, Codable, Hashable { @DocumentID var id: String? } We should use FieldPath instead of id for query let booksRef: CollectionReference = ... let ids: [String] = ... booksRef .whereField( FieldPath.documentID(), in: ids )

November 28, 2021 路 1 min 路 Khoa Pham

How to provide default Codable in Swift

Issue #851 Use DefaultValue to provide defaultValue in our property wrapper DefaultCodable public protocol DefaultValue { associatedtype Value: Codable static var defaultValue: Value { get } } public enum DefaultBy { public enum True: DefaultValue { public static let defaultValue = true } public enum False: DefaultValue { public static let defaultValue = false } } @propertyWrapper public struct DefaultCodable<T: DefaultValue> { public var wrappedValue: T.Value public init(wrappedValue: T.Value) { self....

October 23, 2021 路 1 min 路 Khoa Pham