Solana + RxSolana This is a open source library on pure swift for Solana protocol

Overview

Solana + RxSolana

Swift MIT Licence
Swift Package Manager compatible

This is a open source library on pure swift for Solana protocol.

The objective is to create a cross platform, fully functional, highly tested and less depencies as posible. The project is still at initial stage. Lots of changes chan happen to the exposed api.

Please check my wallet Summer.

Features

  • Sign and send transactions.
  • Key pair generation
  • RPC configuration.
  • SPM integration
  • Few libraries requirement (Commoncrypto, TweetNACL). Rxswift is optional.
  • Fully tested (53%)
  • Sockets

Usage

Initialization

Set the NetworkingRouter and setup your enviroment. You can also pass your own URLSession with your own settings. Use this router to initialize the sdk with an object that conforms the SolanaAccountStorage protocol

let network = NetworkingRouter(endpoint: .devnetSolana)
let solana = Solana(router: network, accountStorage: self.accountStorage)

Keypair generation

SolanaAccountStorage interface is used to return the generated accounts. The actual storage of the accout is handled by the client. Please make sure this account is stored correctly (you can encrypt it on the keychain). The retrived accout is Serializable. Inside Account you will fine the phrase, publicKey and secretKey.

Example using Memory (NOT RECOMEMDED).

class InMemoryAccountStorage: SolanaAccountStorage {
    
    private var _account: Account?
    func save(_ account: Account) -> Result<Void, Error> {
        _account = account
        return .success(())
    }
    var account: ResultError> {
        if let account = _account {
            return .success(account)
        }
        return .failure(SolanaError.unauthorized)
    }
    func clear() -> Result<Void, Error> {
        _account = nil
        return .success(())
    }
}

Example using KeychainSwift.

Result { do { let data = try JSONEncoder().encode(account) keychain.set(data, forKey: tokenKey) return .success(()) } catch { return .failure(error) } } var account: Result { // Read from the keychain guard let data = keychain.getData(tokenKey) else { return .failure(SolanaAccountStorageError.unauthorized) } if let account = try? JSONDecoder().decode(Account.self, from: data) { return .success(account) } return .failure(SolanaAccountStorageError.unauthorized) } func clear() -> Result { keychain.clear() return .success(()) } } ">
enum SolanaAccountStorageError: Error {
    case unauthorized
}
struct KeychainAccountStorageModule: SolanaAccountStorage {
    private let tokenKey = "Summer"
    private let keychain = KeychainSwift()
    
    func save(_ account: Account) -> Result<Void, Error> {
        do {
            let data = try JSONEncoder().encode(account)
            keychain.set(data, forKey: tokenKey)
            return .success(())
        } catch {
            return .failure(error)
        }
    }

    var account: ResultError> {
        // Read from the keychain
        guard let data = keychain.getData(tokenKey) else { return .failure(SolanaAccountStorageError.unauthorized)  }
        if let account = try? JSONDecoder().decode(Account.self, from: data) {
            return .success(account)
        }
        return .failure(SolanaAccountStorageError.unauthorized)
    }
    func clear() -> Result<Void, Error> {
        keychain.clear()
        return .success(())
    }
}

RPC api calls

We support 45 rpc api calls with and without Rx. Normal calls will return a callback (onComplete) and RxSolana will return Single . If the call requires address in base58 format, if is null it will default to the one returned by SolanaAccountStorage.

Example using callback

Gets Accounts info.

solana.api.getAccountInfo(account: account.publicKey.base58EncodedString, decodedTo: AccountInfo.self) { result in
// process result
}

Gets Balance

 solana.api.getBalance(account: account.publicKey.base58EncodedString){ result in
 // process result
 }

Example using RX

Gets Accounts info.

solana.api.getAccountInfo(account: account.publicKey.base58EncodedString, decodedTo: AccountInfo.self).subscribe()

Gets Balance

 solana.api.getBalance(account: account.publicKey.base58EncodedString).subscribe()

Actions

Actions are predifined program interfaces that construct the required inputs for the most common tasks in Solana ecosystems. You can see them as bunch of code that implements solana task using rpc calls. This also support optional Rx

We support 12.

  • closeTokenAccount: Closes token account
  • getTokenWallets: get token accounts
  • createAssociatedTokenAccount: Opens associated token account
  • sendSOL : Sends SOL native token
  • createTokenAccount: Opens token account
  • sendSPLTokens: Sends tokens
  • findSPLTokenDestinationAddress : Finds address of a token of a address
  • serializeAndSendWithFee: Serializes and signs the transaction. Then it it send to the blockchain.
  • getMintData: Get mint data for token
  • serializeTransaction: Serializes transaction
  • getPools: Get all available pools. Very intensive
  • swap: Swaps 2 tokens from pool.

Example with callback

Create an account token

solana.action.createTokenAccount( mintAddress: mintAddress) { result in
// process
}

Sending sol

let toPublicKey = "3h1zGmCwsRJnVk5BuRNMLsPaQu1y2aqXqXDWYCgrp5UG"
let transactionId = try! solana.action.sendSOL(
            to: toPublicKey,
            amount: 10
){ result in
 // process
}

Example with Rx

Create an account token

solana.action.createTokenAccount( mintAddress: mintAddress) .subscribe()

Sending sol

let toPublicKey = "3h1zGmCwsRJnVk5BuRNMLsPaQu1y2aqXqXDWYCgrp5UG"
solana.action.sendSOL(
            to: toPublicKey,
            amount: 10
).subscribe()

Requirements

  • iOS 11.0+ / macOS 10.13+ / tvOS 11.0+ / watchOS 3.0+
  • Swift 5.3+

Installation

From Xcode 11, you can use Swift Package Manager to add Solana.swift to your project.

  • File > Swift Packages > Add Package Dependency
  • Add https://github.com/ajamaica/Solana.Swift
  • Select "brach" with "master"
  • Select Solana and RxSwift (fully optional)

If you encounter any problem or have a question on adding the package to an Xcode project, I suggest reading the Adding Package Dependencies to Your App guide article from Apple.

Other

Ideas and plans

The code and api will be evoling for this initial fork please keep that in mind. I am planning adding support for othr development layers like React Native or flutter.

RxSwift maybe be removed from the library or at least moved to a diferent sublibrary. Every call will have a unit test.

Support it

SOL: CN87nZuhnFdz74S9zn3bxCcd5ZxW55nwvgAv5C2Tz3K7

Comments
  • Expose all methods using async/await API for iOS > 13 and macOS > 10.15

    Expose all methods using async/await API for iOS > 13 and macOS > 10.15

    This simple PR introduce an async/await version of all the callback based methods. All new async endpoints exist alongside the callback based ones, it therefore doesn't introduce any breaking change, just a larger choice. Tests have also been simplified, which is a double benefit as it also tests the proxying logic (async endpoints are just wrappers around existing callback based methods).

    opened by hmazelier 6
  • RxSwift completely removed from tests

    RxSwift completely removed from tests

    All RxSwift Dependencies were removed from tests.

    Next step: Move RxSolana to separate package and remove RxSwift dependency from Solana package.

    @ajamaica when I separate RxSolana package I can send you an archive to your email or I can make a repo in my repositories and give you a link so you can download and publish it in yours and then I will remove it from mines. Let me know what you would prefer.

    opened by DezorkIT 6
  • Make it possible to create your own custom transactions

    Make it possible to create your own custom transactions

    It's currently not possible to send custom transactions to your own Solana program with this package as-is. TransactionInstruction does not have a public init which means you can't create and send one from outside the package.

    Longer term it may be desirable to have full Anchor support, but in the mean-time (and for programs that don't use Anchor) it would be useful to be able to create and send custom instructions.

    #83 discusses a possible way to do this by creating a TransactionInstruction and then sending it with solana.action.serializeAndSendWithFee - however, without a public initialiser this isn't actually possible from outside.

    It would be good to discuss the options, a public init would be the simplest, but it may also be desirable to have static helpers like createCustomInstruction which could be made generic and specialised on a CustomInstruction interface, allowing external code to implement custom instructions and then create/send them. Has this been thought about much?

    opened by j-h-a 5
  • Build failures on Xcode 14.0.1

    Build failures on Xcode 14.0.1

    Describe the bug Attempting to build a project that has Solana.swift as a dependency in SPM fails to build with a linker error, Undefined symbol: __swift_FORCE_LOAD_$_XCTestSwiftSupport

    To Reproduce Steps to reproduce the behavior:

    1. Create a new project (I've tried both an iOS app and a framework, both behave the same)
    2. Add Solana.swift as a dependency in SPM
    3. Build the target
    4. See build failure Undefined symbol: __swift_FORCE_LOAD_$_XCTestSwiftSupport

    Expected behavior The project should build

    Screenshots image

    opened by andyboyd 4
  • Added support for serializing partially signed transactions

    Added support for serializing partially signed transactions

    Closes https://github.com/ajamaica/Solana.Swift/issues/178

    • Made serialization process reserve space for null signatures instead of trimming them
    • Fixed public Transaction.Signature model to actually be public
    opened by samdowd 4
  • Support app-defined Anchor instructions

    Support app-defined Anchor instructions

    Resolves #148

    This is being created as DRAFT for discussion.

    • The feature added is described in the README.
    • Change is additive in a single file, with one exception: a change to make findProgramAddress public.
    • Note that findProgramAddress could actually be internal - but it seems like it should be a public utility function for any programs using this package (fixes #144 too).
    • Sadly, the existing tests are broken (see #149), and I didn't write any new tests for this - I would love to add some tests but I'm trying to encourage some discussion around how to best achieve this (Anchor support) before spending lots of time on it. It works for our Anchor program, and provides a cleanish way for apps to talk directly to their own Solana programs.
    • I know there's a separate Anchor.swift repo, but it appears to be abandoned.
    • There are many fancy things that could be done - parsing IDL; property wrappers to provide function parameter hints and auto-implement serialization; but this seems like a good place to start discussion. It's simple, it works, it can be extended.
    • I put all the Anchor support code in one file, but its location is probably wrong, and perhaps some of these bits could be elsewhere - I welcome discussion/suggestions on how to tidy this up.
    opened by j-h-a 4
  • Feature/send sol allow unfunded recipient

    Feature/send sol allow unfunded recipient

    Hello Arturo!

    I've added a boolean flag similar to --allow-unfunded-recipient of Solana CLI to fund the creation of the account by sending SOL to it. Please review, if there's anything you'd want me to tweak — let me know.

    Thanks

    opened by megakoko 4
  • Action Templates

    Action Templates

    Hello, all!

    This PR is for the "typed action template" system we've discussed a couple times. The idea is that, while the current formulation to perform transactions is relatively convenient generally, if you're working with another paradigm, like Rx, Combine, or Swift's new structured concurrency, then the callback format can be inconvenient, and rewriting custom implementations that shim each and every action that can be performed is not only arduous, but ultimately somewhat self-defeating.

    So in this PR, I'm suggesting the addition of (optional — you can still have actions without writing one, of course!) "Action Templates" — struct-based versions of the instructions to perform a given action that you can hand directly to the Action class to perform instead of calling a method it owns.

    I've gone through a bunch of different iterations of what this could look like, but eventually, I concluded it's probably best just to keep this simple.

    In practice, here's how that looks, using a completion handler:

    let action = Action(...) // configure the "Action" class exactly as you would now
    let request = ActionTemplates.GetTokenWallets(...) // Build a request with the ActionTemplate representing what you want to do.
    action.perform(request) { result in
        // perform any actions you want here, just like berfore
    }
    

    But the real power here, and the reason I think this is important to do, is in the fact that this will prevent us from writing dozens of identical-looking variations on each action in the API in each tool. So instead of writing dozens of Combine implementations, we can write one extension, which will support all the current and future actions:

    public extension Action {
       func publisher<T: ActionTemplate>(for actionTemplate: T) -> AnyPublisher<T.Success, Error> {
                Future<T.Success, Error> { promise in
                    self.perform(actionTemplate) { promise($0) }
                }.eraseToAnyPublisher()
        }
    }
    

    And supporting structured concurrency is similarly straightforward:

    public extension Action {
        func perform<T: ActionTemplate>(_ actionTemplate: T) async throws -> T.Success {
            try await withCheckedThrowingContinuation { continuation in
                perform(actionTemplate) { continuation.resume(with: $0)}
            }
        }
    }
    

    Rx, being nearly identical to these two except the addition of imperatively building a disposable, is left as an exercise for the reader :P.

    I think introducing a system like this will be crucial to the longevity of the APIs here, and it will allow us to split out dependencies on things like Combine, Rx, and Swift 5.5/iOS 15 without having to write hundreds of lines in the packages to support them.

    opened by NathanLawrence 4
  • Bump macOS build step on GH Actions

    Bump macOS build step on GH Actions

    This PR bumps the build and test step to use the new macOS 11 GH actions option, which will enable us to check against other Swift features in the future, as well as (more importantly for now) just putting us in step with the platform and up to date with the way other open source projects are configuring themselves.

    Since the Swift requirements are not changing, we should not begin using any new features in the frameworks, but this seems like a good maintenance change.

    opened by NathanLawrence 3
  • RxSolana dependecy remove

    RxSolana dependecy remove

    In this PR: Removed RxSolana from Solana package Removed RxSolana examples from README.md

    I created a package https://github.com/DezorkIT/RxSolana.Swift, for now it looks at a branch in my fork. After this PR will be merged it needs to be updated with a link to your repo, a version tag and a change in a second step in docs in the "Installation" paragraph. After that you can move it to your repositories.

    opened by DezorkIT 3
  • Removing RxSwift from tests

    Removing RxSwift from tests

    A proposal: RxSolana had to be moved to a separated package, because there is other reactive frameworks besides RxSwift, for example native Combine. And there is also async/await for those who doesn't want/like reactive stuff. In the current version you have to have RxSolana dependency, which comes with RxSwift, even if you don't want to use it.

    Before moving to isolated package: Current version of Solana.Swift has tests which requires RxSolana, they had to be rewritten first.

    In this PR: Added RunLoopSimpleLock for testing. Which is simpler version of RunLoopLock.swift Removed rx from some tests, I will do the same for other tests in coming weeks Commented out "testDerivedKeychain" test because there is no "Keychain" entity

    Would love to hear your thoughts and opinions on that.

    opened by DezorkIT 3
  • Non escaped encodable

    Non escaped encodable

    Description

    • There were some issues with formatting transaction hashes in encoded JSON objects. Certain characters were getting escaped twice in the JSON field values, leading to them to fail to simulate.

    Work Completed

    • Updated the parameters on the JSON encoder to tell it not to escape JSON string values
    • NOTE: The fix uses a feature only available on iOS 13+. Is it acceptable to update the minimum version to this, or does a fix need to be found that also works on older versions?

    Testing

    • Transactions which were failing to simulate now simulate and complete successfully
    opened by andyboyd 0
  • Serialize and Send Transaction Not Working For Custom Programs

    Serialize and Send Transaction Not Working For Custom Programs

    Describe the bug I'm currently using MW to create unsigned transactions, return to frontend, serialize and sign. After signing and sending the transaction I'm getting "Signature Verification Failed" error from the chain.

    I'm using serialize function with requiredAllSignatures and verifySignatures parameters as true and getting no error. However, when sending on-chain this error occurs. When I checked the serialized data created for same transaction on web3.js and Solana.Swift library there were some differences in UInt8 array.

    To Reproduce Steps to reproduce the behavior:

    1. https://api.magiceden.dev or https://docs.hyperspace.xyz/hype/developer-guide/ can be used to create the NFT transactions.
    2. Create the transaction object from the retrieved tx.
    3. Partial sign, serialize and send the transaction on chain.
    4. See error

    Expected behavior Transaction should go through and be successful on chain.

    Screenshots Screen Shot 2022-11-02 at 01 33 45

    opened by AyberkDe 1
  • Cannot create token account for receiver

    Cannot create token account for receiver

    I am using this library for solana spl token transfer. I can successfully created token account for sender but not able to create token account for receiver. As i have no secret key of receiver so how can i create token account for receiver can anyone help please?

    opened by HemangiVekaria 0
  • Tests talk to Solana for real, and they fail

    Tests talk to Solana for real, and they fail

    The tests are currently failing, and it appears some use the real NetworkingRouter and actually talk to a GenesysGo devnet node.

    This is undesirable for a number of reasons.

    Fix is to implement a mock version of SolanaRouter that provides appropriate responses for each test case.

    opened by j-h-a 4
  • Action.sendSPLTokens fails with a destination address of an original account address

    Action.sendSPLTokens fails with a destination address of an original account address

    Describe the bug Action.sendSPLTokens always fails with a destination address of an original account address (the address of SOL account), no matter if there is an existing associated token address under the original account. The action only works when "to" and "from" are both associated token addresses other than their owners.

    Expected behavior If I did not get the design intention wrong, the action should check if the destination passing in is an associated token address or an original address. If it is an original address, the program will find its associated token address registered under the mint, or create a new one if not existing. However I'm getting errors under both conditions.

    I'm using the mint address of USDC in my tests on testnet: CpMah17kQEL2wqyMKt3mZBdTnZbkbfx4nqmQMFDP5vwp

    opened by ToraWu 2
Releases(2.0.2)
  • 2.0.2(Oct 31, 2022)

    What's Changed

    • Clean up warnings by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/199
    • Update read me by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/200
    • Adds pr template by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/202
    • Updates to swfit 5.5 by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/205
    • Adds async to actions by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/204
    • Remove network from Hotwallet by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/208
    • Add Symbol Documentation for RPC by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/206
    • Fix linting warnings by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/210
    • Update beet 1.0.2 by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/209
    • Implement Transaction deserialisation by @MirekR in https://github.com/metaplex-foundation/Solana.Swift/pull/211
    • Rename publicKey to pubkey for decoding by @mike-metaplex in https://github.com/metaplex-foundation/Solana.Swift/pull/212

    New Contributors

    • @MirekR made their first contribution in https://github.com/metaplex-foundation/Solana.Swift/pull/211

    Full Changelog: https://github.com/metaplex-foundation/Solana.Swift/compare/2.0.1...2.0.2

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Oct 18, 2022)

    What's Changed

    • Add methods for PureData to interact with Solita generated accounts by @mike-metaplex in https://github.com/metaplex-foundation/Solana.Swift/pull/197
    • Update Beet with tests fix by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/198

    Full Changelog: https://github.com/metaplex-foundation/Solana.Swift/compare/2.0.0...2.0.1

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Sep 23, 2022)

    What's Changed

    • Introduce Beet Serializer by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/190
    • Add Async await support for newer IOS by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/191
    • Introduce Account, HotWallet, Create AccountMeta by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/193

    Breaking Change

    Account.Meta was renamed to AccountMeta. Please update your code.

    Full Changelog: https://github.com/metaplex-foundation/Solana.Swift/compare/1.3.0...2.0.0

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Sep 13, 2022)

    What's Changed

    • Remove the default auth from the Solana. by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/159
    • Public key default by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/160
    • Visibility Publickey by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/161
    • Visisbility Transaction by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/162
    • Make sing public by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/163
    • Public serialize transactions by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/164
    • Make findProgramAddress open by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/166
    • Use the first signer as payer by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/167
    • Rename programId to systemProgramId by @j-h-a in https://github.com/metaplex-foundation/Solana.Swift/pull/152
    • Make transaction init public by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/168
    • Add init for DataSlice by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/169
    • Encodable wrapper init by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/170
    • Multiple Accounts nil by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/171
    • Add partialSigning and public Programs by @samdowd in https://github.com/metaplex-foundation/Solana.Swift/pull/176
    • Remove Genesys go RPCs by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/180
    • Fix token list parser that gets a url by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/182
    • allow unfunded recipient to send sol functionality added by @dhruv500 in https://github.com/metaplex-foundation/Solana.Swift/pull/177
    • Added support for serializing partially signed transactions by @samdowd in https://github.com/metaplex-foundation/Solana.Swift/pull/179
    • Fix testGetAccountInfoForSolTransfer unit test by @mike-metaplex in https://github.com/metaplex-foundation/Solana.Swift/pull/185
    • Pure data accountInfo support by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/186
    • Rename readme to metaplex-foundation by @ajamaica in https://github.com/metaplex-foundation/Solana.Swift/pull/184
    • Mock for router by @DezorkIT in https://github.com/metaplex-foundation/Solana.Swift/pull/187
    • Fix token program and add commitment by @mike-metaplex in https://github.com/metaplex-foundation/Solana.Swift/pull/188
    • namespace solana token program by @mike-metaplex in https://github.com/metaplex-foundation/Solana.Swift/pull/189

    New Contributors

    • @j-h-a made their first contribution in https://github.com/metaplex-foundation/Solana.Swift/pull/152
    • @samdowd made their first contribution in https://github.com/metaplex-foundation/Solana.Swift/pull/176
    • @dhruv500 made their first contribution in https://github.com/metaplex-foundation/Solana.Swift/pull/177
    • @mike-metaplex made their first contribution in https://github.com/metaplex-foundation/Solana.Swift/pull/185

    Full Changelog: https://github.com/metaplex-foundation/Solana.Swift/compare/1.2.0...1.3.0

    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Apr 7, 2022)

    What's Changed

    • Use devnetGenesysGo for tests by @ajamaica in https://github.com/ajamaica/Solana.Swift/pull/146
    • Updated cocoapods dependencies by @megakoko in https://github.com/ajamaica/Solana.Swift/pull/143
    • Change some APIs to public by @basememara in https://github.com/ajamaica/Solana.Swift/pull/145
    • Do not require decimals when transfering SPL tokens by @vpontis in https://github.com/ajamaica/Solana.Swift/pull/136
    • Fix Old Associated Address and add a test by @ajamaica in https://github.com/ajamaica/Solana.Swift/pull/147
    • Remove resources by @danqing in https://github.com/ajamaica/Solana.Swift/pull/135
    • Send token: allow unfunded recipient by @megakoko in https://github.com/ajamaica/Solana.Swift/pull/142
    • Fix and update tests by @ajamaica in https://github.com/ajamaica/Solana.Swift/pull/154
    • Solana pay support by @ajamaica in https://github.com/ajamaica/Solana.Swift/pull/155
    • Generate QR Code by @ajamaica in https://github.com/ajamaica/Solana.Swift/pull/156

    New Contributors

    • @ismyhc made their first contribution in https://github.com/ajamaica/Solana.Swift/pull/122
    • @megakoko made their first contribution in https://github.com/ajamaica/Solana.Swift/pull/141
    • @basememara made their first contribution in https://github.com/ajamaica/Solana.Swift/pull/145
    • @vpontis made their first contribution in https://github.com/ajamaica/Solana.Swift/pull/136
    • @danqing made their first contribution in https://github.com/ajamaica/Solana.Swift/pull/135

    Full Changelog: https://github.com/ajamaica/Solana.Swift/compare/1.1.0...1.2.0

    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Aug 19, 2021)

  • 1.0.0(Jun 21, 2021)

