Kaptos - Kotlin SDK
Kaptos is a Kotlin Multiplatform SDK for interacting with the Aptos blockchain across various platforms. It offers a consistent API for data requests, transaction submissions, and more, facilitating cross-platform app development with shared business logic. The SDK includes asynchronous Aptos clients for smooth blockchain interactions.
Kaptos also provides platform-specific SDKs for JVM, Android, iOS, JS, Linux, macOS, and Windows.
Features
Section titled “Features”- Type-safe: The SDK is fully type-safe and provides a rich set of types for all operations.
- Expressive: Kaptos provides a simple and expressive DSL-style API for building transactions.
- Multiplatform: Write cross-platform applications with shared business logic.
- Consistent API: All operations bare a uniform and consistent API across all platforms.
- BCS Support: The SDK defaults to BCS for serialization and deserialization of transactions.
- Asynchronous: All blockchain operations are asynchronous.
- Configurable: The SDK provides highly configurable clients for all platforms.
Installation
Section titled “Installation”commonMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos:<version>")}jvmMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-jvm:<version>")}androidMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-android:<version>")}The SDK is compatible with iosArm64, iosX64, and iosSimulatorArm64. Depending on how your project is configured, you can add the following dependencies:
For iosArm64:
iosMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-iosArm64:<version>")}For iosX64:
iosMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-iosX64:<version>")}jsMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-js:<version>")}The SDK only supports Linux x64. To add the dependency, use the following:
linuxMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-linux:<version>")}The SDK only supports macOS x64, macOS arm64, and macOS arm64 simulator. To add the dependency, use the following:
For macOS x64:
macosMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-macosX64:<version>")}For macOS arm64:
macosMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-macosArm64:<version>")}The SDK only supports Windows x64. To add the dependency, use the following:
mingwMain.dependencies {  implementation("xyz.mcxross.kaptos:kaptos-mingwX64:<version>")}Perform a Transaction
Section titled “Perform a Transaction”Below is an example of how you can perform a transaction using the Kotlin SDK. The snippet demonstrates how to build a transaction to transfer APT. We then sign and submit the transaction to the blockchain in a single step.
58 collapsed lines
/* * Copyright 2024 McXross * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package xyz.mcxross.kaptos.sample
import xyz.mcxross.kaptos.Aptosimport xyz.mcxross.kaptos.account.Accountimport xyz.mcxross.kaptos.model.*import xyz.mcxross.kaptos.util.runBlocking
const val FUNDING_AMOUNT = 100_000_000Lconst val SEND_AMOUNT_APT = 0.5fconst val UNIT_CONVERSION = 100_000_000const val SEND_AMOUNT_UNITS = (SEND_AMOUNT_APT * UNIT_CONVERSION)const val SEND_AMOUNT = 1_000_000UL
/** * This example demonstrates how to transfer APT from one account to another. * * Each run generates and creates new accounts on-chain using faucet funding. After funding, the APT * balance of each account is printed; if funding fails, an error is thrown. * * Next, a transaction is constructed to send 0.5 APT from Alice to Bob. The transaction is then * signed and submitted using the one-step `signAndSubmitTransaction` method. We wait for the * transaction to complete and print the updated balances of Alice and Bob. If the transaction * fails, an error is thrown. */fun main() = runBlocking {  val aptos = Aptos(AptosConfig(AptosSettings(network = Network.TESTNET)))
  println("Generating Alice and Bob's accounts")
  val alice = Account.generate()  val bob = Account.generate()
  aptos.fundAccount(alice.accountAddress, FUNDING_AMOUNT).expect("Failed to fund Alice's account")  aptos.fundAccount(bob.accountAddress, FUNDING_AMOUNT).expect("Failed to fund Bob's account")
  println("Created accounts on chain")  println("Alice's balance: ${aptos.getAccountAPTAmount(alice.accountAddress)}")  println("Bob's balance: ${aptos.getAccountAPTAmount(bob.accountAddress)}")  println("=============================================")  println(    "Building transaction to send ${SEND_AMOUNT / 100_000_000u} APT to Bob: ${bob.accountAddress}"  )
  val txn =    aptos.buildTransaction.simple(      sender = alice.accountAddress,      data =        entryFunctionData {          function = "0x1::coin::transfer"          typeArguments = typeArguments { +TypeTagStruct("0x1::aptos_coin::AptosCoin") }          functionArguments = functionArguments {            +bob.accountAddress            +U64(SEND_AMOUNT_UNITS.toULong())          }        },    )21 collapsed lines
  // Sign and submit the transaction  val commitedTransaction = aptos.signAndSubmitTransaction(alice, txn)
  val executedTransaction =    aptos.waitForTransaction(      HexInput.fromString(commitedTransaction.expect("Transaction failed").hash)    )
  println(    "Transaction wait response: $executedTransaction\n============================================="  )
  val aliceNewBalance =    aptos.getAccountAPTAmount(alice.accountAddress).expect("Alice's account does not exist")  val bobNewBalance =    aptos.getAccountAPTAmount(bob.accountAddress).expect("Bob's account does not exist")
  println("Alice's new balance: $aliceNewBalance")  println("Bob's new balance: $bobNewBalance")}The SDK also provides pre-built methods for common transaction operations. For
example, you can use the transferCoinTransaction method to generate a transfer
transaction between two accounts as shown below:
val txn = aptos.transferCoinTransaction(     alice.accountAddress,     bob.accountAddress,     SEND_AMOUNT   )You can then sign and submit this transaction.
Examples
Section titled “Examples”For more examples on how and what you can do with the Kotlin SDK, check out the following: