Only this pageAll pages
Powered by GitBook
1 of 59

Kima Network

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Benefits

Delegating your $KIMA tokens has multiple benefits. Most of these are related to enhancing network security, reducing operation complexity and increasing participation.

Enhanced Security

Delegation allows for a wider distribution of decision-making power and staking responsibilities, thus reducing centralization.

Reduced operation complexity

A delegator who may not have the required technical expertise or resources to run a validator node can still participate in staking. Additionally, the amount required to run a validator often exceeds the funds a typical user might hold.

Delegation also allows delegators to diversify their portfolios by designating some tokens for delegation while keeping others for active trading or investment.

Increased participation

Delegators can participate in network decisions without having to manage the technical aspects of voting or governance. They can rely on validators to handle these aspects while still staking their tokens to influence network decisions.

Become a Kima delegator

Welcome to the Delegation documentation section. This guide covers everything you need to know about delegating to a validator, including the benefits, technical workings, and step-by-step instructions.

Further reading

If you want to dive deeper, you can find more technical detail in the two papers that are linked below.

White Paper

Tech Paper

Upgrading

This section describes how to upgrade the SDK to the latest version. There are 2 components to upgrade:

  1. The frontend React Component: The Widget

  2. The backend API: The Transaction Backend

Generally speaking, the Widget and Backend should have the same major and minor versions- i.e. 1.4.x and 1.4.x. See the specific instructions for the version you are upgrading to. If you are upgrading more than one minor version at a time, see the instructions for each minor version for the extra steps.

How does it work?

Delegation is a process that facilitates efficient governance, consensus and operational management in a blockchain.

A participant in the network - a delegator - assigns their voting rights, governance power, and/or staking responsibilities to another participant, referred to as the delegate. This is often a validator of the network.

Why choose to delegate?

This process allows every token holder to participate in the staking process without running their own validator. The validator receives yields from the staking process for validating transactions directly. Then the validator shares a portion of the corresponding rewards with each delegator while taking a percentage of the rewards for being the delegate. Each validator can adjust the commission percentage to incentivize more participants to become delegators.

In Kima, delegation locks the tokens for a period of time. This prevents misuse of the delegation and instant withdrawals after receiving rewards or participating in network decisions.

Legal

Please read the terms and conditions, privacy policy and disclaimer.

Kima Block Explorer

Transparency is one of the key features of public blockchain technology, and block explorers such as Etherscan provide users with an assurance that their transactions are being processed in a timely manner, as well as providing various other insights.

Kima's block explorer for Sardis Testnet is an essential dashboard showing key facts about the state of the network, including transaction history.

If you are developing on Sardis Testnet, this is where you will be able to monitor your transactions:

https://explorer.sardis.kima.network/

Try Kima with the Demo App

The Kima demo app serves two purposes:

  • to showcase payments and bridging using Kima

  • to illustrate the look and feel of the Kima front-end widget

The Kima Demo supports the following testnets:

  • Ethereum Sepolia (*)

  • Polygon Amoy (*)

  • Avalanche Fuji

  • Tron Nile Testnet

  • Optimism (Sepolia)

  • Arbitrum (Sepolia)

  • Binance Smart Chain Testnet (aka BNB Testnet)

  • Base Sepolia

  • Berachain Bepolia

  • Solana Devnet

(*) Not available in light mode

To enable a smooth experience and a 360-degree overview of what is happening, we also provide a and a .

Kima governance

The Kima Network has an on-chain governance mechanism for signaling (text proposals), changing parameters and allocating funds from the community pool.

Community​

Kima governance is driven by the Kima community. Proposals can be followed here.

The Kima SDK

Because the Kima blockchain is a public network, you can interact with it however you see fit. You can choose to become a validator, if you want - see Becoming a Validator for more details - or you can build a variety of applications on top of it.

To make developing on top of Kima simpler, we have created a toolkit - the Kima Software Development Kit (SDK).

We provide:

  • a standalone server that you can run locally and use as middleware that sits between the front end of your dApp and the Kima blockchain, submitting requests and returning the response to the front end

  • a front-end widget with different configuration options that you can easily integrate into your dApp

Of course, the open ethos of Web3 means that you can develop your own solutions from scratch, but we strongly recommend building with both front end and back end components of our SDK so you can leverage the efforts our development team have made on your behalf.

There is an extra step that may be required in some test environments if you are using Kima's tools to transfer to or from Solana wallets. In those environments, the recipient wallet may need to be "primed" by receiving a small amount of USDK before transfers or payments via Kima can take place.

The Kima Transaction Widget

The Kima Transaction Widget is a ready made React component that allows users to transfer like assets between chains using the Kima protocol. Combined with the Kima Transaction Backend, it is the quickest way to integrate Kima into your dApp.

The Kima Transaction Widget supports 3 modes:

  1. Payment

  2. Bridge

  3. Status

Become a Kima validator

The Kima blockchain relies on a network of validator nodes for its security and consensus. KIMA tokens are distributed to validators as an incentive for their participation in the network.

You can read more about both Kima's incentive model and its innovative security architecture in the

Two areas of Kima's security architecture stand out:

  • Threshold signature schemes (TSSs) allow a group of participants (“cosigners”) to securely generate and control the secret signing key for a digital signature scheme, such that a certain threshold (e.g. 2-out-of-3 or 7-out-of-10) cosigners must participate in, and agree upon, the signing protocol in order to generate a signature.

  • To further complement security, Kima wardens run the threshold signature scheme inside an SGX enclave, thus the TSS key-shares are not directly accessible to the wardens or their system administrators.

The Kima Advanced Demo App

The Kima Demo is a reference implementation to help people understand how Kima works.

You will need to have a wallet installed and to have some USDK (Kima's US dollar stablecoin) in your wallet on the testnet you want to use. This page explains how to do this. Remember that you will also need a small amount of the native token for the testnet you are sending funds from so you can pay for gas (for example, you will need Sepolia ETH if you want to send from Etherum's Sepolia testnet).

The demo showcases the following scenario:

  • bridge between different chains (transfer to the same or a different address on different chains). Example: a user has funds on Avalanche but wants to add liquidity to a liquidity pool on Ethereum.

This demo allows us to send funds to our own or a different wallet address on a network of our choice. Here we are sending USDK from Arbitrum's Sepolia testnet to Avalanche's Fuji testnet.

On-chain proposal

The following are parameters that are currently present in the governance process:

  • Minimum deposit: 10,000 KIMA

  • Maximum deposit period: 14 days

  • Voting period: 7 days

Bridge Mode

mode = ModeOptions.bridge

Bridge mode allows your users to transfer similar assets between any chain supported by Kima. I.e. USDC on Arbitrum to USDT on Avalanche.

On testnet it should look something like this. The test tokens are called USDK and can be obtained from the .

The transfer details will show on the next step, along with the fee options available. The confirmation step will also request user approval on the final transfer amount.

The transaction status will be displayed on the next step when the user approves the transfer amount and submits the transaction.

For more details on how to get transaction status of a previous transaction, check the .

The Kima Light Demo App

The Kima Light Demo is a reference implementation to help people understand how Kima works.

You can experience Kima's functionality directly in your browser, without needing to install or connect a wallet because the Light Demo App has been pre-configured to send funds between two accounts under the control of the Kima team.

The demo showcases bridging between different chains (transfer to the same address on different chains). Example: a user has funds on Arbitrum but wants to add liquidity to a liquidity pool on Avalanche.

Use the dropdown to choose the network from which you want to send funds. A demo wallet address will be automatically assigned for that network.

Use the second dropdown to choose the destination network. Another demo wallet will be auto-selected to receive the funds.

Type the amount of USDK you want to transfer.

Installation

Add the widget to your React project using npm or your favorite JavaScript package manager.

You'll need to add the following:

  • The <KimaProvider> component in App.tsx

  • The <KimaTransactionWidget>

Appendix

To quickly connect to the Kima testnet, you can use managed services like Infura, Alchemy, QuickNode, or Ankr. These services simplify blockchain infrastructure by providing RPC endpoints you can access with API keys.

Here’s how to create API keys for each service:

When selecting networks ensure you select the Kima-supported networks (see the ).

Infura

Visit the and create an account. Follow the prompts to create an API key.

Alchemy

Sign up at Alchemy's website. Navigate to the dashboard and select Apps in the left-hand menu. Create a new App, selecting the network(s) you need. Once saved, your API key will be displayed at the top right of the page.

QuickNode

Sign up at

References

Benefits

Kima offers significant incentives for liquidity providers, whether they participate passively or actively. By joining our liquidity pool system, providers can maximize their returns and help secure cross chain liquidity, benefiting from Kima’s efficient and secure network.

Liquidity providers earn a portion of the network transaction fees. For every transaction processed through the liquidity pool, a small fee (0.05% of the transaction amount) is distributed to liquidity providers. Example: For every $1 million in daily transaction volume, liquidity providers earn $500 in network fees per day, or $182,500 annually. Passive liquidity providers, in this case, would receive half of that amount ($91,250/year).

Kima is designed to achieve high capital efficiency, meaning liquidity providers can earn more returns with less liquidity.

Kima’s liquidity pools span multiple blockchain networks, offering liquidity providers access to a broad range of opportunities. By providing liquidity across Ethereum, Polygon, Optimism, and other networks, providers can participate in various ecosystems while enjoying the benefits of Kima’s seamless cross-chain infrastructure.

Kima Finance leverages Trusted Execution Environments (TEEs) and a Threshold Signature Scheme (TSS) to ensure that all liquidity provider operations are secure and private. These advanced security mechanisms protect liquidity providers' assets while enabling the system to function at optimal performance.

What is Kima?

Kima is the world’s first infrastructure-agnostic money transfer protocol. The Kima platform is comprised of a blockchain and a toolkit that allows the seamless transfer of assets between different protocols and platforms.

Blockchains are siloed. Web3 apps built within those ecosystems are constrained by their on-chain liquidity. Many solutions developed for these challenges, known as bridges, suffer from flaws and vulnerabilities: security, user experience, complexity, and poor capital efficiency.

Kima addresses these challenges in a unique way, by creating a Web3 settlement layer which enables interchain transactions. This approach allows liquidity to be transferred between chains in a safe, secure, and cost-effective manner, enabling a reliable omnichain solution.

Security: Kima achieves unique security by eliminating all known attack vectors (no smart contracts, no oracles, no external relayers) and adding multiple layers of security (e.g., using a Trusted Execution Environment with Intel SGX and decoupled validation). The protocol uses game theory and financial incentives to maintain liquidity equilibrium and maximize capital efficiency.

Infrastructure: Kima simplifies and accelerates the creation of secure Omnichain applications, tackling interoperability problems without causing additional liquidity fragmentation. It provides a mechanism for users to perform cross-chain atomic swaps without token-wrapping.

The Kima blockchain, built using the Cosmos SDK, employs a committee-based consensus. "Wardens" in a rotating committee ensure asset pool synchronization and authorize withdrawals based on corresponding deposits. This structure uses Threshold Signature Schemes (TSS) and operates within a Trusted Execution Environment for enhanced security.

Adding Kima to your wallet

  1. If you haven't already,

  2. Open Keplr, click the hamburger menu, and select "Add more chains" at the bottom (alternatively, you can browse to )

  3. Connect your Keplr wallet

Supported blockchains

During the initial release period of Kima, the only supported assets will be USDC and USDT on EVM, Tron and Solana. More assets and blockchains will be added in later releases. Assets marked “optional” will be added on demand.

Network
Supported Assets

Become a liquidity provider

This guide will help you learn how to provide liquidity for the Kima protocol.

  • Understand the Benefits: Start by reviewing the section to learn about the incentives, rewards, and advantages of providing liquidity for Kima.

  • Review Supported Assets and Networks: Before proceeding, familiarize yourself with the section to understand which assets and networks are currently supported by Kima.

Troubleshooting

faucet
block explorer

For this reason, would-be validators need to ensure that they either have access to a machine that is compliant with the relevant SGX requirements, either by:

  • Owning the relevant hardware

  • Running their node on Azure

  • Other enclave technologies such as AMD SEV-SNP may be supported in the future. Please contact us if you are interested in other enclave architectures.

Read the validator requirements page for more details.

If you have questions about setup, or would prefer to be guided through the process, get in touch here.

White Paper
Kima Finance’s liquidity pool system is designed to be efficient, secure, and flexible. Liquidity providers can benefit from participating in cross-chain pools, earning rewards through network fees and bounties. For more information on becoming a liquidity provider, refer to the Deposit assets in Kima pools section.

Earn Network Fees

Capital Efficiency

Cross-chain Liquidity

Security

Conclusion