Owner
Arturo Jamaica
Arturo Jamaica
ITunesFeedGenerator - This library provides very simple and Swiftly way to fetch feeds from iTunes Store

ITunesFeedGenerator This library provides very simple and Swiftly way to fetch feeds from iTunes Store: Most Played Songs. Top Free or Paid Books. Top

Alfian Losari 9 Sep 8, 2022
Swift implementation of Github REST API v3

GitHubAPI Swift implementation of GitHub REST api v3. Library support Swift 4.2. Work is in progress. Currently supported: Issues API. Activity API(Fe

Serhii Londar 77 Jan 7, 2023
Google Directions API helper for iOS, written in Swift

PXGoogleDirections Google Directions API SDK for iOS, entirely written in Swift. ?? Features Supports all features from the Google Directions API as o

Romain L 268 Aug 18, 2022
👤 Framework to Generate Random Users - An Unofficial Swift SDK for randomuser.me

RandomUserSwift is an easy to use Swift framework that provides the ability to generate random users and their accompanying data for your Swift applic

Wilson Ding 95 Sep 9, 2022
Swift Reddit API Wrapper

reddift reddift is Swift Reddit API Wrapper framework, and includes a browser is developed using the framework. Supports OAuth2(is not supported on tv

sonson 236 Dec 28, 2022
Swifter - A Twitter framework for iOS & OS X written in Swift

Getting Started Installation If you're using Xcode 6 and above, Swifter can be installed by simply dragging the Swifter Xcode project into your own pr

Matt Donnelly 2.4k Dec 26, 2022
Instagram API client written in Swift

SwiftInstagram is a wrapper for the Instagram API written in Swift. It allows you to authenticate users and request data from Instagram effortlessly.

Ander Goig 580 Nov 25, 2022
Swift client for Kubernetes

Table of contents Overview Compatibility Matrix Examples Usage Creating a client Configuring a client Client authentication Client DSL Advanced usage

Swiftkube 94 Dec 14, 2022
Instagram Private API Swift

SwiftyInsta Please notice SwiftyInsta may not be actively maintained at the moment of you reading this note. Refer to #244 for more info. Instagram of

Mahdi Makhdumi 218 Jan 5, 2023
SDK for creating Telegram Bots in Swift.

Chat • Changelog • Prerequisites • Getting started • Creating a new bot • Generating Xcode project • API overview • Debugging notes • Examples • Docum

Rapier 349 Dec 20, 2022
Telegram Bot Framework written in Swift 5.1 with SwiftNIO network framework

Telegrammer is open-source framework for Telegram Bots developers. It was built on top of Apple/SwiftNIO

Pataridze Givi 279 Jan 4, 2023
A Swift client for the OpenAI API.

OpenAI A Swift client for the OpenAI API. Requirements Swift 5.3+ An OpenAI API Key Example Usage Completions import OpenAI

Mattt 161 Dec 26, 2022
Swift Bot with Vapor for Telegram Bot Api

Telegram Vapor Bot Please support Swift Telegram Vapor Bot Lib development by giving a ⭐️ Telegram Bot based on Swift Vapor. Swift Server Side Communi

OleG. 104 Jan 6, 2023
Fetch Multiple Rest API using Swift 5.5 Async Await with Task, TaskGroup, Continuation API

Source code for Tutorial on experimenting with Swift Async Await to fetch multiple REST API endpoints and eliminate Pyramid of Doom callback hell to improve code readability and maintanability

Alfian Losari 14 Dec 7, 2022
QuoteKit is a Swift framework to use the free APIs provided by Quotable created by Luke Peavey.

QuoteKit The QuoteKit is a Swift framework to use the free APIs provided by Quotable created by Luke Peavey.

Rudrank Riyam 17 Jun 23, 2022
Cross-Platform, Protocol-Oriented Programming base library to complement the Swift Standard Library. (Pure Swift, Supports Linux)

SwiftFoundation Cross-Platform, Protocol-Oriented Programming base library to complement the Swift Standard Library. Goals Provide a cross-platform in

null 620 Oct 11, 2022
A resource based, protocol oriented networking library designed for pure-SwiftUI applications.

Monarch ?? - WIP A resource based, protocol oriented networking library designed for pure-SwiftUI applications. Features: Async/Await Resource Based P

Emilio Pelaez Romero 4 Oct 17, 2022
KHabit an open source, pure and minimalistic app which helps you maintain productive habits, and nothing more.

an open source, pure and minimalistic app which helps you maintain productive habits, and nothing more. The app is completely open source, it does not contain in-app or ads, and does not track the user in any way.

Stefano Bertoli 42 Dec 17, 2022
an open source, pure and minimalistic app which helps you maintain productive habits, and nothing more.

KHabit an open source, pure and minimalistic app which helps you maintain productive habits, and nothing more. The app is completely open source, it d

Stefano Bertoli 17 May 5, 2021
A type-safe, protocol-based, pure Swift database offering effortless persistence of any object

There are many libraries out there that aims to help developers easily create and use SQLite databases. Unfortunately developers still have to get bogged down in simple tasks such as writing table definitions and SQL queries. SwiftyDB automatically handles everything you don't want to spend your time doing.

Øyvind Grimnes 489 Sep 9, 2022