Set Up Your Environment: Follow the Prepare to provide liquidity section to set up your wallets and networks to interact with Kima.
  • Deposit Liquidity: Once set up, head to the Deposit assets in Kima pools section to start adding liquidity, and earning rewards.

  • Monitor and Withdraw: Manage and withdraw your liquidity by following the steps in the Withdraw assets from Kima section.

  • Please ensure you read the disclaimer.

    Overview

    Getting Started

    Benefits of becoming a Liquidity Provider
    Supported assets and networks

    USDC, USDT

    Solana

    SDC, USDT, (optional: WBTC)

    Polygon

    USDC, USDT, (optional: WBTC)

    Avalanche C

    USDC, USDT, (optional: WBTC)

    Optimism

    USDC, USDT, (optional: WBTC)

    Tron

    USDT

    Arbitrum (One)

    USDC (optional: WBTC)

    Ethereum

    USDC, USDT, WBTC

    BNBChain

    In Payment Mode, the user can send funds from any chain supported by Kima to the specified payment address and chain. See the Payment Mode section for more information.

    I.e. Pay 12.34 USDC from Polygon or Solana

    In Bridge Mode, the user is able to send funds to and from any chain supported by Kima. See the Bridge Mode section for more information.

    I.e. Send 12.34 USDT on BSC and receive USDC on Arbitrum

    Status Mode displays the progress of an existing transaction. See the Status Mode section for more information.

    Modes

    Payment

    Bridge

    Status

    Quorum: 33.40% of participating voting power

  • Pass threshold: 50% of participating voting power

  • Veto threshold: 33.40% of participating voting power

  • The deposit period lasts 14 days.

    Before a governance proposal enters the voting period (i.e., for the proposal to be voted upon), there must be at least a minimum number of KIMA deposited (10,000). Anyone may contribute to this deposit, though it is usually filled by the proposal maker. Deposits of passed and failed proposals are returned to the contributors.

    Deposits are burned only when proposals are vetoed. Deposits are not burned for failing to meet quorum or for being rejected.

    The voting period is currently a fixed 7 day period. During the voting period, participants may select a vote of either 'Yes', 'No', 'Abstain', or 'NoWithVeto'. Voters may change their vote at any time before the voting period ends.

    • Abstain: The voter wishes to contribute to quorum without voting for or against a proposal.

    • Yes: Approval of the proposal in its current form.

    • No: Disapproval of the proposal in its current form.

    • NoWithVeto: NoWithVeto is a mechanism that allows voters to indicate that they strongly disagree with a proposal or if a proposal is identified to be spam. If more than 1/3 of voters cast a NoWithVeto vote, the proposal is rejected.

    Voting 'NoWithVeto' has no immediate additional financial cost to the voter - you do not directly risk your KIMA by using this option.

    There are four criteria:

    1. Deposit is filled: A minimum deposit of 10,000 KIMA is required for the proposal to enter the voting period

    • anyone may contribute to this deposit

    • the deposit must be reached within 14 days (this is the deposit period)

    1. Quorum is reached: A minimum of 33.40% of the network's total voting power (staked KIMA) is required to participate

    2. Simple majority of 'Yes' votes: Greater than 50% of the participating voting power must back the 'Yes' vote by the end of the 7 day voting period

    3. Not vetoed: Less than 33.4% of participating voting power must have backed 'NoWithVeto' by the end of the 7 day voting period

    Currently, the criteria for submitting and passing/failing all proposal types is the same.

    Governance parameters​

    Deposit period​

    Burned deposits​

    Voting period​

    What do the voting options mean?​

    What determines whether or not a governance proposal passes?​

    Kima maintains liquidity pools on each integrated layer-1 blockchain (e.g., Ethereum, Polygon, Solana) and synchronizes assets across these platforms without creating synthetic ("wrapped") tokens.

    Permissioned Layer: Includes validators known for reliability (e.g., funds, banks, organizations). Permissionless Layer: Allows anyone with sufficient stake to become a block producer and warden, facilitating regular changes in the warden set.

    The two-layer consensus mechanism ensures stability, security, and decentralization, with four main goals:

    • Manage and update the warden set.

    • Execute platform governance (e.g., selecting blockchains and tokens, setting fees).

    • Create an auditable record for accountability. -Enable cross-chain messaging for interacting with contracts across blockchains.

    When users request cross-chain transfers, the warden committee is responsible for:

    • Recording the request and monitoring the deposit on the source chain.

    • Completing a threshold signature to release funds on the destination chain.

    • Recording the finalized process, providing an auditable record of validator actions.

    This architecture, proven in other Cosmos SDK-built systems, ensures a secure, decentralized, and efficient cross-chain transfer system.

    To read a more detailed account of Kima's architecture and approach, read the White Paper.

    This documentation shows how to:

    • Use Kima as an end user

    • Become a validator for the Kima blockchain

    • Leverage Kima's SDK to effortlessly integrate all Kima's functionality into your application

    Challenges in Blockchain Interoperability

    How Kima Solves These Challenges

    Key Concepts of Kima

    Kima's Blockchain Architecture

    Liquidity Management

    Permission Layers

    Consensus and Goals

    Cross-Chain Transfers

    How can you participate?

    . After logging in, create your first endpoint by following the on-screen instructions.

    Ankr

    Visit Ankr's website . In the top navigation menu, click on Products and select Web3 API. Set up an account, then navigate to the endpoint creation page to configure your API.

    How to configure access to blockchain networks with a managed service

    official documentation for the list
    Infura website
    QuickNode's website
    Kima faucet
    Widget Status Mode Section

    Genesis File Governance Parameters

    which interacts with Kima
  • A link to the Kima Transaction Backend (or build your own)

  • A Reown project id

  • For the purposes of this example, we'll just add the widget to App.tsx, but it can go anywhere it makes sense for your project.

    Open App.tsx, wrap your existing components with the <KimaProvider> and add the <KimaTransactionWidget> component.

    If you don't have one already, you'll need to get a free Reown project ID from Reown Cloud and pass it to the projectId prop on <KimaProvider>.

    The widget detects the active environment from your backend /chains/env endpoint, so you do not need to pass a networkOption prop manually.

    In the following sections, we'll go through the framework-specific configuration for Vanilla React and NextJS.

    npm install @kimafinance/kima-transaction-widget redux react-redux pino-pretty
    const App = () => {
      return (
        <KimaProvider 
          projectId='your-project-id'
          kimaBackendUrl="http://localhost:4000">
            <KimaTransactionWidget
              theme={{ colorMode: ColorModeOptions.light }}
              mode={ModeOptions.bridge}
            />
        </KimaProvider>
      );
    };
    "gov": {
          "starting_proposal_id": "1",
          "deposits": [],
          "votes": [],
          "proposals": [],
          "deposit_params": {
            "min_deposit": [
              {
                "denom": "uKIMA",
                "amount": "100000000000"
              }
            ]
          },
          "voting_params": null,
          "tally_params": null,
          "params": {
            "min_deposit": [
              {
                "denom": "uKIMA",
                "amount": "10000000"
              }
            ],
            "max_deposit_period": "300s",
            "voting_period": "200s",
            "quorum": "0.334000000000000000",
            "threshold": "0.500000000000000000",
            "veto_threshold": "0.334000000000000000",
            "min_initial_deposit_ratio": "0.000000000000000000",
            "burn_vote_quorum": false,
            "burn_proposal_deposit_prevote": false,
            "burn_vote_veto": true
          }
        },
    import React from 'react'
    
    import {
      KimaTransactionWidget,
      KimaProvider,
      ModeOptions,
      ColorModeOptions
    } from '@kimafinance/kima-transaction-widget'
    import '@kimafinance/kima-transaction-widget/index.css'
    
    const App = () => {
      return (
        <KimaProvider
          projectId='your-project-id'
          kimaBackendUrl='http://localhost:4000'
        >
          <KimaTransactionWidget
            theme={{ colorMode: ColorModeOptions.light }}
            mode={ModeOptions.bridge}
          />
        </KimaProvider>
      )
    }
    
    export default App
    First, we connect our wallet, ensuring we are on the network from which we wish to send funds.

    The widget pre-fills the target address field with the same wallet address we are sending from (if both network addresses are the same type), but this can be changed to a different address if desired.

    We approve the transaction in our wallet...

    ... and then in the next step submit it.

    We can follow the transaction status in the next screen, and check completion in each network explorer by selecting the corresponding transaction hashes.

    If we wish, we can also retrieve the proper transaction id to follow the status of the transaction later.

    Once the transaction is found, the status will be displayed with its corresponding state and transfers.

    Bridging

    A summary screen shows:

    • Source and target chains

    • Wallet addresses

    • Transfer amount

    • Network and liquidity fees

    Review everything, then submit the transaction.

    Once you have submitted the transaction, you can watch it complete in real-time by clicking the transaction links to the relevant block explorers involved in the transfer.

    Try the light demo

    Select Source Network

    Select Target Network

    Enter Amount

    Confirm Details

    Filter to "Kima" and add Kima Mainnet (and Testnet) - this adds the 2 blockchains to your wallet
  • In your Keplr wallet, click the hamburger menu, select "Manage Chain Visibility" and make one, or both blockchains visible

  • If you have any tokens on any of the blockchains, they will now become visible

  • Here's a video demonstrating the full process:

    download and install Keplr wallet in your browser
    https://chains.keplr.app

    Withdraw liquidity

    To withdraw an asset on any blockchain in the Kima Finance protocol,follow these steps:

    Step 0: Ensure Liquidity Balance

    Before withdrawing liquidity, make sure:

    • You have assets available for withdrawal.

    • You have at least 0.2 Kima tokens in your Keplr wallet.

    Step 1: Select the amount and network

    Choose the amount you would like to withdraw.

    Select the network from which you want to withdraw.

    Once you have set the amount and network, click Withdraw to remove liquidity from the chosen pool.

    Upon clicking Withdraw, a New Transfer window will appear. In this window:

    Connect your wallet if it is not already connected.

    Review the transaction details, including the source network, wallet address, and withdrawal amount.

    After reviewing the transaction details, click Next to move to the confirmation step.

    In this step, you'll need to approve the transaction, which allows the transfer of the liquidity from the pool you selected to your wallet.

    Click Approve to proceed with the transaction.

    For all transactions on the Kima Finance network, you will be asked to make two approvals through your Keplr wallet.

    Important: You may have to wait a few seconds for the second approval request to appear. If the Keplr wallet does not automatically launch, open it manually to see the pending approval requests.

    Once you’ve signed and approved both requests, the transaction process will begin.

    Once the transaction reaches 100% completion, your asset’s liquidity will be withdrawn from the pool to your wallet.

    You can verify your current liquidity assets still deposited with Kima.

    Supported blockchains

    Kima supports a variety of EVM-compatible Layer 1 and Layer 2 chains, as well as Solana, and will ultimately allow the swift and secure transfer of value between the following blockchains:

    Chain
    Short Name
    Chain ID

    Arbitrum

    ARB

    The short names are used in various API queries. Most are shared across mainnet and testnet, while some can be environment-specific. For a full environment-wide chain inventory, use get_chains. For route-specific destinations from a given origin chain, use get_available_chains/{originChain}. Click on the chain ID link to visit Chainlist.org and add the chain to your wallet.

    ℹ️ Credit Cards and Bank Accounts are currently supported as the origin network- off ramping to come in a future release. ℹ️ In backend request payloads, FIAT rails may be represented as CC and BANK, then normalized to FIAT before submission. ℹ️ Documentation uses Berachain and Berachain Bepolia as display names. API responses may use Bera or Berachain, while the stable short name remains BERA.

    Kima is currently available on the following testnets, which can be used for development and/or testing in the Kima Demo App:

    Chain
    Short Name
    Chain ID

    Use get_chains if you want the full list of chains available in a given environment:

    • Mainnet: https://api.kima.network/kima-finance/kima-blockchain/chains/get_chains

    • Testnet: https://api.sardis.kima.network/kima-finance/kima-blockchain/chains/get_chains

    Response:

    • Chains: string[]: the list of supported chain short names for that environment

    Use get_available_chains/{originChain} if you want the set of destination chains available from a specific origin chain:

    • Mainnet: https://api.kima.network/kima-finance/kima-blockchain/chains/get_available_chains/{originChain}

    • Testnet: https://api.sardis.kima.network/kima-finance/kima-blockchain/chains/get_available_chains/{originChain}

    Params

    • originChain (string): the starting chain short name (see above)

    Response

    • Chains: string[]: the list of chain short names which can be bridged to from the origin chain

    The example above reflects a mainnet query using originChain=ETH on March 10, 2026.

    Kima Faucets

    Kima Faucets

    Kima has two testnet faucets: one for the native KIMA token and one for the Kima stablecoin, USDK. You will need KIMA tokens for development purposes. You will need testnet USDK to interact with the Kima platform on whatever testnets you are developing on, and also if you would like to use the Kima Advanced Demo App. The faucet will give out 100 USDK daily per wallet address. Note that these are testnet tokens only and have no financial value or benefit

    Instructions for USDK faucet - EVM chains

    1. You will first need to have an EVM-compatible wallet installed in your browser, such as MetaMask or Rainbow, if you do not already have one installed. Note that Kima does not endorse, recommend or guarantee any specific wallet. Follow the installation instructions and ensure that you keep your seed phrase safe.

    2. Visit the faucet site.

    3. Select the network you want to send funds from, whether this is for payment or bridging.

    1. Connect your wallet by clicking the Connect button.

    2. Your screen should now look like the screenshot below. Go ahead and click the Get Free 100 USDK button.

    Note that in order to send funds from a particular network, you will also need a small amount of that network's native token in order to pay for gas costs.

    So, for example, to bridge or pay from Ethereum's Sepolia network, you will need a small amount of Sepolia ETH, which can be acquired from any Sepolia faucet.

    To acquire testnet USDK on Solana or Tron, the process is broadly the same but you will need to use a wallet that is compatible with these chains.

    While we at Kima do not endorse or guarantee any particular wallet, we note that Phantom is a popular choice for interacting with Solana and TronLink is a popular choice for Tron, so we will demo the use of these two wallets in obtaining testnet USDK.

    You will need to manually switch your wallet to use Solana's Devnet. Solana faucet

    From here, you can connect your wallet and request tokens as described in steps 4 to 6 above.

    Again, you will need to manually switch your network in your TronLink wallet to use the Nile testnet. You can do this by clicking on the down arrow in the middle of the top navigation bar where the current network is displayed, as shown in the image below. Tron faucet

    From here, you can connect your wallet and request tokens as described in steps 4 to 6 above.

    1. You will first need to have a wallet installed that is designed to interact with the Cosmos ecosystem, such as Keplr.

    2. Visit the .

    3. Connect your wallet by clicking the Connect button.

    1. Go ahead and click the Get Free 10 KIMA button.

    1. The request will be processed and your tokens will arrive once its the transaction succeeds. You can also check the transaction details in the explorer.

    REMINDER: you can send tokens request only once per 24 hours.

    Supported fiat currencies and payment methods

    ℹ️ Kima is constantly updating the available payment and settlement methods, currencies, and supported countries - stay tuned.

    Fiat support

    Kima manages several fiat pools as regulated bank accounts that can only be accessed following blockchain consensus, and TSS signature - just like the Kima crypto pools. This allows Kima to receive, and emit fiat payments.

    Kima intends to offer the following settlement methods in the future:

    • Pay-in/Fiat on-ramp - pay with fiat, receive crypto

    • Pay-out/Fiat off-ramp - pay with crypto, receive fiat

    • Exchange/Fiat FX - pay with one fiat currency, receive another

    ℹ️ Currently, Kima supports Pay-in/on-ramp settlements.

    ℹ️ Currently, Kima supports credit cards, and bank accounts in Europe using SEPA and SWIFT. Additional payment methods coming soon.

    • US Dollar

    • EURO

    ℹ️ Other currencies coming soon.

    Any credit card payment originating in the following countries will be blocked:

    • Belarus

    • Cuba

    • Iran

    • Myanmar

    ℹ️ Support for U.S. and its territories coming soon.

    The following credit cards are currently not accepted:

    • American Express

    ℹ️ Support for additional credit cards coming soon.

    Status Mode

    mode = ModeOptions.status

    Status mode displays the progress of a transaction that has already been submitted to Kima. This is useful if the normal flow was interrupted and the status needs to be displayed again. Usually the transaction status view will display automatically after the user approves and submits the transaction.

    ⚠️ txId is the transaction id returned from /submit/transfer or /submit/swap - not the transaction hash. I.e 22843

    const App = () => {
      return (
         <KimaProvider
          projectId='your-project-id'
          kimaBackendUrl="http://localhost:4000"
        >
          <KimaTransactionWidget
            theme={{ colorMode: ColorModeOptions.dark }}
            mode={ModeOptions.status}
            txId={22843}
          />
        </KimaProvider>
      );
    };

    You would see a page that looks like this:

    If you want to allow users to get a previous transaction from the UI, you must not provide the txId prop to the KimaTransactionWidget component. This will display the transaction search form.

    If the transaction id is valid, and the transaction is found, the corresponding progress of the transaction will be displayed.

    Kima Use Cases for Developers

    Kima Use Cases for Developers

    As a developer, what can you build with Kima? In order to onboard more users to Web3, we need to simplify the user experience, which means helping them avoid complicated procedures on bridging applications that may or may not be safe to use.

    Integrating with Kima's SDK or front-end widget removes the need for your users to leave your dApp and enables them to effortlessly switch funds between networks with the click of a button.

    You could think about using Kima for:

    Decentralized Exchanges (DEX)

    A quick glance at DeFi Llama shows that Ethereum's share of TVL is dropping as DEXs choose to deploy on different networks. Allowing users to bridge funds via a plugin on your own website provides them with a seamless user experience, whichever chain they want to use.

    eCommerce and Gaming

    In-game payments can slow down the user experience and add unwanted friction. If your users also have to bridge their funds between chains, this can introduce frustration and boredom that may lead to them abandoning your game completely. Kima's smooth, intuitive transactions will mean your users barely notice them.

    Similarly, buyers on eCommerce sites are more likely to proceed through the sales funnel if their experience is not impeded by having to visit a separate bridging application.

    NFT Marketplace

    NFT collectors are no longer limited to one or two chains, and some of the coolest up-and-coming collections can be found on minority chains where fees are cheaper and transactions are faster. Make your marketplace effortlessly multi-chain by integrating Kima.

    Wallet developers looking for an easy, intuitive way for their users to swap assets in-wallet need to look no further than Kima.

    Essentially, as the number of networks within the thriving Web3 ecosystem expands, the need for sending value securely and quickly from one chain to another has become a pressing need.

    Reclaim delegation

    If you are planning to undelegate for the purpose of switching validators, unstaking funds to use elsewhere, or just taking a break, follow the steps below. When you undelegate your tokens on the Kima network, they enter an Unbonding period of 21 days, which means they are locked until the period ends before being transferred back to your wallet. This ensures commitment to the KIMA network and prevent abuse and misuse of the delegation process.

    This guide assumes you have previously delegated tokens on Kima.

    Connect your wallet

    Go to the KIMA explorer and click the Connect Keplr button.

    Testnet explorer Mainnet explorer

    Approve the prompts.

    In the explorer, click the Overview tab in the left sidebar of the home screen.

    Scroll down until you can see the Delegations section. There, you should be able to see a summary of your delegated stake among the available validators.

    Look for the delegated stake that you plan to undelegate and click on the Undelegate button.

    Enter the amount of $KIMA you want to undelegate and click on Submit.

    You will be prompted to approve the transaction. To confirm, click on Approve.

    In the Delegations section, you should see that you no longer have any delegated stake. Your undelegated tokens will be in the Unbonding period.

    After this period, you will be able to view your tokens in your wallet.

    Preparations

    In this guide, you will learn how to set up a wallet and add funds to it. This process can vary depending on whether you're using the mainnet or testnet. We'll cover the following scenarios:

    • Setting up a wallet

    • Using a faucet (testnet only)

    Set up a wallet

    Choose a wallet

    Some wallet options are Keplr (recommended), Station and Leap.

    Install the wallet

    Then select your preferred browser/device. This guide shows the installation process using Google Chrome.

    Add the wallet as a Chrome extension. To minimize risk, always verify that the team behind the extension corresponds with the Keplr app.

    Click the Add to Chrome button and wait for the extension to open a new tab with the setup steps. Click the Create a new wallet button to begin the setup.

    This will prompt you to choose a wallet creation method.

    Read the security concerns about creating a new wallet using a recovery phrase carefully, and click 'I understood. Show my phrase.' Store that phrase in a secure place where only you can access it.

    Now enter the words requested from your recovery phrase, add a name and a password to your wallet, then click Next.

    Select the default networks and the setup will be completed.

    Note that this step applies to the testnet only.

    Kima has available faucets for both its native token ($KIMA) and the USDK stablecoin. To delegate on the testnet, you need to have $KIMA to execute the transaction and send the delegated amount.

    For further reference, please visit the documentation.)

    NextJS

    This guide uses the Next.js App Router pattern, which matches the maintained example in the widget repository. The widget must run on the client, so the widget component should be a client component and exported through dynamic(..., { ssr: false }).

    To create a new app, you can run npx create-next-app@latest <your-app-name>. Then install the Kima Widget and its peer dependencies.

    You'll need to add the following:

    • A client-side widget component

    Message Signing

    In order to submit a transaction to the Kima blockchain, the user must sign a message containing the transaction details. This message is signed by the user's wallet and then included in data submitted to the Kima Transaction Backend submit endpoints (/submit/transfer or /submit/swap).

    The Kima message is a string that is signed by the user's wallet. It contains the following information:

    • Authorization amount: in whole tokens i.e. 10.23 not 10230000

    Payment Mode

    mode = ModeOptions.payment

    Payment mode allows your users to pay for a product or service using stablecoins from any chain supported by Kima.

    • The payment details are passed into the Widget via the transactionOption prop (required)

    • The user can choose to pay from any and supported by Kima. The funds will be transferred to the wallet and chain specified in the transactionOption

    Privacy policy

    Welcome to Kima Foundation’s website (the “Site”). We are committed to protecting your privacy and ensuring that your personal data is handled in a safe and responsible manner. This Privacy Policy explains how we collect, use, disclose, and safeguard your personal data in compliance with Singapore’s Personal Data Protection Act 2012 (PDPA) and other applicable regulations.

    This Privacy Policy applies to all personal data collected by Kima Foundation through the Site, including any other digital platforms, tools, or services operated by us. By using our Site, you agree to the collection, use, and disclosure of your personal data as described in this Privacy Policy.

    We may collect personal data from you in the following ways:

    • Directly from You: When you register, subscribe to our newsletter, participate in surveys, or contact us through our Site.

    • Automatically: When you interact with our Site, we may collect data such as IP addresses, browser type, operating system, referring URLs, and usage patterns through cookies and other tracking technologies.

    v1.4.x

    • Support for credit cards as an origin network (onramping)- off ramping to come in a future release

    • Increased security by signing a message containing the transaction details

    • More accurate fee estimation. This endpont also returns the amounts used for the allowance and submtting the transaction.

    UPGRADING TO v1.4.x IS REQUIRED FOR ALL KIMA SDK USERS. These new features introduce breaking changes to how Kima tranasctions are submitted and processed. Once these features are live on mainnet, transactions sent using an older version of the SDK will be rejected by the chain.

    Bank Transfer Transactions

    Starting with version 1.5, Kima supports bank transfer transactions in the origin network (onramping)- off ramping to come in a future release. See for more information on how to upgrade your integration.

    Bank transfer transactions require the use of the . This is a frontend React component which handles integration with Kima and 3rd party components which handle KYC and payment processing.

    ℹ️ Check the list of

    The following steps outline the process of using the widget to buy stablecoins like EURC using a bank account.

    1. From the "Source Network" dropdown, select "Bank Transfer"

    Using the Kima SDK Without the Widget

    The Kima Widget serves as a reference implementation written in React. If your project uses another framework, or you want to make a custom component, it’s possible to interact with the Kima Transaction Backend directly. This page documents that backend-mediated integration path for crypto-origin and BTC-origin flows only. But:

    🚨 FIAT TRANSACTIONS ARE ONLY SUPPORTED USING THE WIDGET 🚨

    The frontend kima-transaction-widget is required for FIAT-origin flows such as credit-card and bank-transfer transactions because it handles KYC and interactions with 3rd party widgets.

    1. User selects the origin and target chains and amount.

    People's Republic of Korea
  • Russian Federation

  • Syrian Arab Republic

  • United States

  • U.S. Minor Outlying Islands

  • U.S. Virgin Islands

  • Payment methods

    Supported currencies

    Unsupported countries - credit cards

    Unsupported Credit Cards

    Wallet

    Instructions for USDK faucet - Solana and Tron

    USDK faucet - Solana

    USDK faucet - Tron

    Instructions for KIMA faucet

    faucet site

    Step 2: Initiate the withdrawal process

    Step 3: Confirm Transaction in the New Transfer Window

    Step 4: Approve the transaction

    Step 5: Sign approval requests in Keplr

    Step 6: Verify the Withdrawal

    Adding funds to your wallet

    Using a faucet

    Kima Faucets
  • Third Parties: We may receive personal data about you from third parties, such as social media platforms, if you use these services to interact with us.

    • Personal Identifiable Information (PII): Name, email address, contact number, and other details you provide.

    • Technical Data: IP address, browser type, device information, and log data.

    • Usage Data: Information about how you use our Site, including pages viewed and links clicked.

    We may use your personal data for the following purposes:

    • Service Delivery: To provide you with information, products, or services that you request from us.

    • Communication: To send you newsletters, updates, and other information related to our activities, events, or promotional offers.

    • Analytics: To monitor and analyze usage trends, user behavior, and Site performance to improve our services.

    • Compliance: To comply with legal obligations, resolve disputes, enforce our terms of service, and protect our rights.

    We may disclose your personal data to the following parties:

    • Service Providers: Third-party vendors that assist us in operating our Site, conducting our business, or providing services to you, subject to strict confidentiality agreements.

    • Legal Authorities: If required by law, or in response to valid requests by public authorities (e.g., a court or government agency).

    • Business Transfers: In connection with any merger, sale of assets, financing, or acquisition of all or a portion of our business by another entity.

    We take reasonable steps to protect your personal data from unauthorized access, use, disclosure, alteration, or destruction. Our security measures include encryption, firewalls, secure access controls, and regular security assessments.

    We will retain your personal data only for as long as it is necessary to fulfill the purposes for which it was collected, or as required by law. Once the data is no longer needed, we will securely delete or anonymize it.

    Under the PDPA, you have the right to:

    • Access: Request access to the personal data we hold about you.

    • Correction: Request corrections to any inaccurate or incomplete personal data.

    • Withdrawal of Consent: Withdraw your consent to our use of your personal data at any time.

    • Data Portability: Request a copy of your personal data in a commonly used format.

    To exercise your rights, please contact our Data Protection Officer (DPO) at dpo@kima.foundation.

    Our Site uses cookies and similar technologies to enhance user experience, analyze Site performance, and deliver personalized content. You can control the use of cookies through your browser settings, but disabling cookies may affect your ability to use certain features of our Site.

    Our Site may contain links to third-party websites. We are not responsible for the privacy practices or content of these sites. We encourage you to review the privacy policies of any third-party websites you visit.

    We may update this Privacy Policy from time to time to reflect changes in our practices, legal requirements, or operational needs. The updated policy will be posted on our Site with the effective date, and we encourage you to review it periodically.

    If you have any questions, concerns, or feedback regarding this Privacy Policy or our data protection practices, please contact our Data Protection Officer at:

    Kima Foundation 3 Fraser street #04-23a, Duo Tower, Singapore dpo@kima.foundation

    This Privacy Policy is governed by and construed in accordance with the laws of Singapore. By using our Site, you consent to the collection and use of your personal data as described in this Privacy Policy.

    Scope of the Policy

    Data Collection

    Types of Data Collected:

    Use of Personal Data

    Disclosure of Personal Data

    Data Security

    Retention of Personal Data

    Your Rights

    Use of Cookies

    Third-Party Links

    Changes to This Privacy Policy

    Contact Us

    Origin token symbol

  • Origin chain symbol: see the list of chain symbols in the Supported Assets section

  • Target address

  • Target chain symbol

  • Template:

    Get the message to sign by calling the /submit/fees endpoint and selecting the appropriate version based on whether the user is paying fees from the origin or target chain.

    To sign the message, connect the user's wallet, read transactionValues.feeFromOrigin.message or transactionValues.feeFromTarget.message from /submit/fees, and pass that string to your wallet client's message-signing function.

    If you are integrating on EVM chains, see the Viem wallet client docs for a concrete signMessage implementation.

    This signature will be passed to the options param of the submit endpoint.

    If the selected origin token has isPermit2=true in /chains, the Kima message signature above is still mandatory, and you must also include an additional options.permit2 payload in the submit request:

    • r

    • s

    • v

    • deadline

    This means there are two distinct signatures in a Permit2 flow:

    • the Kima message signature, which authorizes the transaction details for Kima

    • the Permit2 signature payload, which authorizes token spending without a separate on-chain approve() transaction

    Some supported tokens use a signature-based approval flow through Permit2 instead of a regular on-chain approval transaction.

    With a regular ERC-20 approval flow, the user must first send an approve() transaction to grant spending permission to the spender contract. After that transaction is confirmed, the transfer transaction can be submitted.

    This means the user usually pays gas twice:

    1. once for the approval transaction

    2. once for the transfer transaction

    With Permit2, the user signs additional off-chain typed data instead of sending a separate approve() transaction from their wallet. That signed authorization is then used as part of the transfer flow.

    This reduces friction because:

    • no separate approval transaction is required

    • the user avoids paying gas for a standalone approval

    • the approval and transfer flow becomes faster and simpler

    The main difference is where the approval happens:

    • Regular approval: permission is granted on-chain through an approve() transaction

    • Permit2: permission is granted by signing an additional authorization payload, which removes the need for a separate approval transaction

    For supported Permit2 tokens, the wallet flow includes the normal Kima message signature plus an additional Permit2 authorization signature instead of a standard approval transaction.

    Signing a message significantly improves security in the following ways:

    • The signature is cryptographically verifiable as coming from the user's wallet. This is proof that the user has authorized the transaction.

    • The transaction details cannot be modified without invalidating the signature. This prevents a "man in the middle" attack where the destination address is changed to the attacker's address.

    Message Structure

    Signing the Kima message

    Permit2 tokens

    Regular approval

    Permit2 approval

    Key difference

    Why sign a message?

    These features will be rolled out first to testnet so app developers have a period of time to migrate their apps ahead of the mainnet release.
    • The Kima fee estimation endpoint must be used to calculate the gas and service fees. It returns a feeId which must be passed to the /submit endpoint in the backend.

    • The user must sign a message containing the transaction details and include the signature in the /submit request.

    • Credit card transactions cannot be processed using only the backend

      • The frontend kima-transaction-widget is required as it must handle KYC and interactions with 3rd party widgets.

    • The widget props excludedSourceNetworks and excludedTargetNetworks have been removed

      • This is now done on the backend using the KIMA_CHAIN_FILTER environment variable

    Install the latest version of the React Widget.

    There are no new ENV variables or Widget props.

    Navigate to the kima-transaction-backend repo and and pull the latest version.

    There are some new ENV vars and existing ones which have changed. See the .env.example file.

    New ENV vars:

    • PAYMENT_PARTNER_ID: required for credit card transactions

      • Mainnet: Kima

      • Sardis Testnet: KimaTest

    Changed:

    • KIMA_BACKEND_FEE_URL

      • Mainnet: https://fcs.kima.network

      • Sardis Testnet: https://fcs.sardis.kima.network

    If your app should not support credit cards, the "Credit Card" network can be filtered out using an ENV variable in the Kima Transaction Backend > Chain Filtering.

    DEPRECATED: Please upgrade to v1.5.x — Upgrade guide.

    Upgrading to v1.4.x

    Major Features

    🚨 Breaking Changes

    Widget

    Backend

    ENV Variables

    Disabling Credit Cards

    I approve the transfer of {authorizationAmount} {originSymbol} from {originChain} to {targetAddress} on {targetChain}.
    npm install @kimafinance/kima-transaction-widget
    git pull

    Base Sepolia

    BASE

    Berachain Bepolia

    BERA

    BNB Smart Chain Testnet

    BSC

    Bitcoin Testnet

    BTC

    Ethereum Sepolia

    ETH

    Optimism Sepolia

    OPT

    Polygon Amoy

    POL

    Solana Devnet

    SOL

    Tron Nile Testnet

    TRX

    42161

    Avalanche

    AVX

    43114

    Base

    BASE

    8453

    Binance Smart chain

    BSC

    56

    Berachain

    BERA

    80094

    Ethereum

    ETH

    1

    Optimism

    OPT

    10

    Polygon

    POL

    137

    Solana

    SOL

    Tron

    TRX

    728126428

    Worldchain

    WLD

    480

    Bitcoin

    BTC

    Credit Card

    FIAT

    Bank Account

    FIAT

    Arbitrum Sepolia

    ARB

    421614

    Avalanche Fuji

    AVX

    {
      "Chains": [
        "ETH",
        "POL",
        "AVX",
        "SOL",
        "BSC",
        "ARB",
        "OPT",
        "TRX",
        "BASE",
        "BERA",
        "FIAT",
        "WLD",
        "BTC"
      ]
    }
    {
      "Chains": [
        "POL",
        "AVX",
        "SOL",
        "BSC",
        "ARB",
        "OPT",
        "TRX",
        "BASE",
        "WLD"
      ]
    }

    Testnet support

    Querying for Supported Chains

    Full environment chain inventory

    Route-specific destinations

    The
    <KimaProvider>
    component
  • The <KimaTransactionWidget> component

  • A link to the Kima Transaction Backend (or build your own)

  • A Reown project id

  • If you don't have one already, you'll need to get a free Reown project ID from Reown Cloud and pass it to the projectId prop on <KimaProvider>.

    Create a file at src/components/KimaWidget.tsx with the following code:

    Then render it from src/app/page.tsx:

    If your project does not use the @/ alias, replace it with the relative import path to src/components/KimaWidget.

    When you visit http://localhost:3000 you will see something like this:

    The widget example maintained in this repo follows the same structure:

    • src/components/KimaWidget.tsx for the client-side dynamic widget wrapper

    • src/app/page.tsx for rendering the widget in the App Router

    See the Configuration options section for more details on setting up the widget.

    If your app still uses the older Pages Router, the same client-only requirement applies, but the maintained reference example in this repo is App Router first.

    The widget is not currently compatible with the --turbopack flag. Please disable this flag when running the development server.

    npm install @kimafinance/kima-transaction-widget redux react-redux pino-pretty
    "use client";
    
    import dynamic from "next/dynamic";
    import React from "react";
    
    import {
      KimaTransactionWidget,
      KimaProvider,
      ModeOptions,
      ColorModeOptions,
    } from "@kimafinance/kima-transaction-widget";
    import "@kimafinance/kima-transaction-widget/index.css";
    
    const Widget = () => {
      return (
        <KimaProvider
          projectId="your-project-id"
          kimaBackendUrl="http://localhost:4000"
        >
          <KimaTransactionWidget
            theme={{ colorMode: ColorModeOptions.light }}
            mode={ModeOptions.bridge}
          />
        </KimaProvider>
      );
    };
    
    const KimaWidget = dynamic(() => Promise.resolve(Widget), {
      ssr: false,
    });
    
    export default KimaWidget;
    "use client";
    
    import KimaWidget from "@/components/KimaWidget";
    
    export default function Home() {
      return <KimaWidget />;
    }

    Pages Router

    Troubleshooting

    Turbopack (Development)

    prop
  • The title and subtitle can be customized using the titleOption and paymentTitleOption props

  • ⚠️ transactionOption.currency must be a token symbol that is currently supported by Kima for the selected environment (mainnet or testnet) and selected chain. Resolve supported symbols dynamically from /chains in your backend. ℹ️ The example below uses USDC, which is valid on mainnet for Solana. If you are testing on Sardis, replace it with a supported testnet token such as USDK.

    You should see a page that looks like this:

    The payment (target) wallet and chain will show on the next step when the user completes the authorization for the transfer amount.

    Once the user completes the authorization step and submits the transaction, the user can see the transaction status in the next step.

    For more details on how to get transaction status of a previous transaction, check the Widget Status Mode Section.

    chain
    token
    import React from "react";
    
    import {
      KimaTransactionWidget,
      KimaProvider,
      ModeOptions,
      ChainName,
      ColorModeOptions,
    } from "@kimafinance/kima-transaction-widget";
    import "@kimafinance/kima-transaction-widget/index.css";
    
    const App = () => {
      return (
        <KimaProvider
          projectId='your-project-id'
          kimaBackendUrl="http://localhost:4000"
        >
          <KimaTransactionWidget
            theme={{ colorMode: ColorModeOptions.light }}
            mode={ModeOptions.payment}
            titleOption={{
              initialTitle: "New Purchase",
            }}
            paymentTitleOption={{
              title: "Buy MyFirst NFT",
              style: {
                fontSize: "1.2em",
                fontWeight: "500",
                color: "#DDDDDD",
              },
            }}
            transactionOption={{
              targetChain: ChainName.SOLANA,
              targetAddress: "5tvyUUqPMWVGaVsRXHoQWqGw6h9uifM45BHCTQgzwSdr",
              amount: 12.34,
              currency: "USDC",
            }}
          />
        </KimaProvider>
      );
    };
    
    export default App;

    From the "Target Network" dropdown, select the desired chain and token- i.e. EURC on Base

  • Fill in the wallet address (Target Address) and amount, then click "Next"

  • Choose where the service fees will be paid from and click "Next". There are 2 options. The difference is where the service will be paid from.

    • In the first option, the service fees are paid upfront on the bank transfer. Choose this option to receive the exact amount you specified in the "Amount" field.

    • In the second option, the service fees are deducted from the amount you will receive. So you will get slightly less stablecoins the amount you specified in the "Amount" field.

    1. When you have confirmed all details, click Next. This will load the bank transfer provider screen.

    6.1. Currently, there is no way to do a bank transfer in "test mode" since our fiat provider expects to receive an actual bank transfer to trigger the logic behind it.

    6.2. In order to send a transaction users will need to perform KYC. Select your country and complete all steps needed to reach the next screen and fill in your personal information.

    Once you send all necessary data you'll need to wait a few minutes (or seconds) to proceed with the payment.

    1. After the kyc process is complete, the widget will display the bank account details that you must transfer the assets to.

    Once you're ready, click on the finish button. This will send the needed transaction request to the kima blockchain. From there, you can track the current state of the transaction in the Kima blockchain.

    If your transaction succeeds you will see a success screen. You can go back in this step, and check all details regarding the transaction.

    Bank Transfers

    Overview

    Upgrading to v1.5.x
    Kima Transaction Widget
    unsupported Countries

    Testnet Version

    Mainnet Version

    Important Notice: depending on your bank provider, some transactions may take up to days to be processed, whilst others can happen instantly. Consider this in order to keep track of your transaction status.

    Fetch service fees from Kima (/submit/fees) to get feeId and submit amounts.
  • If origin is not BTC, complete the required token authorization flow:

    • regular ERC-20 tokens: sign the message and send approve()

    • Permit2 tokens: sign the message and also collect the permit2 payload required for submit

  • If origin is BTC, prepare an HTLC lock with backend endpoints:

    • POST /btc/htlc/lock-intent

    • user broadcasts BTC to the returned htlcAddress

    • POST /btc/htlc/record with the broadcast txid

  • Submit the transaction to backend (/submit/transfer or /submit/swap):

    • non-BTC origin: include standard options (feeId, signature, and permit2 when required)

    • BTC origin: include HTLC fields + senderPubKey

  • Poll the transaction status until completion.

  • FIAT-origin flows are intentionally out of scope for this guide and should be implemented only through the widget.

    Use GET /chains token metadata to determine whether the selected token requires Permit2:

    • isPermit2=false: standard approve + signature flow

    • isPermit2=true: signature is still mandatory, and include options.permit2 (r, s, v, deadline) in submit payload

    Permit2 guidance applies to Permit2-enabled EVM tokens. BTC-origin flows use the HTLC path above.

    The React component on the Kima Github:

    @Kimafinance/kima-transaction-widget

    The frontend component will need to provide the following information. This will be used to calculate the service fee and the approval for Kima to move tokens on behalf of the user.

    • Origin (from)

      • chain: this is the chain the user tokens will come from

      • token: the token the user will pay with (or bridge from)

      • address: the source user address- i.e. the connected user

      • amount: the amount of tokens to transfer

    • Target (to)

      • Chain: the destination chain

      • Token: the token being delivered

        • In a payment scenario this will be the same as the origin token

    See the list of chains and tokens in Supported Assets and Supported Tokens.

    Using Kima SDK without the widget

    Transaction Flow

    Permit2 tokens

    Reference Implementation

    Selecting Chains and Amount

    Supported Chains and Tokens

    Installation

    Prerequisites

    Programs and applications

    curl: Required for fetching external IPs and interacting with web services. Ensure it is installed and configured on your system. git: Needed for cloning repositories and managing code changes. Install it and ensure familiarity with basic commands. text editor: Use any editor (e.g., Vim, Nano) to update configuration files as needed

    Currently, validators are selected manually and require access to private GitHub repositories. These repositories will be made open-source in the near future.

    To gain access and prepare your environment, you must: 1. Set up an SSH key

    • Generate an SSH key.

    • Add the SSH key to your GitHub account. 2. Accept the repository invitation

    • Once your SSH key is linked to your GitHub account, you will receive an invitation to access the necessary repositories. 3. Ensure required permissions and tools You will need sudo access on your machine to manage installations and configurations.

    Ensure the git command is installed and configured, as it is required to clone the Kima repositories. Note: For assistance with setting up an SSH key or linking it to GitHub, refer to .

    Proper SSH configuration and access permissions ensure secure and seamless repository access.

    Public static IP

    Open Ports:

    • 22: SSH (Secure Shell) protocol

    • 26656: Cosmos app CometBFT gossiping port for consensus

    • 26657: Cosmos app CometBFT RPC port

    • 9090: Cosmos app gRPC port

    Download scripts from the Github repository to your server using any convenient method.

    Make the files executable with:

    Navigate to the validator directory:

    Create an empty .env file:

    Copy the template file to .env:

    ⚠️ Note: This will overwrite any existing .env file. Ensure you want to proceed.

    In the same .env file, add the RPC and WSS endpoints for the blockchain networks you will connect to:

    ⚠️ Important: Use a high-performance RPC endpoint. Free or basic paid plans may not suffice. Replace <YOUR_INFURA_API_KEY> with your actual API key. Update the URLs and details for other networks as needed.

    Suggestions for Testnet API Keys: Services like Alchemy, QuickNode, or Ankr support various chains, including Ethereum, Polygon, AVAX, BSC, and more. Refer to their documentation for API key acquisition and configuration.

    📝 Tip: Check each blockchain's official documentation for the latest public testnet endpoints or additional API services.

    Execute the following script to install necessary components and start the installation:

    Upon successful installation, your node will begin synchronizing with the blockchain network. To monitor progress:

    You will see synchronization details like this:

    Wait for catching_up to turn false; indicating the sync is complete.

    Complete the setup by executing the following:

    Once this script completes, your node will be fully operational, and you will become a validator on the Kima Network blockchain.

    Getting the Transaction Status

    From the Kima Backend

    Using the Kima Backend, you can get the transaction status by calling two /tx endpoints depending on the type of transaction.

    For regular transactions: GET /tx/:txId/status

    For liquidity pool transactions: GET /tx/lp/:txId/status

    Parameters:

    • txId number: the transaction id number. This is a sequential number assigned to each transaction, NOT the transaction hash (tx_id below).

    Success Response:

    Example note: this sample response uses testnet-style token symbols such as USDK. If you are integrating against mainnet, expect the same response shape with supported mainnet symbols such as USDC.

    Once the transaction has been submitted to the Kima Transaction Backend, you’ll want to display the transaction progress in the frontend. There are 2 GraphQL queries on the Kima subgraph for this purpose.

    • Mainnet Kima Subgraph url: https://graphql.kima.network/v1/graphql

    • Sardis Testnet url: https://graphql.sardis.kima.network/v1/graphql

    Here is a code snippet for regular transactions using plain fetch. See the docs for your favorite graphql client for constructing queries.

    Note: in the Kima subgraph, tx_id uses the GraphQL scalar bigint. In JSON variables, pass it as a numeric string such as "15519".

    For liquidity pool transactions:

    These are the current available transaction statuses returned from our blockchain and used throughout the SDK documentation today.

    Terms and conditions

    Introduction

    Welcome to Kima Foundation (the “Foundation”). These Terms and Conditions (the “Terms”) govern your access to and use of our website (the “Website”) and any associated services provided by the Foundation (collectively, the “Services”). By accessing or using the Website or the Services, you agree to comply with and be bound by these Terms. If you do not agree with these Terms, you should not use the Website or Services.

    Eligibility

    You must be at least 18 years old to use our Services. By using the Website, you represent and warrant that you are of legal age to form a binding contract with the Foundation and meet all eligibility requirements. If you do not meet these requirements, you must not access or use the Website.

    Use of Website and Services

    Permitted Use

    The Website and Services are provided solely for your personal, non-commercial use, and may not be used for any other purpose without our prior written consent.

    Prohibited Activities

    When using the Website and Services, you agree not to:

    • Violate any applicable laws or regulations.

    • Infringe on the rights of others, including intellectual property rights.

    • Engage in any conduct that is fraudulent, abusive, or otherwise inappropriate.

    • Introduce any viruses, malware, or other harmful software to the Website.

    • Attempt to gain unauthorized access to any part of the Website, including any restricted areas or user accounts.

    You may be required to register an account to access certain features of the Website. You agree to provide accurate and complete information during the registration process and to update such information as necessary. You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.

    All content, materials, and intellectual property available on the Website, including but not limited to text, graphics, logos, icons, and software, are owned by the Foundation or its licensors and are protected by copyright, trademark, and other applicable laws.

    The Foundation grants you a limited, non-exclusive, non-transferable, and revocable license to access and use the Website and Services for personal, non-commercial use, in accordance with these Terms.

    You may not modify, reproduce, distribute, create derivative works from, or otherwise exploit any content, materials, or intellectual property available on the Website without the Foundation’s prior written consent.

    You may be permitted to submit or post content, such as comments or other materials, on the Website (“User-Generated Content”). You are solely responsible for the User-Generated Content you submit, and you represent and warrant that you have all necessary rights to do so.

    By submitting User-Generated Content, you grant the Foundation a worldwide, non-exclusive, royalty-free, perpetual, and transferable license to use, reproduce, modify, adapt, publish, and display such content in any form, media, or technology now known or later developed.

    The Foundation reserves the right to remove any User-Generated Content that violates these Terms or is otherwise objectionable, without prior notice.

    Your privacy is important to us. Please review our Privacy Policy, which explains how we collect, use, and protect your personal information. By using the Website, you agree to the collection and use of your personal information in accordance with our Privacy Policy.

    The Website and Services are provided on an “as-is” and “as available” basis, without any warranties of any kind, either express or implied. The Foundation disclaims all warranties, including but not limited to, implied warranties of merchantability, fitness for a particular purpose, and non-infringement.

    To the fullest extent permitted by applicable law, the Foundation shall not be liable for any direct, indirect, incidental, consequential, or punitive damages arising out of or in connection with your use of the Website or Services, even if the Foundation has been advised of the possibility of such damages.

    You agree to indemnify, defend, and hold harmless the Foundation, its officers, directors, employees, agents, and affiliates from and against any and all claims, liabilities, damages, losses, and expenses, including reasonable attorneys’ fees, arising out of or in any way connected with your use of the Website or Services, or your violation of these Terms.

    The Foundation reserves the right to suspend or terminate your access to the Website or Services at any time, for any reason, and without prior notice. Upon termination, all provisions of these Terms that by their nature should survive will continue to apply, including but not limited to, ownership provisions, warranty disclaimers, and limitations of liability.

    These Terms shall be governed by and construed in accordance with the laws of Singapore, without regard to its conflict of law principles.

    You agree to submit to the exclusive jurisdiction of the courts of Singapore for any disputes arising out of or relating to these Terms or your use of the Website or Services.

    The Foundation reserves the right to modify these Terms at any time. Any changes will be effective immediately upon posting on the Website. Your continued use of the Website or Services following the posting of changes constitutes your acceptance of the revised Terms. It is your responsibility to review the Terms regularly.

    If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions will continue in full force and effect.

    These Terms, along with our Privacy Policy, constitute the entire agreement between you and the Foundation with respect to your use of the Website and Services, and supersede any prior agreements or understandings.

    If you have any questions about these Terms, please contact us at:

    Kima Foundation 3 Fraser street #04-23a, Duo Tower, Singapore .

    Hardware and operating system requirements

    Because of the very specific nature of Kima's security model, explained in the validators intro and in the Kima White Paper, you need to ensure you meet the following hardware requirements before you become a Kima validator:

    Must be an Intel XEON E-series or any other XEON supporting SGX-SPS (Server Platform Services). The motherboard must also support SGX.

    • CPU: 4vCPU (8vCPU recommended)

    • RAM: 16GB (32GB recommended)

    • Storage: 512GB HDD (1TB recommended)

    • Operating System: Ubuntu 22.04

    Must be an Intel XEON E-series or any other XEON supporting SGX-SPS (Server Platform Services). The motherboard must also support SGX. The below list of supported SGX-compliant CPUs List is current for the second half of 2024

    • Intel XEON E-2174G

    • Intel XEON E-2176G

    • Intel XEON E-2178G

    • Intel XEON E-2186G

    Manufacturer
    Model

    Credit Card Transactions

    Credit Cards

    Starting with version 1.4, Kima supports credit card transactions in the origin network (onramping)- off ramping to come in a future release. See Upgrading to v1.4.x for more information on how to upgrade your integration.

    Credit card transactions require the use of the Kima Transaction Widget. This is a frontend React component which handles integration with Kima and 3rd party components which handle KYC and payment processing.

    ℹ️ Check the list of unsupported Countries

    Overview

    The following steps outline the process of using the widget to buy stablecoins like USDC using a credit card.

    1. From the "Source Network" dropdown, select "Credit Card"

    1. From the "Target Network" dropdown, select the desired chain and token- i.e. USDT on Arbitrum

    2. Fill in the wallet address (Target Address) and amount, then click "Next"

    3. Choose where the service fees will be paid from and click "Next". There are 2 options. The difference is where the service will be paid from.

    • In the first option, the service fees are paid upfront on the credit card. Choose this option to receive the exact amount you specified in the "Amount" field.

    • In the second option, the service fees are deducted from the amount you will receive. So you will get slightly less stablecoins the amount you specified in the "Amount" field.

    1. When you have confirmed all details, click Next. This will load the credit card provider screen.

    From here there are couple differences between the Testnet and Mainnet versions of the widget.

    1. Please skip the KYC process by pressing the "Approve KYC" button. KYC will be required in the Mainnet version.

    1. Select the payment method. For now, the only payment method available is Credit Card. For testnet, please use fake information excpet for the card number.

    • The expiration date must be in the future

    • The CCV can be any number

    1. In order to send a transaction users will need to perform KYC. Select your country and complete all steps needed to reach the next screen and fill in your information and credit card details.

    Once you send all necessary data you'll need to wait a few minutes (or seconds) to proceed with the payment.

    1. After the kyc process is complete, you'll be able to select your payment method. For now, the only available one is Credit Card:

    In the next screen, fill in your card details and proceed with the payment:

    If your transaction succeeds you will see the status screen, where you can track the current state of the transaction in the Kima blockchain.

    If your payment is not sucessful, you will see a notification with a transaction id and asking you to contact support. Plese copy the transaction id and create a support ticket on the Kima Discord.

    Delegate

    In this guide, you will learn how to delegate tokens to a validator using the Kima explorer.

    Testnet explorer Mainnet explorer

    Connect your wallet

    From the left sidebar, select Validators.

    Connect your wallet by clicking the Connect Keplr button on the top right corner.

    Keplr will now prompt you to add the Kima network (mainnet or testnet) to your wallet's chain registry. To complete the operation, click the Approve button.

    You should now see your Kima address instead of Connect Keplr in the top right corner.

    View your KIMA tokens in Keplr

    Keplr requires an extra step to display the KIMA network so you can view your tokens. From the extensions panel in Chrome, click on the Keplr extension and select the hamburger icon in the top left corner.

    In the menu, select Settings.

    On the next screen, select General.

    Next, scroll down until you reach the Manage Chain Visibility button and click it.

    This will open a new tab. In the search box, type kima for mainnet or kima-testnet for the testnet. and it should show the relevant network, along with your $KIMA tokens. Select it by clicking the checkbox and click Save.

    You should now be able to see your $KIMA balance in your wallet.

    Select one of the available validators in the Kima explorer and click on the Delegate button.

    Enter the amount of $KIMA that you want to delegate. Ensure that you have sufficient balance for both the delegation amount and the fees for sending the transaction to the network. To confirm the delegation, click Submit.

    You will now be prompted to approve the transaction. You will see the following information (numbers are examples):

    • Method to execute: Stake

    • Amount of tokens: 10 $KIMA

    • Transaction fees: 0.05 $KIMA

    Check all details, then click Approve and wait for the transaction to complete.

    You should now see a success message, along with the transaction hash of the delegation.

    To see further transaction details, you can click on the transaction hash, which will take you to the transaction details within the explorer.

    There you can view details such as:

    • Minimum period 30 days

    • Minimum delegation >0

    • Unbonding lockup period 7 days

    • Commission fee X%

    Finally you can see your delegated stake in the overview page of the explorer.

    Ensure that the Kima network is operational and that there are no ongoing issues or outages.

    Double-check the validator’s details before delegating to avoid any mistakes.

    Make sure you have enough tokens to cover both the delegation amount and any associated network fees.

    Deposit assets in Kima pools

    Below is a step by-step guide on how to deposit assets:

    Step 0: Check you have enough funds

    Before depositing liquidity, make sure:

    • You have assets available for deposit.

    • The assets are on the supported assets list.

    • You have at least 0.2 Kima tokens in your Keplr wallet.

    • You have enough funds for gas on your desired network (e.g., ETH for Ethereum, MATIC for Polygon, etc).

    Browse to the Kima Explorer.

    Browse to the Liquidity panel

    Click the button in the upper right to connect your Keplr wallet

    Your existing positions are now visible.

    Select the blockchain you’d like to provide liquidity on.

    Choose the amount you would like to deposit.

    Select the asset you’d like to provide.

    Click Deposit.

    Upon clicking Deposit, a New Transfer window will appear. In this window:

    Connect your blockchain wallet if you haven't already.

    Review the transaction details, including the source network, wallet address, and deposit amount. Click Next.

    After reviewing the transaction details, click Submit.

    Approve all the transactions your wallets ask you to approve.

    For all Kima Network transactions, you will be asked to make two approvals through your Keplr wallet.

    Important: You may have to wait a few seconds for the second approval request to appear. If the Keplr wallet does not automatically launch, open it manually to see the pending approval requests.

    Once you’ve signed and approved both requests, the transaction process will begin.

    Once the transaction reaches 100% completion, your asset’s liquidity is deposited in the pool.

    You can now view your balance, or withdraw it.

    Draft a proposal

    Drafting and submitting a proposal is a process that takes time, attention, and involves risk.

    In an ideal world, a proposal should only fail to pass in a situation where engaged and aware make an informed decision to vote down the proposal.

    If you are considering drafting a proposal, you should first review the general background on drafting and submission:

    • How the voting process and governance mechanism works

    • How to draft your proposal and engage with the Kima community about it

    React

    Add the widget to your React project using npm or your favorite JavaScript package manager.

    You'll need to add the following:

    • The <KimaProvider> component in App.tsx

    • The <KimaTransactionWidget>

    FAQ

    Web3 and crypto are currently at an inflection point which many technologies have failed to cross in the past. That is the main problem from which all the symptoms arise:

    • Complicated experience: New users coming into crypto and Web3 are forced to quickly understand a slew of technically intensive terms and methods just to perform simple operations that are essential for using the new products this technology enables.

    • Weak security: The current mechanisms and solutions are flawed. Despite blockchains being a superior solution for digital assets, blockchain-based are very vulnerable in transit between blockchain ecosystems. This is because these solutions are mostly built on technology incompatible with this purpose.

    Disclaimer

    PLEASE READ THE ENTIRETY OF THIS "DISCLAIMER" SECTION CAREFULLY. NOTHING HEREIN CONSTITUTES LEGAL, FINANCIAL, BUSINESS OR TAX ADVICE AND YOU ARE STRONGLY ADVISED TO CONSULT YOUR OWN LEGAL, FINANCIAL, TAX OR OTHER PROFESSIONAL ADVISOR(S) BEFORE ENGAGING IN ANY ACTIVITY IN CONNECTION HEREWITH. NEITHER DIVERSIFI TECHNOLOGIES LTD (THE COMPANY), ANY OF THE PROJECT CONTRIBUTORS (THE KIMA TEAM) WHO HAVE WORKED ON KIMA (AS DEFINED HEREIN) OR PROJECT TO DEVELOP KIMA IN ANY WAY WHATSOEVER, ANY DISTRIBUTOR AND/OR VENDOR OF $KIMA TOKENS (OR SUCH OTHER RE-NAMED OR SUCCESSOR TICKER CODE OR NAME OF SUCH TOKENS) (THE DISTRIBUTOR), NOR ANY SERVICE PROVIDER SHALL BE LIABLE FOR ANY KIND OF DIRECT OR INDIRECT DAMAGE OR LOSS WHATSOEVER WHICH YOU MAY SUFFER IN CONNECTION WITH ACCESSING THE PAPER, DECK OR MATERIAL RELATING TO $KIMA (THE TOKEN DOCUMENTATION) AVAILABLE ON THE WEBSITE AT HTTPS://WWW.KIMA.NETWORK/ (THE WEBSITE, INCLUDING ANY SUB-DOMAINS THEREON) OR ANY OTHER WEBSITES OR MATERIALS PUBLISHED OR COMMUNICATED BY THE COMPANY OR ITS REPRESENTATIVES FROM TIME TO TIME.

    This document is created by Kima for educational and informational purposes only. The contents of this document are not a financial promotion. None of the information or analyses presented are intended to form the basis for any investment decision and no specific recommendations are intended. Therefore, none of the contents of this document serve as an invitation or inducement to engage in any sort of investment activity. This document is not intended to be a prospectus, solicitation, inducement or oering for investment or the sale or issuance of securities or any interests or assets.

    By accessing the Token Documentation or the Website (or any part thereof), you shall be deemed to represent and warrant to the Company, the Distributor, their respective affiliates, and the Kima team as follows:

    (a) in any decision to acquire any $KIMA, you have not relied and shall not rely on any statement set out in the Token Documentation or the Website;

    Prepare to provide liquidity

    Before you can start providing liquidity to Kima Finance pools, you will need to set up wallets for interacting with the Kima protocol, and the supported target blockchains.

    Kima is a Cosmos based blockchain. To interact with Kima, you need to:

    • Install a Cosmos wallet such as Keplr.

    • Download your wallet

    Address: the receiving address

    • In a bridge transaction this will be same as the connected user

    (b) you shall at your own expense ensure compliance with all laws, regulatory requirements and restrictions applicable to you (as the case may be);

    (c) you acknowledge, understand and agree that $KIMA may have no value, there is no guarantee or representation of value or liquidity for $KIMA, and $KIMA is not an investment product nor is it intended for any speculative investment whatsoever;

    (d) none of the Company, the Distributor, their respective affiliates, and/or the Kima team shall be responsible for or liable for the value of $KIMA, the transferability and/or liquidity of $KIMA and/or the availability of any market for $KIMA through third parties or otherwise; and

    (e) you acknowledge, understand and agree that you are not eligible to participate in the distribution of $KIMA if you are a citizen, national, resident (tax or otherwise), domiciliary and/or green card or permanent visa holder of a geographic area or country (i) where it is likely that the distribution of $KIMA would be construed as the sale of a security (howsoever named), financial service or investment product and/or (ii) where participation in token distributions is prohibited by applicable law, decree, regulation, treaty, or administrative act (including without limitation the United States of America, Canada, and the People's Republic of China); and to this effect you agree to provide all such identity verification document when requested in order for the relevant checks to be carried out.

    The Company, the Distributor and the Kima team do not and do not purport to make, and hereby disclaims, all representations, warranties or undertaking to any entity or person (including without limitation warranties as to the accuracy, completeness, timeliness, or reliability of the contents of the Token Documentation or the Website, or any other materials published by the Company or the Distributor). To the maximum extent permitted by law, the Company, the Distributor, their respective affiliates and service providers shall not be liable for any indirect, special, incidental, consequential or other losses of any kind, in tort, contract or otherwise (including, without limitation, any liability arising from default or negligence on the part of any of them, or any loss of revenue, income or profits, and loss of use or data) arising from the use of the Token Documentation or the Website, or any other materials published, or its contents (including without limitation any errors or omissions) or otherwise arising in connection with the same. Prospective acquirors of $KIMA should carefully consider and evaluate all risks and uncertainties (including financial and legal risks and uncertainties) associated with the distribution of $KIMA, the Company, the Distributor and the Kima team.

    $KIMA is a functional multi-utility token which will be used as the medium of exchange between participants on Kima in a decentralised manner. The goal of introducing $KIMA is to provide a convenient and secure mode of payment and settlement between participants who interact within the ecosystem on Kima without any intermediaries such as centralised third party entity/institution/credit. It is not, and not intended to be, a medium of exchange accepted by the public (or a section of the public) as payment for goods or services or for the discharge of a debt; nor is it designed or intended to be used by any person as payment for any goods or services whatsoever that are not exclusively provided by the issuer. $KIMA does not in any way represent any shareholding, ownership, participation, right, title, or interest in the Company, the Distributor, their respective affiliates, or any other company, enterprise or undertaking, nor will $KIMA entitle token holders to any promise of fees, dividends, revenue, profits or investment returns, and are not intended to constitute securities in the British Virgin Islands, Singapore or any relevant jurisdiction. $KIMA may only be utilised on Kima, and ownership of the same carries no rights, express or implied, other than the right to use $KIMA as a means to enable usage of and interaction within Kima. The secondary market pricing of $KIMA is not dependent on the effort of the Kima team, and there is no token functionality or scheme designed to control or manipulate such secondary pricing.

    Further, $KIMA provides the economic incentives which will be distributed to encourage users to exert efforts towards contribution and participation in the ecosystem on Kima, thereby creating a mutually beneficial system where every participant is fairly compensated for its efforts. $KIMA is an integral and indispensable part of Kima, because without $KIMA, there would be no incentive for users to expend resources to participate in activities or provide services for the benefit of the ecosystem. Given that additional $KIMA will be awarded to a user based only on its actual usage, activity and efforts made on Kima and/or proportionate to the frequency and volume of transactions, users of Kima and/or holders of $KIMA which did not actively participate will not receive any $KIMA incentives.

    $KIMA are designed to be utilised, and that is the goal of the $KIMA distribution. In particular, it is highlighted that $KIMA:

    (a) does not have any tangible or physical manifestation, and does not have any intrinsic value/pricing (nor does any person make any representation or give any commitment as to its value);

    (b) is non-refundable, not redeemable for any assets of any entity or organisation, and cannot be exchanged for cash (or its equivalent value in any other digital asset) or any payment obligation by the Company, the Distributor or any of their respective affiliates;

    (c) does not represent or confer on the token holder any right of any form with respect to the Company, the Distributor (or any of their respective affiliates), or their revenues or assets, including without limitation any right to receive future dividends, revenue, shares, ownership right or stake, share or security, any voting, distribution, redemption, liquidation, proprietary (including all forms of intellectual property or licence rights), right to receive accounts, financial statements or other financial data, the right to requisition or participate in shareholder meetings, the right to nominate a director, or other financial or legal rights or equivalent rights, or intellectual property rights or any other form of participation in or relating to Kima, the Company, the Distributor and/or their service providers;

    (d) is not intended to represent any rights under a contract for differences or under any other contract the purpose or intended purpose of which is to secure a profit or avoid a loss;

    (e) is not intended to be a representation of money (including electronic money), payment instrument, security, commodity, bond, debt instrument, unit in a collective investment or managed investment scheme or any other kind of financial instrument or investment;

    (f) is not a loan to the Company, the Distributor or any of their respective affiliates, is not intended to represent a debt owed by the Company, the Distributor or any of their respective affiliates, and there is no expectation of profit nor interest payment; and

    (g) does not provide the token holder with any ownership or other interest in the Company, the Distributor or any of their respective affiliates.

    Notwithstanding the $KIMA distribution, users have no economic or legal right over or beneficial interest in the assets of the Company, the Distributor, or any of their affiliates after the token distribution.

    For the avoidance of doubt, neither the Company nor the Distributor deals in, or is in the business of buying or selling any virtual asset or digital payment token (including $KIMA). Any sale or distribution of tokens would be performed during a restricted initial period solely for the purpose of obtaining project development funds, raising market/brand awareness, as well as community building and social engagement; this is not conducted with any element of repetitiveness or regularity which would constitute a business.

    To the extent a secondary market or exchange for trading $KIMA does develop, it would be run and operated wholly independently of the Company, the Distributor, the distribution of $KIMA and Kima. Neither the Company nor the Distributor will create such secondary markets nor will either entity act as an exchange for $KIMA.

    The information in this document is given in good faith, but no warranties, guarantees or representations are made by Kima with regard to the accuracy, completeness or suitability of the information presented. Kima expressly disclaims any and all responsibility, and Recipients expressly waive any claim, for any direct or consequential loss or damages of any kind whatsoever (whether foreseeable or not) arising directly or indirectly from: (i) reliance on any information contained in this document or any information which is made available in connection with any further inquiries, (ii) any error, omission, or inaccuracy in any such information, (iii) any action resulting therefrom or (iv) usage or acquisition of products. This disclaimer applies notwithstanding any negligence, default or lack of care. Kima may update, modify or correct this document at its sole discretion, without notice or incurring any obligation or liability to any recipient hereof. This document is strictly confidential and intended to be viewed exclusively by those recipients (“Recipient/s”) specifically authorized by Kima. This document shall not bind, convey any rights, obligations, terms, performance, covenants, representations or warranties on behalf of Kima to Recipient, or create any relationship between Kima and any Recipient or any other party.

    Nothing in the Token Documentation or the Website constitutes any offer by the Company, the Distributor, or the Kima team to sell any $KIMA (as defined herein) nor shall it or any part of it nor the fact of its presentation form the basis of, or be relied upon in connection with, any contract or investment decision. Nothing contained in the Token Documentation or the Website is or may be relied upon as a promise, representation or undertaking as to the future performance of Kima. The agreement between the Distributor (or any third party) and you, in relation to any distribution or transfer of $KIMA, is to be governed only by the separate terms and conditions of such agreement.

    Account Registration

    Intellectual Property

    Ownership

    Limited License

    Restrictions

    User-Generated Content

    Responsibility

    License

    Removal

    Privacy Policy

    Disclaimers

    No Warranties

    Limitation of Liability

    Indemnification

    Termination

    Governing Law and Jurisdiction

    Governing Law

    Jurisdiction

    Changes to the Terms

    Severability

    Entire Agreement

    Contact Information

    dpo@kima.foundation
    43113
    84532
    80069
    97
    11155111
    11155420
    80002
    3448148188

    Step 1: Connect your wallets

    Step 2: Select the blockchain, the asset and balance

    Step 3: Confirm transaction in the new transfer window

    Step 4: Approve the transaction

    Step 5: Sign approval requests in Keplr

    Step 6: Verify your deposit

    Estimated APY minimum guarantee + rewards
  • Exit before period ends - no commission paid

  • Add KIMA to delegation will reset the period timer

  • Delegate your $KIMA

    Troubleshooting and tips

    Check network atatus

    Verify validator information

    Ensure sufficient funds

    Intel XEON E-2188G
  • Intel XEON E-2274G

  • Intel XEON E-2276G

  • Intel XEON E-2278G

  • Intel XEON E-2286G

  • Intel XEON E-2288G

  • Intel XEON E-2334G

  • Intel XEON E-2386G

  • Intel XEON E-2388G

  • X11SCW-F

    Supermicro

    X11SCZ-F

    Supermicro

    X11SSL-F

    Supermicro

    X11SCD-F

    Supermicro

    X11SCE-F

    Supermicro

    X11SCH-F

    Supermicro

    X11SCH-LN4F

    Supermicro

    X11SCL-F

    Supermicro

    X11SCL-LN4F

    Supermicro

    X12STW-TF

    Supermicro

    X12STW-F

    Supermicro

    X12STL-IF

    Supermicro

    X12STL-F

    Supermicro

    X12STH-SYS

    Supermicro

    X12STH-LN4F

    Supermicro

    X12STH-F

    Supermicro

    X12STE-F

    Supermicro

    X12STD-F

    Dell

    R240

    Dell

    R350

    HP

    DL20 G10

    HP

    DL20 G10+

    Supermicro

    X11SCM-F

    Supermicro

    X11SCM-LN8F

    SGX requirements

    Compliant servers

    Compliant servers

    Supermicro

    Expensive compliance: International financial regulations exist to protect consumers. But for the innovators building the future of finance, protection took a back seat to inclusivity and progress. This made compliance an expensive patch instead of an integrated solution.

    Anyone can use Kima’s SDK to add functionalities to their dApps using Kima’s settlement layer, and thanks to its novel approach to infrastructure design, maximum security is already built into the platform, with opt-in compliance allowing dApps to expand into the preexisting monetary system and vice-versa.

    • dApp builders use Kima to onboard users from any chain or no chain at all, and let Kima handle the technical or security implications, allowing builders to focus on providing a better product for more users.

    • Institutions wishing to implement Web3 use Kima to extend their solutions to additional chains without spending resources on compliance or technological feasibility,

    • Web2 developers use Kima’s payment functionality to easily integrate web3 solutions into their existing products, joining the next evolution of the world wide web.

    Kima enables transfers of assets between different blockchain networks and bank accounts, using a purpose-specific chain that transacts directly with the source and target blockchains/banks. This means that sensitive funds are secured in transit and are not kept on experimental technologies prone to exploits such as smart contracts, but rather on tested solutions - such as TSS and SGX - that have endured the rigours of real-world use.

    Kima solves the problem in any situation where funds need to be sent seamlessly from one network to another without the user having to exit the application and go elsewhere to bridge funds. For example, a user may have funds on Ethereum but want to purchase from an eCommerce site which uses Polygon or Avalanche, or to add liquidity to a liquidity pool on a different chain. Removing the friction from the payment or bridging process and enabling a simple in-app experience is crucial to onboarding more users to the Web3 ecosystem. See Use Cases for a fuller description of all the things you can do with Kima.

    Kima takes a simpler approach to settlement security: If it’s not there it can’t be hacked. This means no smart contracts, no oracles, no external relayers to trust that can be compromised. So how are funds moved without smart contracts? The technical solution is comprised of three parts:

    External accounts EOAs (Externally Owned Accounts) are native blockchain wallets acting as pools. The security benefits of this are immense: No need for smart contracts on every blockchain, You can’t DDoS a wallet, and everything related to cross-contract messaging is non-existent so this is not an applicable attack surface.

    TSS and Trusted execution environments Using TSS and Intel SGX technology, keys are shared between different actors without them having direct access to these keys. This means we can allow more people to run these nodes and not be worried about keys being compromised.

    Efficient Liquidity management High TVL numbers only tell part of the story. Liquidity protocols need to balance between the liquidity pools to ensure a high service level. In other words, it’s not only about how much money is stored, it’s also about distributing the liquidity in a way that will serve demand in the most effective way. Kima’s Liquidity Management (LiMa) algorithm manages supply and demand and maintains equilibrium using financial incentives.

    Fiat Support To allow for integration between the old and new monetary systems, Kima also employs an opt-in compliance system on the protocol level, allowing decentralized solutions access to legacy systems like Fiat payments, Stocks and Bonds. This layer will perform all the necessary checks, including KYC, AML and KYT verifications to provide a compliant record that satisfies regulatory requirements.

    Anyone building in Web3 can see the challenges that Web3 compatibility brings. Instead of perceiving these challenges as independent problems with no relation to each other, Kima understands that these are symptoms of the same problem.

    Kima’s solution is the first compatibility layer that solves the problem, instead of treating the various symptoms that arise from it.

    You can see the Kima Demo App here and read about how to use it here.

    See the current list of supported networks here.

    You can find the Kima Whitepaper here.

    We have quick-start instructions for installing a validator node in these pages.

    The widget can be embedded into any React application, including NextJS. We do not currently support Vue or Angular applications. However, regardless of the framework you are using, you will be able to use the Kima back end and integrate your front end that way instead. Read the instructions here.

    For more technical background, see the Further reading section.

    Why do we need Kima?

    Who is it for?

    What does it do?

    What are some typical Kima use cases?

    How does it work?

    Where can I see Kima working?

    Which networks does Kima support?

    Where can I read more about Kima?

    How can I become a validator?

    In what front end frameworks can I use the Kima Transaction Widget

    5051: TSS-ECDSA P2P port 5052: TSS-EDDSA P2P port

  • 5053: TSS app EDDSA (Solana chain signer) gossiping port

  • 8081: TSS-ECDSA info address 8082: TSS-ECDSA info address

  • 7070: Cosmos validator management on genesis node port

  • Network

    Initial setup:

    Prepare the scripts:

    Prepare the environment:

    Add the blockchain networks configuration

    Execute the first script:

    Execute the second script:

    GitHub's SSH setup guide

    From the Kima Subgraph

    Available transaction statuses

    Testnet Version

    Testing Cards

    Mainnet Version

    How to format proposals

  • How to submit your proposal

  • You should also review details specific to each kind of proposal, listed in this section.

    What are signaling proposals currently used for?​

    Signaling proposals are used to make an on-chain record of support or agreement on a certain topic or ideas. Text proposals do not contain any code. In other words, they do not directly cause any changes to the Hub if they are passed.

    Past signaling proposals have been used for a variety of reasons:

    • Agreement to adopt (or not adopt) a feature in a future release

    • A high-signal alert to validators

    • On-chain record of community opinion

    • Ratification of a social norm

    Signaling proposals are a great way to take an official public poll of community sentiment before investing more resources into a project. The most common use of text proposals is to confirm that the community is actually interested in what the proposer wants to develop, without asking for money to fund development that might not be concrete enough to have a budget yet.

    Because the results of signaling proposals remain on-chain and are easily accessible to anyone, they are also a good way to formalize community opinions. Information contained in documentation or GitHub repos can be hard to find for new community members but signaling proposals in a block explorer or wallet is very accessible.

    You might make a signaling proposal to gather opinions for work you want to do for the Hub, or because you think it is important to have a record of some perspective held by the community at large.

    Technically, nothing happens on-chain. No code executes, and this 'unenforceable' property of text proposals is one of the biggest criticisms of the format. Regardless of whether the results of a signaling proposal are enforced by code, there can still be value from having a proposal on-chain and subject to discussion. Whether a proposal passes or fails, we all get information from it having been considered.

    • The community might have had a thorough, thoughtful discussion about a topic that they otherwise would not have had.

    • A development team interested in a feature might have a better idea of how their work will be received by the community.

    • The community might be more informed about a topic.

    • The community might feel confident that we are aligned on a particular definition or social norm.

    Follow the instructions below to create a text proposal and submit it to the network.

    Unlocks the potential for token-holders to vote to approve spending from the Community Pool.

    2% of all staking rewards generated (via block rewards & transaction fees) are continually transferred to and accrue within the Community Pool. For example, from December 19, 2019 until January 20, 2020 (32 days), 28,726 ATOM were generated and added to the pool.

    Though the rate of funding is currently fixed at 2% of staking rewards, the effective rate is dependent upon Kima staking rewards, which can change with inflation and block times. The current parameter Community Tax parameter of 2% may be modified with a governance proposal and enacted immediately after the proposal passes.

    You may directly query Kima for the balance of the Community Pool:

    Alternatively, the Kima Explorer will display the ongoing Community Pool balance.

    Funds from the Kima Community Pool may be spent via a successful governance proposal.

    We don't know 🤷

    The prevailing assumption is that funds should be spent in a way that brings value to Kima. However, there is debate about how to keep the fund sustainable. There is also some debate about who should receive funding. For example, part of the community believes that the funds should only be used for those who need funding most. Other topics of concern include:

    • Retroactive grants

    • Price negotiation

    • Fund disbursal (eg. payments in stages; payments pegged to reduce volatility)

    • Radical overhaul of how the community-spend mechanism functions

    We can expect this to take shape as proposals are discussed, accepted, and rejected by the Kima community.

    How are funds disbursed after a community-spend proposal is passed?​

    If a community-spend proposal passes successfully, the number of $KIMA encoded in the proposal will be transferred from the community pool to the address encoded in the proposal, and this will happen immediately after the voting period ends.

    As a strategy: funding is fast. Besides the time it takes to push your proposal on-chain, the only other limiting factor is a fixed 14-day voting period. As soon as the proposal passes, your account will be credited the full amount of your proposal request.

    To build rapport. Engaging publicly with the community is the opportunity to develop relationships with stakeholders and to educate them about the importance of your work. Unforeseen partnerships could arise, and overall the community may value your work more if they are involved as stakeholders.

    To be more independent. The Interchain Foundation (ICF) may not always be able to fund work. Having a more consistently funded source and having a report with its stakeholders means you can use your rapport to have confidence in your ability to secure funding without having to be dependent upon the ICF alone

    Drafting and submitting a parameter-change governance proposal involves two kinds of risk: losing proposal deposit amounts and the potential to alter the function of the Kima network in an undesirable way.

    The complete parameters of the Kima network are split up into different modules, each of which has its own set of parameters. Most parameters can be updated by submitting a governance proposal.

    List of modules whose parameters can be changed via governance:

    x/auth x/bank x/distribution x/evidence x/feegrant x/gov x/mint x/slashing x/staking ibc-go/transfer interchain-security/provider Each cosmos-sdk module uses MsgUpdateParams for providing parameter changes. You can learn more about it in the cosmos-sdk documentation of each module, for example msgupdateparam

    There are ways to query the current settings for each module's parameter(s). Some can be queried with the command line program gaiad. You can begin by using the command gaiad q [module] -h to get help about the subcommands for the module you want to query. For example, gaiad q staking params returns the settings of relevant parameters:

    bond_denom: uKIMA max_entries: 7 max_validators: 180 unbonding_time: 1814400s

    If a parameter change proposal is successful, the change takes effect immediately upon completion of the voting period.

    Note: You cannot currently query the bank module's parameter, which is sendenabled. You also cannot query the crisis module's parameters.

    Parameters govern many aspects of Kima's behaviour. As circumstances and attitudes change, sometimes you might want to change a parameter to bring the chain's behaviour in line with community opinion. For example, the Cosmos Hub launched with 100 active validators and there have been 4 proposals to date that have increased the MaxValidators parameter. At the time of writing, the active set contains 180 validators.

    The Cosmos Hub has been viewed as a slow-moving, highly secure chain and that is reflected in some of its other parameters, such as a 21 day unbonding period and 14 day voting period. These are quite long compared to other chains in the Cosmos Ecosystem

    Because parameters dictate some of the ways in which the chain operates, changing them can have an impact beyond what is immediately obvious.

    For example, reducing the unbonding period might seem like the only effect is in how quickly delegators can liquidate their assets. It might also have a much greater impact on the overall security of the network that would be hard to realize at first glance.

    This is one of the reasons that having a thorough discussion before going on-chain is so important - talking through the impacts of a proposal is a great way to avoid unintended effects.

    Use the draft-proposal command to create a draft proposal and populate it with required information.

    Text (Signaling)

    Why make a signaling proposal?​

    What happens when a signaling proposal passes?​

    Submitting a text proposal​

    Community Pool Spend

    Learn About the Community Pool​

    How is the Community Pool funded?​

    How can funding for the Community Pool change?​

    How much money is in the Community Pool?​

    How can funds from the Community Pool be spent?​

    How should funds from the Community Pool be spent?​

    Why create a proposal to use Community Pool funds?​

    Parameter change

    What parameters can be changed?​

    What are the current parameter values?​

    Why create a parameter change proposal?​

    Risks in parameter change proposals​

    Software Upgrade

    which interacts with Kima
  • A link to the Kima Transaction Backend (or build your own)

  • A Reown project id

  • For the purposes of this example, we'll just add the widget to App.tsx, but it can go anywhere it makes sense for your project.

    Open App.tsx, wrap your existing components with the <KimaProvider> and add the <KimaTransactionWidget> component.

    If you don't have one already, you'll need to get a free Reown project ID from Reown Cloud and pass it to the projectId prop on <KimaProvider>.

    The widget detects the active environment from your backend /chains/env endpoint, so you do not need to pass a networkOption prop manually.

    There are several configuration options, which are described in the Configuration options section.

    For new integrations, prefer a modern setup such as Vite or Next.js. Those are the maintained reference examples in the widget repo.

    The instructions below are only for older Create React App / Webpack setups that still need Node core module polyfills.

    If you are using a later version of webpack (>= 5), you will need to polyfill node core modules using react-app-rewired.

    This can be resolved by adding a file at the root of your project named config-overrides.js. Paste the following content into the file:

    The easiest way to see the widget working in a maintained setup is to check out the Vite example or the Next.js example in the widget repo.

    Use the polyfill workaround above only if you are integrating into an older CRA/Webpack application that cannot move to Vite or Next.js yet.

    Polyfills

    Example

    git clone git@github.com:kima-finance/kima-external-validator.git
    sudo chmod +x setup-validator.sh
    sudo chmod +x update-config.sh
    sudo chmod +x run-validator.sh
    	cd $HOME
    touch .env
    cp .env.template .env
    ETH_RPC_HOST="https://mainnet.infura.io/v3/<YOUR_INFURA_API_KEY>"
    ETH_WSS_HOST="wss://sepolia.infura.io/ws/v3/<YOUR_INFURA_API_KEY>"
    	./1-setup-validator.sh <validator-node-name>
    watch -n 1 'kimad status | jq .SyncInfo'
    {  
      "latest_block_height": "12345",  
      "catching_up": true  
    }
    ./1-run-validator.sh
    {
      "data": {
        "transaction_data": [
          {
            "failreason": "",
            "pullfailcount": 0,
            "pullhash": "0x479c907fe8c92970e99fa102d440e805fa7d5d436469d4bbc003dec21349230f",
            "releasefailcount": 0,
            "releasehash": "4r58fVKEL6q6dZ7xdqTUXrL3adVLH23EYavwh7EjavPTu2mCwiqGJqtoWRHiSC17rsVJA2jdcAjF3ZoGbG5e1y86",
            "txstatus": "Completed",
            "amount": "6.00",
            "creator": "kima18lhurd62myjv0c73dfrzej9wamvs4rffugd948",
            "originaddress": "0x366Aa85aFd7e5Cb657748f2142009a04750AD081",
            "originchain": "ARB",
            "originsymbol": "USDK",
            "targetsymbol": "USDK",
            "targetaddress": "64tSEV9Rc5L7LaYDnSwaEgi4YGZMkBr4VnT9S7Va8fNE",
            "targetchain": "SOL",
            "tx_id": 15519,
            "kimahash": "4C9135132C88B05C78B89B208A9655428AF3E86A43D6E4D0680463364037F5DD"
          }
        ]
      }
    }
    const result = await fetch("https://graphql.kima.network/v1/graphql", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        query: `  
          query TransactionDetailsKima($txId: bigint) {  
            transaction_data(where: { tx_id: { _eq: $txId } }, limit: 1) {  
              failreason  
              pullfailcount  
              pullhash  
              releasefailcount  
              releasehash  
              txstatus  
              amount  
              creator  
              originaddress  
              originchain  
              originsymbol  
              targetsymbol  
              targetaddress  
              targetchain  
              tx_id  
              kimahash  
            }  
          }`,
        variables: {
          txId: `${txId}`,
        },
      }),
    }).then((res) => res.json());
    const result = await fetch("https://graphql.kima.network/v1/graphql", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        query: `  
          query TransactionDetailsKima($txId: bigint) {  
            liquidity_transaction_data(where: { tx_id: { _eq: $txId } }, limit: 1) {  
              failreason  
              pullfailcount  
              pullhash  
              releasefailcount  
              releasehash  
              txstatus  
              amount  
              creator  
              chain  
              providerchainaddress  
              symbol  
              tx_id  
              kimahash  
            }  
          }`,
        variables: {
          txId: `${txId}`,
        },
      }),
    }).then((res) => res.json());
    export enum TransactionStatus {
      AVAILABLE='Available' // Transaction exists in mempool,
      CONFIRMED='Pull_Confirmed' // Funds have been pulled from source and confirmed after waiting n block confirmations,
      PULLED='Pulled' // Funds were pulled but are awaiting confirmation of txHash existence after waiting n block confirmations.
      PAID='Paid' // Funds were released in the target network but awaiting confirmation after waiting n block confirmations,,
      COMPLETED='Completed' // Transaction successfully completed,
      FAILEDTOPAY='FailedToPay' // Funds failed to be released on the target network,
      FAILEDTOPULL='FailedToPull' // Funds failed to be pulled from the source network,
      REFUNDSTART='RefundStart' // A refund has been initiated,
      REFUNDFAILED='RefundFailed' // The process of refunding failed,
      REFUNDCOMPLETED='RefundCompleted' // Refund has successfully completed,
      DECLINEDINVALID='DeclinedInvalid' // Transaction declined because it didn't comply with one or more security measures (feeId, signature, etc.)
    }
    Successful  
    Visa: 4000000000002503
    Mastercard: 5200000000002151
    
    Failed  
    Visa: 4000000000002420
    Mastercard: 5200000000002664
    gaiad q distribution community-pool --chain-id cosmoshub-4 --node <rpc-node-address>
    npm install @kimafinance/kima-transaction-widget redux react-redux pino-pretty
    import React from "react";
    
    import {
      KimaTransactionWidget,
      KimaProvider,
      ModeOptions,
      ColorModeOptions,
    } from "@kimafinance/kima-transaction-widget";
    import "@kimafinance/kima-transaction-widget/index.css";
    
    const App = () => {
      return (
        <KimaProvider
          projectId="your-project-id"
          kimaBackendUrl="http://localhost:4000"
        >
          <KimaTransactionWidget
            theme={{ colorMode: ColorModeOptions.light }}
            mode={ModeOptions.bridge}
          />
        </KimaProvider>
      );
    };
    
    export default App;
    const { ProvidePlugin } = require("webpack");
    
    module.exports = function override(config, env) {
      return {
        ...config,
        module: {
          ...config.module,
          rules: [
            ...config.module.rules,
            {
              test: /\.js$/,
              enforce: "pre",
              use: ["source-map-loader"],
            },
            {
              test: /\.cjs$/,
              type: "javascript/auto",
            },
            {
              test: /\.wasm$/,
              type: "webassembly/async",
            },
            {
              test: /\.m?js/,
              type: "javascript/auto",
            },
            {
              test: /\.m?js/,
              resolve: {
                fullySpecified: false,
              },
            },
            {
              test: /\.json$/,
              use: "json-loader",
              type: "javascript/auto", // This is important to prevent Webpack 5 from treating JSON as ESM
            },
          ],
        },
        plugins: [
          ...config.plugins,
          new ProvidePlugin({
            Buffer: ["buffer", "Buffer"],
            process: "process/browser",
          }),
        ],
        resolve: {
          ...config.resolve,
          fallback: {
            assert: "assert",
            buffer: "buffer",
            console: "console-browserify",
            constants: "constants-browserify",
            crypto: "crypto-browserify",
            domain: "domain-browser",
            events: "events",
            fs: false,
            http: "stream-http",
            https: "https-browserify",
            os: "os-browserify/browser",
            path: "path-browserify",
            punycode: "punycode",
            process: "process/browser",
            querystring: "querystring-es3",
            stream: "stream-browserify",
            _stream_duplex: "readable-stream/duplex",
            _stream_passthrough: "readable-stream/passthrough",
            _stream_readable: "readable-stream/readable",
            _stream_transform: "readable-stream/transform",
            _stream_writable: "readable-stream/writable",
            string_decoder: "string_decoder",
            sys: "util",
            timers: "timers-browserify",
            tty: "tty-browserify",
            url: "url",
            util: "util",
            vm: "vm-browserify",
            zlib: "browserify-zlib",
          },
        },
        experiments: {
          asyncWebAssembly: true,
        },
        ignoreWarnings: [/Failed to parse source map/],
      };
    };
    Follow the instructions to create a new wallet. Secure your seed phrase!

    Add the Kima blockchain to the wallet.

    Go to the Explorer page:

    Browse to the Liquidity panel

    Click the button in the upper right to connect your Keplr wallet

    Accept all the parameters that will add Kima Mainnet chain to your wallet

    You will need Kima tokens to pay gas for the provisioning operations.

    Kima offers broad support for multiple blockchain networks, allowing you to connect using a variety of wallets compatible with WalletConnect. You are not limited to specific wallets; instead, you can choose from options such as:

    • EVM-compatible blockchains: To provide liquidity on any EVM-compatible blockchain (Ethereum, Arbitrum, BNB, etc.) use any EVM-compatible wallet such as MetaMask.

    • Solana: To provide liquidity on Solana, use Solflare, Phantom, or any other Solana-compatible wallet.

    • Tron: We have provided instructions for TronLink.

    • Bitcoin: We have provided instructions for XVerse.

    Below are the setup instructions for each wallet option:

    For EVM-compatible blockchains, such as Ethereum, Polygon, or Optimism, you may use a wallet such as MetaMask.

    Install MetaMask: Download MetaMask as a browser extension or mobile app from the MetaMask website.

    Create a wallet: Follow the prompts to create a wallet. Secure your seed phrase!

    Add blockchains: Add the blockchains you’d like to provide liquidity on to your MetaMask wallet.

    The easiest way is to browse to Chainlist.org and add the desired blockchains.

    See the Supported blockchains section for a list of supported chains.

    For interacting with Kima's liquidity pools on Solana, you may use Solflare or a similar wallet that supports Solana.

    Install Solflare: Download the Solflare wallet from the Solflare website.

    Create a Wallet: Set up your Solflare wallet. Secure your seed phrase!

    For interacting with Kima's liquidity pools on Tron, you may use TronLink or a similar wallet that supports Tron.

    Install TronLink: Download TronLink from the TronLink website.

    Create a Wallet: Follow the instructions to create your Tron wallet. Secure your seed phrase!

    To provide liquidity to the Kima Finance Bitcoin pool, you may use XVerse wallet, a recommended wallet for interacting with Bitcoin.

    How to Set Up XVerse Wallet:

    Install XVerse: Download the XVerse wallet from the XVerse website.

    Create a Wallet: Follow the prompts to set up your XVerse wallet. Secure your seed phrase!

    You are now ready to start providing liquidity to Kima pools across various networks. If you encounter any issues during setup, refer to the official documentation of each wallet or reach out to the Kimae community for support.

    Instructions for using these wallets do not represent an endorsement by Kima of any of the wallets mentioned.

    Interacting with Kima

    Supported Networks and Wallets

    EVM-compatible blockchains

    Solana

    Tron

    Bitcoin

    Transaction Data

    The following information is needed to prepare for and ultimately submit a Kima transaction.

    • The fee amount and feeId

    • The user choice of whether to pay fees from the origin or target chain

    • The message containing the transaction details for the user to sign

    • The origin token amount the user must authorize so Kima can move tokens on behalf of the user

    • The amounts expected when the transaction is submitted

    Fortunately, all of these values are calculated by an endpoint exposed by the Kima chain.

    Using this endpoint is required as it will return a feeId which must be passed to submit endpoints in the backend (/submit/transfer or /submit/swap).

    • Non-BTC origin transactions submitted to Kima without a feeId or signature will be rejected

    • For non-BTC origin transactions, submitted amounts are validated against the feeId and signed message. Any mismatch will result in rejection.

    These are security measures to protect the user and ensure the transaction is legitimate.

    Use GET /chains to read token metadata for the selected origin token.

    • decimals: use this for amount handling

    • isPermit2: determines whether submit payload must include options.permit2

    For BTC-origin transactions, GET /submit/fees is still required to get feeId and the submit amount.

    Before calling /submit/transfer or /submit/swap, prepare BTC HTLC lock data:

    1. POST /btc/htlc/lock-intent

    2. User broadcasts BTC to the returned htlcAddress

    3. POST /btc/htlc/record using the broadcast txid

    The values returned by /btc/htlc/record are then included in the final submit payload.

    GET /submit/fees

    Query Params (all required):

    • amount (number): the amount of tokens to transfer

    • originAddress (string): the source user address

    • originChain (string): the chain the user tokens will come from

    Example:

    Port note: these direct backend examples use the backend's default local port 3001. If your frontend or local proxy exposes the backend on another port such as 4000, use that URL instead.

    Example note: this sample uses USDK, which is a testnet token. If you are integrating against mainnet, replace it with a supported mainnet token such as USDC.

    Success Response:

    Amounts are returned as both numbers representing the amount in whole tokens and as a string representing the integer amount in the smallest unit of the token (e.g. USDC is 6 decimals).

    • feeId (string): a unique identifier for the fee; include this in submit requests

    • feeOrigin* the gas fee for the origin chain

    • feeKimaProcessing* The processing fee (currently 0.05%)

    The response field is still named allowanceAmount, but treat it as the origin token authorization amount. There are 2 variants returned depending on whether the user chooses to pay fees from the origin or target amount.

    • When paying fees from the origin, use transactionValues.feeFromOrigin values.

    • When paying fees from the target, use transactionValues.feeFromTarget.

    Example:

    Transferring 10 USDK from ARB to SOL with 0.07371 USD in total fees.

    When paying fees from the origin

    • The user pays fees on Arbitrum. The total fees are included in the authorization amount.

    • User signs the message I approve the transfer of 10.07371 USDK from ARB to <targetAddress> on SOL. (feeFromOrigin.message)

    • The authorization amount is 10.07371 USDK (feeFromOrigin.allowanceAmount

    When paying fees from the target chain

    • The user does not pay fees on Arbitrum

    • User signs the message I approve the transfer of 10 USDK from ARB to <targetAddress> on SOL. (feeFromTarget.message)

    • The authorization amount is 10 USDK (feeFromTarget.allowanceAmount)

    Save the corresponding submitAmount, message and feeId for later as they are needed to submit the transaction.

    If you need the raw fee-calculation API instead of the backend wrapper, the backend currently calls the fee service at POST {{baseUrl}}/v3/fees/calculate. For most integrations, GET /submit/fees remains the recommended entry point.

    v.1.5.x

    Major Features

    • Bank transfers as an origin rail (e.g. SEPA → on-ramp to crypto).

    • Unified “FIAT rails” handling (BANK and CC) in the submit flow.

    • On-chain stable token swaps via a new /submit/swap endpoint.

    • Safer, stricter “options” contract between frontend, backend and the blockchain for FIAT rails.

    UPGRADING TO v1.5.x IS REQUIRED FOR ALL KIMA SDK USERS. Older payloads will fail once 1.5 validators/submit rules are enforced.

    • Origin rails BANK and CC are now treated as FIAT internally when we submit to Kima Chain.

    • Backend normalizes:

      • originChain: 'CC' | 'BANK' → 'FIAT'

    • Swaps are submitted through POST /submit/swap with:

    • amountIn, amountOut, fee (all bigint strings),

    • decimals

    • Backend must submit options as a JSON string. (Objects are not accepted by the API.)

    • For crypto → crypto:

      • include feeId (from fee estimator),

      • include the signed user approval.

    Install the latest version of the .

    Notes

    • No new required props for 1.5.x specifically, but if you want to pass a custom Solana RPC, the widget provider accepts solRPC (optional).

    • Existing network filters remain backend-driven (no re-introducing removed props).

    Navigate to the repo and and pull the latest version.

    • If origin is FIAT (BANK/CC):

    • Accept a fiatTransactionIdSeed in the body (or options.transactionIdSeed).

    • Call your existing helper to generate FIAT options (it must preserve the seed and add transactionIdSignature).

    Minimal example (server side):

    Common FIAT options keys you’ll be sending:

    • feeId — required (from the fee estimator)

    • paymentMethod — e.g. "sepaEur" for BANK and "creditCard" for CC

    • chargeFeeAtTarget

    • Uses amountIn / amountOut (bigint strings).

    • FIAT rules apply when origin is BANK/CC (transactionIdSeed + signature, origin normalized to FIAT, empty address).

    • As in 1.4, you must call the fee estimator before submit.

    • 1.5 continues to use feeId in the subsequent submit request (transfer or swap).

    • GET /submit/transactionId?transactionIdSeed=<uuid> — returns encoded transactionId (for CC flows). (Your FIAT helper already calls the underlying logic that also produces transactionIdSignature.)

    • Upgrade widget to latest @kimafinance/kima-transaction-widget.

    • Backend:

      • Ensure /submit/transfer preserves transactionIdSeed in options and adds transactionIdSignature

    Off-chain proposal

    Once a proposal is on-chain, it cannot be changed to reflect feedback or new information. It is very important to give a proposal time off-chain to receive feedback, input, and edits before going on-chain and asking for votes.

    The process of passing a proposal starts long before it goes on-chain!

    There are currently several types of proposals supported by Kima:

    • Text: Proposal to agree to a certain strategy, plan, commitment, future upgrade or other statement. Text proposals do not directly cause any changes, but they can be used to take a record of the community's opinion or commitment to a future idea.

    • Community Pool Spend: Proposal to spend funds from the community pool on a project

  • Parameter Change: Proposal to change a core on-chain parameter.

  • Software Upgrade: Proposal to upgrade the chain version.

  • You will first want to determine which kind of proposal you are making. Be sure to review all details of your specific proposal type.

    Engagement is likely to be critical to the success of a proposal. The degree to which you engage with the Kima community should be relative to the potential impact that your proposal may have on the stakeholders. This guide does not cover all ways of engaging but here are some suggestions:

    • Post your idea to the Cosmos Hub Forum

    • Mention the idea in a community call (often hosted on X/Twitter)

    • Host an AMA on Reddit

    • We encourage you to experiment and use your strengths to introduce proposal ideas and gather feedback.

    There are many different ways to engage. One strategy involves a few stages of engagement before and after submitting a proposal on chain.

    Why do it in stages? It's a more conservative approach to save resources. The idea is to check in with key stakeholders at each stage before investing more resources into developing your proposal.

    In the first stage of this strategy, you should engage people (ideally experts) informally about your idea. You'll want to start with the minimal, critical components (name, value to Kima, timeline, any funding needs) and check:

    • Does it make sense?

    • Are there critical flaws?

    • How will this affect other projects or properties of the Hub?

    You should be engaging with key stakeholders (e.g., a large validator operator) with a few short sentences to measure their support. Here is an example:

    "We are considering a proposal for funding to work on project. We think it will help the Hub to outcome. Timeline is x, and we're asking for y amount. Do you think that this is a proposal that large validator may support?"

    Why a large validator? They tend to be the de facto decision-makers on Kima, since their delegators also delegate their voting power. If you can establish a base layer of off-chain support, you can be more confident that it's worth proceeding to the next stage.

    Note: Many validators will likely hesitate to commit support, and that's okay. It will be important to reassure these stakeholders that this isn't a binding commitment. You're just canvasing the community to get a feel for whether it's worthwhile to proceed. It's also an opportunity to connect with new people and to answer their questions about what it is you're working on. It will be important for them to clearly understand why you think what you're proposing will be valuable Kima, and if possible, why it will be valuable to them as long-term stakeholders.

    If you're already confident about your idea, skip to Stage 2.

    Not yet confident about your idea?​

    Great! Governance proposals potentially impact many stakeholders. Introduce your idea with known members of the community before investing resources into drafting a proposal. Don't let negative feedback dissuade you from exploring your idea if you think that it's still important.

    If you know people who are very involved with Kima, send them a private message with a concise overview of what you think will result from your idea or proposed changes. Wait for them to ask questions before providing details. Do the same in semi-private channels where people tend to be respectful (and hopefully supportive).

    Great! However, remember that governance proposals potentially impact many stakeholders, which can happen in unexpected ways. Introduce your idea with members of the community before investing resources into drafting a proposal. At this point you should seek out and carefully consider critical feedback in order to protect yourself from confirmation bias. This is the ideal time to see a critical flaw, because submitting a flawed proposal on-chain will waste resources and have reputational costs.

    Posting your idea to the Cosmos Hub Forum is a great way to get broad feedback and perspective even if you don't have personal connections to any stakeholders or involved parties.

    There will likely be differences of opinion about the value of what you're proposing to do and the strategy by which you're planning to do it. If you've considered feedback from broad perspectives and think that what you're doing is valuable and that your strategy should work, and you believe that others feel this way as well, it's likely worth drafting a proposal. However, remember that the largest KIMA stakers have the biggest vote, so a vocal minority isn't necessarily representative or predictive of the outcome of an on-chain vote.

    You could choose to take a conservative approach and wait until you have some confidence that you roughly have initial support from a majority of the voting power before proceeding to drafting the details of your proposal. Or you could propose the idea, or define the problem statement and let the community participate freely in drafting competing solutions to solve the issue.

    The next major section outlines and describes some potential elements of drafting a proposal. Ensure that you have considered your proposal and anticipated questions that the community will likely ask. Once your proposal is on-chain, you will not be able to change it.

    It will be important to balance two things: being detailed and being concise. You'll want to be concise so that people can assess your proposal quickly. You'll want to be detailed so that voters will have a clear, meaningful understanding of what the changes are and how they are likely to be impacted.

    Each major proposal type has a rough template available on the forum: Text, community pool spend, parameter change, software upgrade.

    Each proposal should contain a summary with key details about what the proposal hopes to change. If you were viewing only the summary with no other context, it should be a good start to being able to make a decision.

    Assume that many people will stop reading at this point. However it is important to provide in-depth information. The on-chain proposal text should also include a link to an un-editable version of the text, such as an IPFS pin, and a link to where discussion about the idea is happening.

    A few more pointers for Parameter Change and Community Spend proposals are below.

    An example of a successful parameter change proposal is Proposal #66. Note that this proposal went on-chain without the recommended IPFS pin.

    • Problem/Value: The problem or value that's motivating the parameter change(s).

    • Solution: How changing the parameter(s) will address the problem or improve the network.

    • Risks & Benefits: How making this/these change(s) may expose stakeholders to new benefits and/or risks.

      • The beneficiaries of the change(s) (ie. who will these changes impact and how?)

      • Voters should understand the importance of the change(s) in a simple way

    • Supplementary materials: Optional materials eg. models, graphs, tables, research, signed petition, etc

    An example of a successful community spend proposal is Proposal #63.

    Applicant(s) - The profile of the person(s)/entity making the proposal. Who you are and your involvement in Kima and/or other blockchain networks. An overview of team members involved and their relevant experience. Problem - What you're solving and/or opportunity you're addressing. Past, present (and possibly a prediction of the future without this work being done). Solution - How you're proposing to deliver the solution. Your plan to fix the problem or deliver value. The beneficiaries of this plan (ie. who will your plan impact and how?). Your reasons for selecting this plan. Your motivation for delivering this solution/value. Funding - amount and denomination proposed eg. 5000 KIMA. The entity controlling the account receiving the funding. Consider an itemized breakdown of funding per major deliverable. Note that the 'budget' of a spend proposal is generally the easiest thing to criticize. If your budget is vague, consider explaining the reasons you're unable to give a detailed breakdown and be clear about what happens if you do not meet your budget. Deliverables and timeline - the specifics of what you're delivering and how, and what to expect. What are the specific deliverables? (be detailed). When will each of these be delivered? How will each of these be delivered? What will happen if you do not deliver on time? Do you have a plan to return the funds if you're under-budget or the project fails? How will you be accountable to the KIMA stakeholders? How will you communicate updates and how often? How can the community observe your progress? How can the community provide feedback? How should the quality of deliverables be assessed? eg. metrics. Relationships and disclosures. Have you received or applied for grants or funding? for similar work? eg. from the Interchain Foundation. How will you and/or your organization benefit? Do you see this work continuing in the future and is there a plan? What are the risks involved with this work? Do you have conflicts of interest to declare? Begin with a well-considered draft proposal​

    Ideally, a proposal is first sent to the forum in Markdown format so that it can be further edited and available for comments. A changelog is a great tool so that people can see how the idea has developed over time and in response to feedback.

    This Markdown-formatted post can eventually become the description text in a proposal sent on-chain.

    Post a draft of your proposal as a topic in the appropriate category of the forum. Hub Proposals is a catch-all if you are not sure where to post, but there are categories for all types of proposals. Directly engage key members of the community for feedback. These could be large contributors, those likely to be most impacted by the proposal, and entities with high stake-backing (eg. high-ranked validators; large stakers). Alert the entire community to the draft proposal on other platforms such as Twitter, tagging accounts such as the Cosmos Hub account, the Cosmos Governance account, and other governance-focused groups.

    Before going to mainnet, you can test your proposal on the testnet.

    This is a great way to make sure your proposal looks the way you want and refine it before heading to mainnet.

    A majority of the voting community should probably be aware of the proposal and have considered it before the proposal goes live on-chain. If you're taking a conservative approach, you should have reasonable confidence that your proposal will pass before risking deposit contributions. Make revisions to your draft proposal after each stage of engagement.

    See the submitting guide for more on submitting proposals.

    The deposit period currently lasts 14 days. If you submitted your transaction with the minimum deposit (10,000 KIMA), your proposal will immediately enter the voting period. If you did not submit the minimum deposit amount, then this may be an opportunity for others to show their support by contributing (and risking) their KIMA as a bond for your proposal. You can request contributions openly and also contact stakeholders directly (particularly stakeholders who are enthusiastic about your proposal). Remember that each contributor is risking their funds, and you can read more about the conditions for burning deposits here.

    This is a stage where proposals may begin to get broader attention. Some block explorers display proposals in the deposit period, while others don't show them until they hit the voting period.

    A large cross-section of the blockchain/cryptocurrency community exists on Twitter/X. Having your proposal in the deposit period is a good time to engage the so-called 'crypto Twitter' Kima community to prepare validators to vote (eg. tag @cosmosvalidator) and KIMA-holders that are staking (eg. tag @cosmoshub, @CosmosGov).

    At this point you will want to track which validator has voted and which has not. You'll want to re-engage directly with top stake-holders, ie. the highest-ranking validator operators, to ensure that:

    • They are aware of your proposal

    • They can ask you any questions about your proposal; and

    • They are prepared to vote.

    Remember that any voter may change their vote at any time before the voting period ends. That historically doesn't happen often, but there may be an opportunity to convince a voter to change their vote. The biggest risk is that stakeholders won't vote at all (for a number of reasons). Validator operators tend to need multiple reminders to vote.

    How you choose to contact validator operators, how often, and what you say is up to you--remember that no validator is obligated to vote, and that operators are likely occupied by competing demands for their attention. Take care not to stress any potential relationship with validator operators.

    Engage directly with the voting community and seek feedback​

    Stage 1: Your Idea​

    Confident with your idea?​

    Are you ready to draft a governance proposal?​

    Stage 2: Your Draft Proposal​

    Proposal Elements​

    Parameter Change​

    Community-Spend Proposal​

    Engage the community with your draft proposal​

    Submit your proposal to the testnet​

    Stage 3: Your On-Chain Proposal​

    The deposit period​

    The voting period​

    originSymbol (string): the token symbol the user will pay with (or bridge from)

  • targetAddress (string): the receiving address

  • targetChain (string): the destination chain

  • targetSymbol (string): the token symbol being delivered

  • feeTarget* the gas fee for the target chain

  • feeTotal* the total fee in USD

  • transactionValues: amounts used for token authorization and for submitting the transaction

    • feeFromOrigin: amounts used when the user selects to pay fees from the origin amount

      • allowanceAmount: the token amount to authorize. For regular ERC-20 tokens this is the value to pass to approve(). For Permit2 tokens, use it when building the Permit2 authorization/signature flow.

      • submitAmount: the amount that needs to be passed to submit endpoints

    • feeFromTarget: amounts used when the user selects to pay fees from the target amount

  • )
  • For regular ERC-20 tokens, use that value in approve(). For Permit2 tokens, use it in the Permit2 authorization flow.

  • The amount sent to submit endpoint is amount RECEIVED on the target chain

  • Therefore the amount sent to submit endpoint is 10 USDK (feeFromOrigin.submitAmount)

    • Also included is the feeId and signature

  • The user receives 10 USDK on Solana

  • For regular ERC-20 tokens, use that value in approve(). For Permit2 tokens, use it in the Permit2 authorization flow.

  • The amount sent to submit endpoint is 9.926290 USDK (feeFromTarget.submitAmount)

  • The fees are deducted from the amount received on Solana so the user receives 9.926290 USDK on Solana

  • Reading token metadata

    BTC-origin note

    Using the Kima Backend

    http://localhost:3001/submit/fees?amount=10&originAddress=0x742d35Cc6634C0532925a3b844Bc454e4438f44e&originChain=ARB&originSymbol=USDK&targetAddress=5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA&targetChain=SOL&targetSymbol=USDK
    {
      "feeId": "5af06c68-44d6-4079-8e5b-bec1cfa154c7",
      "feeOriginGasFiat": "0.009105",
      "feeOriginGasBigInt": {
        "value": 9105204603000000,
        "decimals": 18
      },
      "feeKimaProcessingFiat": "0.05",
      "feeKimaProcessingBigInt": {
        "value": 50000,
        "decimals": 6
      },
      "feeTargetGasFiat": "0.014605",
      "feeTargetGasBigInt": {
        "value": 14605,
        "decimals": 6
      },
      "feeTotalFiat": "0.07371",
      "feeTotalBigInt": {
        "value": 73710,
        "decimals": 6
      },
      "transactionValues": {
        "feeFromOrigin": {
          "allowanceAmount": {
            "value": 10073710000000000000,
            "decimals": 18
          },
          "submitAmount": {
            "value": 10000000000000000000,
            "decimals": 18
          },
          "message": "I approve the transfer of 10.07371 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL."
        },
        "feeFromTarget": {
          "allowanceAmount": {
            "value": 10000000,
            "decimals": 6
          },
          "submitAmount": {
            "value": 9926290,
            "decimals": 6
          },
          "message": "I approve the transfer of 10 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL."
        }
      },
      "peggedTo": "USD",
      "expiration": "2025-05-07T00:24:24Z"
    }

    originAddress → empty string ('') for FIAT rails.

    (number),
  • the same options mechanism (incl. FIAT rules above when origin is BANK/CC).

  • For FIAT rails:

    • MUST include a non-empty transactionIdSeed (UUIDv4),

    • MUST include the derived transactionIdSignature,

    • MUST NOT include the crypto approval signature (it’s removed for FIAT).

    • MUST include the paymentMethod value in the options field:

    Ensure originChain is normalized to 'FIAT' and originAddress is empty before calling the Kima submit API.

    — boolean (optional)
  • transactionIdSeed — required

  • transactionIdSignature — required (derived from the seed server-side)

  • for FIAT.
  • Normalize originChain (CC/BANK → FIAT) and blank originAddress for FIAT.

  • Remove crypto approval signature from options for FIAT.

  • Implement /submit/swap with dex, slippage, amountIn/Out.

  • Always call the fee estimator first and pass the returned feeId into options.

  • Update any client code to supply a UUIDv4 transactionIdSeed for BANK/CC flows.

  • npm install @kimafinance/kima-transaction-widget
    git pull
    // body: { ..., originChain: 'BANK', fiatTransactionIdSeed: '<uuid-v4>', options: '{"feeId":"...","paymentMethod":"sepaEur"}' }
    let options = JSON.parse(req.body.options);
    
    if (["FIAT", "CC", "BANK"].includes(req.body.originChain)) {
      const seed = req.body.fiatTransactionIdSeed || options.transactionIdSeed; // allow either field
    
      if (!seed) {
        return res
          .status(400)
          .json({ error: "transactionIdSeed is required for FIAT rails" });
      }
    
      // Your helper must RETURN both the signature AND retain the seed
      const { options: fiatOpts } = await generateFiatOptions(seed);
    
      // Merge in but KEEP the seed inside options too
      options = { ...options, ...fiatOpts, transactionIdSeed: seed };
      delete options.signature; // never send crypto approval signature for FIAT
    }
    
    const payload = {
      originAddress: ["CC", "BANK"].includes(req.body.originChain)
        ? ""
        : req.body.originAddress,
      originChain: ["CC", "BANK"].includes(req.body.originChain)
        ? "FIAT"
        : req.body.originChain,
      // ...rest
      options: JSON.stringify(options),
    };
    
    // submitKimaTransferTransaction(payload)

    🚨 Breaking Changes

    1) “FIAT rails” normalization & required IDs

    2) New /submit/swap endpoint + signed approval (light mode)

    3) Options field is stringified JSON and stricter

    Kima Transaction Widget

    Backend

    A) Transfers (POST /submit/transfer)

    B) Swaps (POST /submit/swap)

    C) Fees (no endpoint change, but expectations do)

    D) Helper endpoints (optional)

    Migration Checklist

    React Widget
    kima-transaction-backend

    Configuration Options

    There are numerous ways to configure the Widget for your own preferences and the look and feel of your dApp, which you can do via the following props:

    The Theme prop controls whether the Widget is in light or dark mode and their background colours:

    • Required

    • Type: ThemeOptions

      • colorMode (required): ColorModeOptions.light | ColorModeOptions.dark

    options: { paymentMethod: 'sepaEur' | 'creditCard' | 'swiftUsd' }
  • backgroundColorLight (optional): string

  • backgroundColorDark (optional): string

  • The Title prop enables you to give the widget whatever title you want and can be configured for each step of the widget.

    • Optional

    • Type: TitleOption:

      • initialTitle (optional): string

      • confirmTitle (optional): string

    The PaymentTitle prop allows you to optionally set the title that appears on the payment screen if you are using the Payment component.

    • Optional

    • Type: PaymentTitleOption

      • title (optional): string

      • style (optional): object

    This is a string, which should be to your own help documentation or FAQ. If unset, the link will default to Kima's help documentation.

    • Optional

    • Type: string

    • Required: true

    • Type: ModeOptions

      • payment: Payment scenario

      • bridge: Bridge scenario

      • status: mode for of a specific Kima transaction

    Used to specify the transaction flow scenario of the Widget. See the individual scenarios for more information.

    Sets the default chain, wallet, and amount in the Widget. Required for the Payment mode, optional for the Bridge mode.

    • Payment mode: Required, Bridge mode: Optional

    • Type: TransactionOption

      • sourceChain (optional): ChainName

      • targetChain (required): ChainName

      • targetAddress (required): string

      • amount (required): number

      • currency (required): string

    ⚠️ transactionOption.currency must be a token symbol supported by Kima for the selected environment (mainnet or testnet) and target chain. Resolve valid symbols dynamically from your backend /chains response.

    Used in Status mode to specify the transaction to track progress for. If omitted in Status mode, the widget will display the transaction search form instead.

    • Status mode: Optional

    • Type: number | string

    • Default: unset

    compliantOption

    • Required: false

    • Type: boolean

    • Default: false

    If your app requires compliance checks, please contact us at support@kima.finance for more information. When false (the default), compliance checks are disabled. When enabled, checks are made to determine if an address meets compliance requirements, for example whether it is sanctioned or blocked. A failed compliance check results in the transaction being rejected. See the Compliance section in the Kima Transaction Backend

    Used to provide the widget with wallet connection, custom state handlers and backend endpoint.

    Endpoint that will be used as intermediary to communicate with the Kima blockchain. It is needed to fetch the active environment, chain details, and submit transactions through the SDK. This is one of the few props that is mandatory to set, because there are several endpoints which the widget expects to exist on the backend. The examples assume the backend server is exposed locally at localhost:4000. Replace this with the URL of your backend.

    Port note: the backend itself commonly runs on localhost:3001, but some local frontend setups expose or proxy it on localhost:4000. Always use the actual URL and port where your backend is reachable from the app that embeds the widget.

    • Required: true

    • type: string

    Used to specify the Reown project id. Visit Reown Cloud and sign up for a free account to obtain a project id.

    • Required: true

    • Type: string

    Optional custom Solana RPC endpoint passed into the widget provider. Use this if you want the widget to use your own Solana RPC instead of the default provider.

    • Required: false

    • Type: string

    Example:

    If there is already a wallet connection logic elsewhere in your app, an external provider can be passed in. Otherwise, the widget will handle the connection logic on its own.

    • Required: false

    • Type: ExternalProvider

    • Optional

    • Type: function

    Called when an error occurs. Useful for debugging and logging.

    • Optional

    • Type: function

    Called when the widget is closed.

    • Optional

    • Type: function

    Called when the transaction is successful.

    • Optional

    • Type: LogLevel

      • trace

      • debug

      • info

      • warn

      • error (default)

      • silent

    Specify the log level of the widget. Use this to help debug issues with the widget. The default is error. This can also be set via the ENV variable LOG_LEVEL or the library-specific variants NEXT_PUBLIC_LOG_LEVEL, VITE_LOG_LEVEL. The widget property will overwrite the ENV variable as it gets applied when the widget loads.

    DEBUG mode: Type D E B U G while focus is on the Widget (not in the console) to enable debug mode. This will set the log level to debug and log all messages to the console. Type it again to disable debug mode and restore the default log level. Useful to temporarily toggle logging in the browser when in production or an already deployed app where changing the ENV variable would require a redeploy.

    Configuration options

    Configure the widget's look and feel

    Theme

    <KimaTransactionWidget
      theme={{
        colorMode: ColorModeOptions.light,
        backgroundColorLight: "#CCCCCC", // background color of widget when light mode
        backgroundColorDark: "#FFDDFF", // background color of widget when dark mode
      }}
    />
    <KimaTransactionWidget
      titleOption={{
        initialTitle: "New Purchase",
      }}
    />
    <KimaTransactionWidget
      paymentTitleOption={{
        title:
          "You can now purchase our NFT on Polygon, using funds from other chains.",
        style: {
          fontSize: "1.2em",
          fontWeight: "500",
        },
      }}
    />
    import {
      ChainName,
      KimaProvider,
      KimaTransactionWidget,
    } from "@kimafinance/kima-transaction-widget";
    
    <KimaProvider
      projectId="your-project-id"
      kimaBackendUrl="http://localhost:4000"
    >
      <KimaTransactionWidget
        transactionOption={{
          targetChain: ChainName.AVALANCHE,
          targetAddress: "0x8222ADB2A2092c3774105a5F558987265D920C09",
          amount: 5,
          currency: "USDC",
        }}
      />
    </KimaProvider>;
    <KimaProvider
      projectId="your-project-id"
      kimaBackendUrl="http://localhost:4000"
      solRPC="https://your-solana-rpc.example"
    >
      <KimaTransactionWidget
        theme={{ colorMode: ColorModeOptions.light }}
        mode={ModeOptions.bridge}
      />
    </KimaProvider>

    Title

    Payment Title

    HelpUrl

    mode: Configure the widget's functionality

    TransactionOption

    txId

    Compliance

    Configure Kima Provider

    kimaBackendUrl

    projectId

    solRPC

    externalProvider

    errorHandler

    closeHandler

    successHandler

    logLevel

    Submitting the Transaction

    Once the user has prepared approval (non-BTC origin) or HTLC lock data (BTC origin), it’s time to construct the submit request to the Kima Transaction Backend. Use transactionValues returned by the /submit/fees endpoint.

    Again, like for message signing, select the appropriate submit amount based on whether the user is paying fees from the origin or target chain.

    • If the user is paying fees from the origin, use transactionValues.feeFromOrigin.submitAmount.

    • If the user is paying fees from the target, use transactionValues.feeFromTarget.submitAmount.

    POST /submit/transfer (or POST /submit/swap for swaps) Request Body:

    • originAddress (Address): sending user address

    • originChain (string): sending chain

    • originSymbol (string): sending token symbol

    ⚠️ FIAT-origin flows are only supported through the Kima widget. This guide documents direct backend usage for crypto-origin and BTC-origin flows only.

    For non-BTC origin transactions, omit these fields.

    Field
    Type
    What it is
    Source

    For BTC-origin swap requests (POST /submit/swap), use the same HTLC fields above in addition to swap fields (amountIn, amountOut, dex, slippage).

    See the list of chain short names in the section.

    Make sure the decimals for the bigint amounts are all the same. You may need to convert the value for feeTotalBigint to the same decimals as the submitAmount before passing it to the backend.

    Success Response:

    • height: number

    • txIndex: number

    • code: number: error code; will be zero when successful

    The transaction Id will be needed to fetch the transaction status. The following code can be used to extract the Id from the submit response.

    If provided, the Kima Backend will use the url defined in the ENV var COMPLIANCE_URL to get the risk score for the origin and target user addresses.

    • 403: one or more addresses failed compliance

    • 500: the compliance check itself failed or another internal error occurred

    tracking the status
    targetAddress (Address): receiving user address
  • targetChain (string): receiving chain

  • targetSymbol (string): receiving token symbol

  • amount (bigint string): amount of token received by the target address

  • fee (bigint string): amount of token that Kima consumes to pay gas fees for pulling & releasing token transactions

  • decimals (number): the number of decimals for the bigint amounts. This must match the decimals of the token to be transferred. For details please refer to the Supported Tokens reference

  • options (string- JSON stringified object)

    • chargeFeeAtTarget (boolean): true if the user should pay fees on the target chain, false otherwise

    • feeId (string): the fee id obtained from /submit/fees

    • signature (string): for non-BTC origin, the signature from the user's wallet from signing the approval message

    • permit2 (object): additionally required when selected origin token has isPermit2=true

      • r (string)

      • s (string)

  • number

    output index in the lock transaction

    POST /btc/htlc/record response

    htlcExpirationTimestamp

    string

    HTLC timeout value

    POST /btc/htlc/record response

    htlcVersion

    string

    HTLC script version identifier (currently p2wsh-sha256-cltv-v1)

    POST /btc/htlc/record response

    senderPubKey

    string

    sender public key (hex)

    POST /btc/htlc/record response

    htlcAddress

    string

    HTLC destination address

    POST /btc/htlc/lock-intent response

    htlcAmountSats

    string

    locked BTC amount in sats

    selected lock amount (amountSats)

    htlcLockId

    string

    backend lock intent id

    POST /btc/htlc/lock-intent response

    transactionHash: string
  • events: Event[]

    • type: string

    • attributes: Attribute[]

      • key: string

      • value: string

  • rawLog?: string

  • data?: MsgData[]

  • msgResponses: Uint8Array

  • gasUsed: bigint

  • gasWanted: bigint

  • htlcCreationHash

    string

    BTC tx hash that created the HTLC output

    POST /btc/htlc/record response

      const txValues = feeFromOrigin
        ? feeData.transactionValues.feeFromOrigin
        : feeData.transactionValues.feeFromTarget
    
      const response = await fetch(
        `${backendUrl}/submit/transfer`,
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            originAddress,
            originChain,
            targetAddress,
            targetChain,
            originSymbol,
            targetSymbol,
            amount: txValues.submitAmount.value.toString(),
            fee: feeData.feeTotalBigInt.value.toString(),
            decimals: txValues.submitAmount.decimals,
            options: JSON.stringify({
              // For non-BTC origin flows:
              signature,
              // For Permit2 tokens, also send:
              // permit2: { r, s, v, deadline },
              feeId,
              chargeFeeAtTarget: !feeFromOrigin
            })
          })
      )
      const txValues = feeFromOrigin
        ? feeData.transactionValues.feeFromOrigin
        : feeData.transactionValues.feeFromTarget
    
      // Step 1: lock intent
      const lockIntent = await fetch(`${backendUrl}/btc/htlc/lock-intent`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          senderAddress: originAddress,
          senderPubkey: senderPubkeyHex,
          recipientAddress: targetAddress,
          amountSats: lockAmountSats
        })
      }).then((r) => r.json())
    
      // Step 2: user wallet sends BTC to lockIntent.htlcAddress and returns txid
      const txid = await sendBitcoin(lockIntent.htlcAddress, lockAmountSats)
    
      // Step 3: record tx and get submit-ready HTLC values
      const record = await fetch(`${backendUrl}/btc/htlc/record`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ lockId: lockIntent.lockId, txid })
      }).then((r) => r.json())
    
      // Step 4: submit transfer with HTLC context
      const response = await fetch(`${backendUrl}/submit/transfer`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          originAddress,
          originChain: "BTC",
          targetAddress,
          targetChain,
          originSymbol,
          targetSymbol,
          amount: txValues.submitAmount.value.toString(),
          fee: feeData.feeTotalBigInt.value.toString(),
          decimals: txValues.submitAmount.decimals,
          htlcCreationHash: record.htlcCreationHash,
          htlcCreationVout: record.htlcCreationVout,
          htlcExpirationTimestamp: record.htlcExpirationTimestamp,
          htlcVersion: record.htlcVersion,
          senderPubKey: record.senderPubKey,
          htlcAddress: lockIntent.htlcAddress,
          htlcAmountSats: lockAmountSats,
          htlcLockId: lockIntent.lockId,
          options: JSON.stringify({
            feeId,
            chargeFeeAtTarget: !feeFromOrigin
          })
        })
      })
    export function getTransactionId(submitResult: any): number {
      let txId = -1;
      if (submitResult?.code !== 0) {
        return txId;
      }
    
      for (const event of submitResult.events) {
        if (event.type === "transaction_requested") {
          for (const attr of event.attributes) {
            if (attr.key === "txId") {
              txId = attr.value;
            }
          }
        }
      }
    
      return txId;
    }

    Submitting the Transaction

    BTC-origin fields (required when originChain=BTC)

    Non-BTC origin example (/submit/transfer)

    BTC-origin example (/submit/transfer)

    Get Transaction Id

    Validation

    Supported Assets

    htlcCreationVout

    The Kima Transaction Back End

    This is a web server that works as middleware between the Kima Transaction Widget and Kima Chain. Once it receives a transaction request from the widget, it will submit a transaction to Kima Chain signed by a local wallet.

    The server is an Express application and requires minimal setup. Here are the instructions:

    We recommend Keplr, which is a widely used wallet for blockchains within the Cosmos ecosystem.

    Install it from and make sure you back it up by saving the seed phrase.

    You will need to record the mnemonic seed phrase rather than the private key, as the seed phrase is used as an environment variable.

    ⚠️ In order to connect to the Kima chain (both Mainnet and Sardis Testnet), you will need to get your Kima address whitelisted. Please contact us at with your public address- it will start with kima1. This is a temporary measure to combat spammers.

    You can find your Kima address in the Keplr wallet by

    Approval

    Before Kima can move user funds, the origin asset must be authorized through the mechanism that applies to that flow:

    • Regular ERC-20 tokens use an on-chain approve() transaction

    • Permit2 tokens use a signature-based approval flow

    • BTC-origin flows use an HTLC lock instead of ERC-20 approval

    v (number)

  • deadline (number)

    • Clicking the "Copy Address" button

    • Find "Kima" in the list of chains

    • Click the "Copy Address" button

    If you have not yet added the Kima Network to Keplr, you can enter "Kima" in the "Search for a chain" field when copying the address.

    Get Kima Address from Keplr wallet

    If you are developing on the KIMA testnet, you can acquire test KIMA tokens from our faucet site. For mainnet, there is a list of exchanges where you can buy KIMA tokens here.

    Follow the instructions here if you have not used a faucet before.

    https://github.com/kima-finance/kima-transaction-backend

    For local development, create a .env file in the project root and copy the relevant values from .env.sample.

    This repository does not currently include docker-compose.yml, docker-compose-prod.yml, or separate /env/*.env files. If you containerize the backend in your own environment, pass the same variables from .env.sample through your deployment platform or container runtime.

    The .env file will be ignored by git, but .env.sample is not, so do NOT accidentally fill real secrets into the sample file.

    A few notes about these environment variables:

    KIMA_BACKEND_MNEMONIC is the seed phrase from the wallet you installed. Never share this with anyone. Never commit this to a code repository. Use a secret manager service like Google Secret Manager or AWS Secrets Manager to store your seed phrase instead of putting it in the .env file.

    KIMA_ENVIRONMENT is separate from the NODE_ENV variable and determines whether information endpoints like /chains will return testnet or mainnet values.

    DOMAIN is a comma separated list of urls that the server will accept requests from. All other domains will be blocked (except in the dev environment). Put the url of your frontend here.

    COMPLIANCE_URL (OPTIONAL) If your app needs to block non-compliant addresses contact us for more information and the url to use here.

    /chains/env returns the environment metadata expected by the widget. A typical response looks like this:

    Field meanings:

    • env: active Kima environment used by the widget to configure network behavior

    • kimaExplorer: explorer base URL used for status and transaction links

    • transferLimitMaxUSDT: optional transfer cap used by light mode and validation logic

    • paymentPartnerId: FIAT widget partner identifier used by widget-managed payment flows

    Here are the mainnet specific environment variables. See the .env.sample for the most up to date list of ENV variables and default values. The other vars you will need to fill in with your specific values.

    You can run:

    npm install

    then

    npm run dev

    If you deploy the backend in a container or cloud runtime, provide the same environment variables shown above through that platform's configuration.

    In your terminal, run the following command:

    The server should respond with a 200 and a JSON body similar to:

    See OpenAPI documentation at /docs for more details (only available when NODE_ENV is development). The following is an overview of how the routes are used together.

    • Get various info for the frontend from /chains/* like supported chains, tokens, pool addresses, etc.

      • Token entries in /chains include isPermit2 metadata. Use this to decide whether submit options must include a Permit2 payload.

    • GET /submit/fees: get the service fees and token authorization amounts

      • The response includes feeTotalFiat and feeTotalBigInt for the total fee value.

      • Returns a ready-to-use transactionValues.*.allowanceAmount object with value and decimals, representing the origin token authorization amount. For regular ERC-20 tokens, pass the value using the accompanying decimals

    • POST /submit/transfer: initiates a transfer transaction and returns data containing the Kima transaction id

    • POST /submit/swap: initiates a swap transaction and returns data containing the Kima transaction id

    • GET /tx/{txId}/status: use the transaction id returned from submit to get the transaction status

    • BTC route group (/btc/*) for BTC-origin flows:

      • GET /btc/balance?address={address}: fetch BTC balance (sats) for an address

      • POST /btc/htlc/lock-intent: create HTLC lock intent and return lock metadata

    For origin tokens where /chains reports isPermit2: true:

    • submit payload options.signature is still required

    • submit payload options must include permit2

    • permit2 requires r, s, v, deadline

    • mode=light is not supported for Permit2 tokens

    In BTC-origin flows, funds are first sent to an HTLC address. This creates an on-chain lock with a timeout.

    • Before timeout: funds are handled according to the HTLC conditions.

    • After timeout: the lock can be reclaimed according to HTLC rules.

    In Kima, that BTC lock transaction is recorded via /btc/htlc/record, and the returned HTLC metadata is attached to /submit/transfer or /submit/swap.

    Timing is confirmation-based and variable.

    • BTC confirmation threshold is chain-parameter driven (default BTC confirmation blocks: 6).

    • Observer validation waits until the required number of confirmations is reached.

    • Observer hash collection and processing run on a periodic cadence (about every 5 seconds).

    Because mempool, block production, and validator consensus timings vary, this flow should be treated as variable-time (no fixed minute SLA).

    In /src/custom-transaction-validation.ts you can add your own custom validation logic. Kima does not know the requirements of your app, so it is up to you to make sure the transaction makes sense. This is a convenience function, feel free to modify the middleware if you need lower level access.

    The customTransValidation function

    • Will be called in middleware after basic param validation and before the /submit/transfer or /submit/swap route handler is called

    • Should return a string with the error message or the empty string if the transaction is valid.

    The following are some example of things you may want to check:

    • When accepting cross chain payment for goods and services

      • Ensure the targetAddress is your app's payment address

      • Check the chains are supported by your app

    Chain filtering is an optional feature that can be enabled by setting the KIMA_CHAIN_FILTER environment variable. This will:

    • Filter the chains returned by the /chains endpoint and therefore the options listed in the React component

    • Restricts the allowed chains for /submit/transfer and /submit/swap, causing a 400 error if the chain is not allowed

    It supports two modes:

    • whitelist: Only chains in the whitelist will be returned.

    • blacklist: Only chains not in the blacklist will be returned.

    This is a JSON object with the following structure:

    • origin: Filter for the origin chain

      • mode: The mode to use. Can be whitelist or blacklist

      • chains: An array of chain short names to filter

    • target: Filter for the target chain

      • mode: The mode to use. Can be whitelist or blacklist

      • chains

    FIAT rails note:

    • Request-level origin chain values can be CC and BANK.

    • Backend normalizes CC and BANK to FIAT before submitting to Kima Chain via kima-transaction-api.

    • If you want to block FIAT-origin flows robustly, include CC and BANK in your origin filter.

    Example: only ARB and OPT chains are allowed for the origin and all chains except TRX are allowed for the target:

    Example filtering out FIAT-origin rails (CC / BANK / normalized FIAT):

    The stringified version:

    If enabled by supplying the COMPLIANCE_URL environment variable, use GET /compliant/enabled to check whether compliance is active, and GET /compliant to check whether an address meets compliance requirements.

    Use this in the frontend to check if an address is not compliant BEFORE the authorization step. When compliance is enabled, /submit/transfer and /submit/swap return status 403 (Forbidden) for non-compliant addresses.

    If you are interested in using compliance, contact us at support@kima.finance for more information and the URL to use here.

    If using the KYC in the widget:

    • GET /uuid will return the external identifier you need

    • POST /kyc returns the KYC status for a specific uuid verification session

    Again, please contact us for more information on how to implement this feature.

    Create a wallet for development purposes

    here
    dev@kima.finance
    {
      "env": "testnet",
      "kimaExplorer": "https://explorer.sardis.kima.network",
      "transferLimitMaxUSDT": "100.000000000000000000",
      "paymentPartnerId": "KimaTest"
    }
    KIMA_BACKEND_FEE_URL=https://fcs.kima.network
    KIMA_BACKEND_NODE_PROVIDER=https://rpc.kima.network
    KIMA_BACKEND_NODE_PROVIDER_GRAPHQL=https://graphql.kima.network/v1/graphql
    KIMA_BACKEND_NODE_PROVIDER_QUERY=https://api.kima.network
    KIMA_ENVIRONMENT=mainnet
    KIMA_EXPLORER=https://explorer.kima.network
    PAYMENT_PARTNER_ID=Kima
    KIMA_BACKEND_FEE_URL=https://fcs.sardis.kima.network
    KIMA_BACKEND_NODE_PROVIDER=https://rpc.sardis.kima.network
    KIMA_BACKEND_NODE_PROVIDER_GRAPHQL=https://graphql.sardis.kima.network/v1/graphql
    KIMA_BACKEND_NODE_PROVIDER_QUERY=https://api.sardis.kima.network
    KIMA_ENVIRONMENT=testnet
    KIMA_EXPLORER=https://explorer.sardis.kima.network
    PAYMENT_PARTNER_ID=KimaTest
    curl -i http://localhost:3001/health
    {
      "ok": true,
      "env": "development"
    }
    const SUPPORTED_CHAINS = ["ARB", "SOL"];
    const isSupportedChain = (chain: string) => SUPPORTED_CHAINS.includes(chain);
    
    export const customTransValidation = async (
      req: SubmitTransRequest
    ): Promise<string> => {
      const { originChain, targetAddress, targetChain } = req.body;
    
      // check if the target address is your app's payment address
      if (targetAddress !== (process.env.PAYMENT_ADDRESS as string)) {
        return "invalid target address";
      }
    
      // check if the chains are supported by your app
      if (!isSupportedChain(originChain)) {
        return "invalid origin chain";
      }
    
      if (!isSupportedChain(targetChain)) {
        return "invalid target chain";
      }
    
      // Transaction is valid
      return "";
    };
    {
      "origin": {
        "mode": "whitelist",
        "chains": ["ARB", "OPT"]
      },
      "target": {
        "mode": "blacklist",
        "chains": ["TRX"]
      }
    }
    {
      "origin": {
        "mode": "blacklist",
        "chains": ["CC", "BANK"]
      },
      "target": {
        "mode": "blacklist",
        "chains": ["ARB"]
      }
    }
    KIMA_CHAIN_FILTER='{"origin":{"mode":"blacklist","chains":["CC","BANK"]},"target":{"mode":"blacklist","chains":["ARB"]}}'

    Get some KIMA tokens to use for transaction fees

    Clone the repo at:

    Set your environment variables

    Mainnet

    Testnet

    Install and start

    Test the installation

    Available routes

    Permit2 Tokens

    What is an HTLC lock?

    Expected timing model for BTC-origin flow

    Optional Features

    Custom Transaction Validation

    Chain Filtering

    Compliance

    KYC

    For regular ERC-20 approvals, there are 3 core components:
    • Owner address: User

    • Spender address: Kima Pool

    • Total amount: origin token amount plus gas fees

    GET /chains/pool returns a list of pool addresses and balances for all supported chains.

    Chain
    Type
    Pool Address

    EVM

    ecdsa

    0x9a721c664f9d69e4da24f91386086fbd81da23c1

    Solana

    eddsa

    You can also obtain the pool addresses from the TSS endpoint. Use the type in the chart above to determine which one to use.

    Use the environment-appropriate API base URL:

    • Mainnet: GET https://api.kima.network/kima-finance/kima-blockchain/kima/tss_pubkey

    • Testnet: GET https://api.sardis.kima.network/kima-finance/kima-blockchain/kima/tss_pubkey

    Bitcoin is also supported. For BTC, prefer GET /chains/pool from the backend; the backend derives the BTC pool address from the TSS data (reserved or ecdsaPubkey) for the active environment.

    Success Response:

    • tssPubkey (array object)

      • tssPubKey: string

      • ecdsa: string

      • eddsa: string

      • reserved: string

    • pagination (object)

      • nextKey: string | null

      • total: number

    Note: for Tron, the hex ecdsa address must be converted to a base 58 checksum address.

    The fees and token authorization amounts are calculated by an endpoint exposed by Kima chain. This endpoint also returns a feeId which must be included when submitting the transaction.

    GET /submit/fees

    Query Params (all required):

    • amount (number): the amount of tokens to transfer

    • originAddress (string): the source user address

    • originChain (string): the chain the user tokens will come from

    • originSymbol (string): the token symbol the user will pay with (or bridge from)

    • targetAddress (string): the receiving address

    • targetChain (string): the destination chain

    • targetSymbol (string): the token symbol being delivered

    Example:

    Port note: these direct backend examples use the backend's default local port 3001. If your frontend or local proxy exposes the backend on another port such as 4000, use that URL instead.

    Example note: these sample fee requests and responses use USDK, which is a testnet token. If you are integrating against mainnet, replace it with a supported mainnet token such as USDC.

    Success Response:

    Amounts are returned as both numbers representing the amount in whole tokens and as a string representing the integer amount in the smallest unit of the token (e.g. USDC is 6 decimals).

    • feeId (string): a unique identifier for the fee; include this in the submit request (/submit/transfer or /submit/swap)

    • feeOrigin* the gas fee for the origin chain

    • feeKimaProcessing* The processing fee (currently 0.05%)

    • feeTarget* the gas fee for the target chain

    • feeTotal* the total fee

    • transactionValues: amounts used for token authorization and for submitting the transaction

      • feeFromOrigin: amounts used when the user selects to pay fees from the origin amount

        • allowanceAmount: the token amount to authorize. For regular ERC-20 tokens this is the value to pass to approve()

    The response field is still named allowanceAmount, but treat it as the origin token authorization amount. There are 2 variants returned depending on whether the user chooses to pay fees from the origin or target amount.

    • When paying fees from the origin, use transactionValues.feeFromOrigin values.

    • When paying fees from the target, use transactionValues.feeFromTarget.

    Example:

    Transferring 10 USDK from ARB to SOL with 0.07371 USD in total fees.

    When paying fees from the origin

    • The total fees are added to the amount

    • User signs the message I approve the transfer of 10.07371 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL. (feeFromOrigin.message)

    • The authorization amount is 10.07371 USDK (feeFromOrigin.allowanceAmount)

    • For regular ERC-20 tokens, use that value in approve(). For Permit2 tokens, use it in the Permit2 authorization flow.

    • The amount sent to submit endpoints is amount RECEIVED on the target chain

    • The amount sent to submit endpoints is 10 USDK (feeFromOrigin.submitAmount)

      • Also included is the feeId and signed message

    • The user receives 10 USDK on Solana

    When paying fees from the target chain

    • The user does not pay fees on Arbitrum

    • User signs the message I approve the transfer of 10 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL. (feeFromTarget.message)

    • The authorization amount is 10 USDK (feeFromTarget.allowanceAmount)

    • For regular ERC-20 tokens, use that value in approve(). For Permit2 tokens, use it in the Permit2 authorization flow.

    • The amount sent to submit endpoints is 9.926290 USDK (feeFromTarget.submitAmount)

    • The fees are deducted from the amount received on Solana so the user receives 9.926290 USDK on Solana

    Save the corresponding submitAmount, message and feeId for later as they are needed to submit the transaction.

    See the short names in the Supported Assets section.

    There is also an endpoint that can be called directly.

    POST {{baseUrl}}/v3/fees/calculate

    It has the same input/output purpose as the Backend /submit/fees endpoint except:

    • The params are in the body as JSON

    • There is an extra param creator which is the Kima address of the developer wallet sending the transaction- kima1...

    For most integrations, GET /submit/fees remains the recommended wrapper because it keeps your app aligned with the backend contract.

    Read the selected origin token metadata from GET /chains.

    • isPermit2=false: use the standard approve flow shown below.

    • isPermit2=true: signature is still required, and submit with options.permit2 payload (r, s, v, deadline) in addition.

    • Permit2 tokens are not supported in mode=light.

    BTC-origin transactions do not use ERC20 approve. Instead, funds are first locked in a BTC HTLC output and then submitted to Kima with HTLC metadata.

    You should still call GET /submit/fees first and keep feeId for the final submit step.

    POST /btc/htlc/lock-intent

    Request body:

    • senderAddress (string): BTC sender address

    • senderPubkey (string): BTC sender public key (hex)

    • recipientAddress (string): recipient address used to construct the lock script

    • amountSats (string): lock amount in satoshis

    • poolAddress (string, optional): explicit BTC recipient in script

    • lockBlocks (number, optional): timeout as block delta

    • timeout (number, optional): explicit timeout value

    Response includes:

    • lockId

    • htlcAddress

    • timeoutHeight

    • amountSats

    • senderPubkey

    Use the user's BTC wallet/provider to send amountSats to the returned htlcAddress. Save the broadcast transaction hash (txid).

    POST /btc/htlc/record

    Request body:

    • lockId

    • txid

    Response returns submit-ready HTLC fields:

    • htlcCreationHash

    • htlcCreationVout

    • htlcExpirationTimestamp

    • htlcVersion (currently p2wsh-sha256-cltv-v1)

    • senderPubKey

    Use these together with:

    • htlcAddress and htlcLockId from lock-intent

    • htlcAmountSats from the selected lock amount

    These values are then sent to POST /submit/transfer or POST /submit/swap.

    Once all the info has been collected it’s time to make the on chain call. The exact details of how this is done depends on the origin chain and library used.

    The getClientsForChain() and getPoolAddressesForChain() would be utility functions defined elsewhere.

    [
      {
        "chainName": "SOL",
        "poolAddress": "5tvyUUqPMWVGaVsRXHoQWqGw6h9uifM45BHCTQgzwSdr",
        "balance": [
          {
            "amount": "99684.841000000000000000",
            "tokenSymbol": "USDK",
            "decimal": "6"
          }
        ],
        "nativeGasAmount": "70.119964040000000000"
      },
      {
        "chainName": "TRX",
        "poolAddress": "TQ3qmAgUgMwrY9prMiHLZmF43G4Jk8bxNF",
        "balance": [],
        "nativeGasAmount": ""
      }
    ]
    http://localhost:3001/submit/fees?amount=1337&originAddress=0x742d35Cc6634C0532925a3b844Bc454e4438f44e&originChain=BSC&originSymbol=USDK&targetAddress=5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA&targetChain=SOL&targetSymbol=USDK
    http://localhost:3001/submit/fees?amount=10&originAddress=TQ3qmAgUgMwrY9prMiHLZmF43G4Jk8bxNF&originChain=TRX&originSymbol=USDK&targetAddress=0x742d35Cc6634C0532925a3b844Bc454e4438f44e&targetChain=ARB&targetSymbol=USDK
    {
      "feeId": "5af06c68-44d6-4079-8e5b-bec1cfa154c7",
      "feeOriginGasFiat": "0.009105",
      "feeOriginGasBigInt": {
        "value": 9105204603000000,
        "decimals": 18
      },
      "feeKimaProcessingFiat": "0.05",
      "feeKimaProcessingBigInt": {
        "value": 50000,
        "decimals": 6
      },
      "feeTargetGasFiat": "0.014605",
      "feeTargetGasBigInt": {
        "value": 14605,
        "decimals": 6
      },
      "feeTotalFiat": "0.07371",
      "feeTotalBigInt": {
        "value": 73710,
        "decimals": 6
      },
      "transactionValues": {
        "feeFromOrigin": {
          "allowanceAmount": {
            "value": 10073710000000000000,
            "decimals": 18
          },
          "submitAmount": {
            "value": 10000000000000000000,
            "decimals": 18
          },
          "message": "I approve the transfer of 10.07371 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL."
        },
        "feeFromTarget": {
          "allowanceAmount": {
            "value": 10000000,
            "decimals": 6
          },
          "submitAmount": {
            "value": 9926290,
            "decimals": 6
          },
          "message": "I approve the transfer of 10 USDK from ARB to 5FHwkrdxkjF7xoL2ncGh4AEYs1KyJzz5MeiaHGz8h8GA on SOL."
        }
      },
      "peggedTo": "USD",
      "expiration": "2025-05-07T00:24:24Z"
    }
    import {
      getClientsForChain,
      getPoolAddressesForChain,
      getServiceFee,
    } from "../utils";
    
    export async function approve(
      chain: ChainName,
      userAddress: Address,
      amount: string
    ) {
      const { publicClient, walletClient } = getClientsForChain(chain);
      const { contractAddress, poolAddress } = getPoolAddressesForChain(chain);
    
      // simulate approval call
      const { request } = await publicClient.simulateContract({
        account: userAddress,
        address: contractAddress,
        abi: erc20Abi,
        functionName: "approve",
        args: [poolAddress, amount],
      });
    
      const hash = await walletClient.writeContract(request);
    
      const receipt = await publicClient.waitForTransactionReceipt({ hash });
    
      return receipt;
    }

    Getting the Kima Pool Address

    Using the Kima Backend

    Using the Kima API

    Getting the Service Fee

    Using the Kima Backend

    Chain Names

    Using the Kima API

    Permit2 Tokens

    BTC-origin flow (approval equivalent)

    Step 1: Create HTLC lock intent

    Step 2: Broadcast BTC lock transaction

    Step 3: Record the broadcast transaction

    Calling Approve

    . For Permit2 tokens, use it when building the Permit2 authorization/signature flow.
  • submitAmount: the amount that needs to be passed to submit endpoints

  • feeFromTarget: amounts used when the user selects to pay fees from the target amount

  • 5tvyUUqPMWVGaVsRXHoQWqGw6h9uifM45BHCTQgzwSdr

    Tron

    ecdsa (base58)

    TQ3qmAgUgMwrY9prMiHLZmF43G4Jk8bxNF

    context to
    approve()
    . For Permit2 tokens, use the same amount data when building the Permit2 authorization flow. Bigints are used to avoid floating point errors.
  • The required authorization step must be completed before submitting the transaction or the transfer will fail.

  • Use the submitAmount when calling /submit/transfer or /submit/swap; it is already properly adjusted based on whether fees are deducted from origin or target.

  • Use the decimals property to convert to a number if needed elsewhere.

  • POST /btc/htlc/record: record a broadcast BTC lock transaction and return submit-ready HTLC fields

  • GET /btc/height: get current BTC chain height from configured mempool backend

  • GET /btc/tip: get current BTC tip height and timestamp

  • GET /btc/outspend?txid={txid}&vout={index}: fetch spend status for a specific transaction output

  • GET /btc/transaction?hash={txid}: fetch BTC transaction details

  • GET /btc/utxo/{address}: fetch UTXO set for an address

  • : An array of chain short names to filter

    Supported tokens

    Mainnet

    • USDC

    • USDT

    • USD1 (Ethereum, Solana)

    • EURC (Avalanche, Base, Ethereum, Solana)

    • HONEY (Berachain)

    • WBTC (Bitcoin)

    Blockchain
    Token
    Contract Address
    Decimals
    Permit2

    We use fake stablecoins for testing called USDK, EURK, and USDK2. You can get some for free from the .

    ℹ️ In this documentation, Bitcoin testnet is listed as BTC for simplicity, even though some API responses expose the underlying token symbol as WBTC.

    • USDK: Kima testnet USD pegged stablecoin

    • EURK: Kima testnet EURO pegged stablecoin

    • USDK2: Kima testnet USD pegged token used for Permit2 flows

    Blockchain
    Token
    Contract Address
    Decimals
    Permit2

    Arbitrum

    USDC

    Arbitrum Sepolia

    TFRNT

    Testnet

    faucet

    6

    No

    Arbitrum

    USDT

    6

    -

    Arbitrum

    WETH

    18

    -

    Avalanche-C

    USDC

    6

    No

    Avalanche-C

    USDT

    6

    -

    Avalanche-C

    EURC

    6

    No

    Base

    USDC

    6

    Yes

    Base

    EURC

    6

    No

    Berachain

    HONEY

    18

    -

    Binance Smart Chain

    USDC

    18

    -

    Binance Smart Chain

    USDT

    18

    -

    Ethereum

    USDC

    6

    No

    Ethereum

    USDT

    6

    -

    Ethereum

    USD1

    18

    -

    Ethereum

    EURC

    6

    No

    Ethereum

    WETH

    18

    -

    Optimism

    USDC

    6

    No

    Optimism

    USDT

    6

    -

    Optimism

    WETH

    18

    -

    Polygon

    USDC

    6

    No

    Polygon

    USDT

    6

    -

    Polygon

    WETH

    18

    -

    Solana

    USDC

    6

    N/A

    Solana

    USDT

    6

    N/A

    Solana

    USD1

    6

    N/A

    Solana

    EURC

    6

    N/A

    Solana

    FRNT

    6

    N/A

    Solana

    WSOL

    9

    N/A

    Tron

    USDT

    6

    N/A

    Worldchain

    USDC

    6

    No

    Bitcoin

    WBTC

    N/A

    8

    No

    Fiat

    USD

    N/A

    2

    N/A

    Fiat

    EUR

    N/A

    2

    N/A

    6

    No

    Arbitrum Sepolia

    USDK

    6

    No

    Arbitrum Sepolia

    USDK2

    18

    Yes

    Avalanche Fuji

    EURK

    6

    No

    Avalanche Fuji

    USDK

    6

    No

    Avalanche Fuji

    USDK2

    18

    Yes

    Base Sepolia

    EURK

    6

    No

    Base Sepolia

    TFRNT

    6

    No

    Base Sepolia

    USDK

    6

    No

    Base Sepolia

    USDK2

    18

    Yes

    Berachain Bepolia

    USDK

    6

    No

    Berachain Bepolia

    USDK2

    18

    Yes

    Binance Smart Chain Testnet

    USDK

    6

    No

    Binance Smart Chain Testnet

    USDK2

    18

    Yes

    Bitcoin Testnet

    BTC

    N/A

    8

    No

    Ethereum Sepolia

    EURK

    18

    No

    Ethereum Sepolia

    USDK

    6

    No

    Ethereum Sepolia

    USDK2

    18

    Yes

    Ethereum Sepolia

    WBTC

    8

    No

    Fiat

    EUR

    N/A

    2

    No

    Fiat

    USD

    N/A

    2

    No

    Optimism Sepolia

    TFRNT

    6

    No

    Optimism Sepolia

    USDK

    6

    No

    Optimism Sepolia

    USDK2

    18

    Yes

    Polygon Amoy

    TFRNT

    6

    No

    Polygon Amoy

    USDK

    6

    No

    Polygon Amoy

    WBTC

    8

    No

    Solana Devnet

    EURK

    9

    No

    Solana Devnet

    TFRNT

    6

    No

    Solana Devnet

    USDK

    6

    No

    Tron Nile Testnet

    USDK

    6

    No

    Tron Nile Testnet

    USDK2

    18

    Yes

    0xaf88d065e77c8cC2239327C5EDb3A432268e5831
    0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9
    0x82af49447d8a07e3bd95bd0d56f35241523fbab1
    0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E
    0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7
    0xC891EB4cbdEFf6e073e859e987815Ed1505c2ACD
    0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
    0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42
    0xFCBD14DC51f0A4d49d5E53C2E0950e0bC26d0Dce
    0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d
    0x55d398326f99059fF775485246999027B3197955
    0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
    0xdAC17F958D2ee523a2206206994597C13D831ec7
    0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d
    0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c
    0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
    0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85
    0x94b008aa00579c1307b0ef2c499ad98a8ce58e58
    0x4200000000000000000000000000000000000006
    0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
    0xc2132d05d31c914a87c6611c10748aeb04b58e8f
    0x7ceb23fd6bc0add59e62ac25578270cff1b9f619
    EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
    Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
    USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB
    HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr
    FRNTPi9V3Sw9b9U8d5Q3WY7tNANT6Q394d7dYtv7Jdog
    So11111111111111111111111111111111111111112
    TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
    0x79A02482A880bCE3F13e09Da970dC34db4CD24d1
    0x81055Bc42D5F4eED4742233983fc598d6640B10a
    0x2cf79df2879902a2fc06329b1760e0f2ad9a3a47
    0x742894064F7434f3E9DeA61119f56319c79FA268
    0xd29ccaF2f4EEafF1f49cAF871AaeaF4780c67eF0
    0x5d8598Ce65f15f14c58aD3a4CD285223c8e76a2E
    0x742894064F7434f3E9DeA61119f56319c79FA268
    0xC9421eB9e4942cb156310Dcf218321D66de4f0D3
    0x81055Bc42D5F4eED4742233983fc598d6640B10a
    0x2B0F2060d358a2DF51dBc4147a09445b11EF5D41
    0x5Fb3f10825Eaf17238dc5259Ced9798A50d75383
    0xe5dB851969B4d8EE8A023F4b991CbED6e39dca80
    0x866e28934d2836f111617b7540efc0b2da426d0e
    0x3eb36be2c3FD244139756F681420637a2a9464e3
    0xbF97Be86bed5cDcd82adC467E19D46dd02A29B9e
    0x6B8Db7F19Be371fCFeE7a695b1438690518d4E13
    0x5FF59Bf2277A1e6bA9bB8A38Ea3F9ABfd3d9345a
    0x429353CBfe23b46429a5db8c3496158700e4ad2C
    0x20211626DF509E2f5530CA94fadC5499A809D809
    0x81055Bc42D5F4eED4742233983fc598d6640B10a
    0x2cf79df2879902a2fc06329b1760e0f2ad9a3a47
    0x30bB90e2348665EEC88783b735667Cf47a0eeb50
    0x81055Bc42D5F4eED4742233983fc598d6640B10a
    0x30171cfb10ed578814a22475a190306776bc8392
    0x66E1537e2A62168Ca19Bf5b6e2E66b5C806b8ab1
    4X7SWEPfa8e1fhSseJQBK7rNPqnniePLffCJMGvEDh9u
    FHYdL2jU5CN7PKQrtf3YBqRNfMWdtKuJfzegw3PN5Sk4
    9YSFWfU9Ram6mAo2QP9zsTnA8yFkkkFGEs3kGgjtQKvp
    TEuRmCALTUY2syY1EE6mMYnyfmNfFfMpYz
    TKHLZR1k6pt8Pi45LvgUPJTHcpd9fskDpS