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...
Delegating your $KIMA tokens has multiple benefits. Most of these are related to enhancing network security, reducing operation complexity and increasing participation.
Delegation allows for a wider distribution of decision-making power and staking responsibilities, thus reducing centralization.
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.
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.
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.
If you want to dive deeper, you can find more technical detail in the two papers that are linked below.
This section describes how to upgrade the SDK to the latest version. There are 2 components to upgrade:
The frontend React Component: The Widget
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.
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.
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.
Please read the terms and conditions, privacy policy and disclaimer.
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/
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 .
The Kima Network has an on-chain governance mechanism for signaling (text proposals), changing parameters and allocating funds from the community pool.
Kima governance is driven by the Kima community. Proposals can be followed here.
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 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:
Payment
Bridge
Status
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 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.
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
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 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.
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>
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
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.
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.
If you haven't already,
Open Keplr, click the hamburger menu, and select "Add more chains" at the bottom (alternatively, you can browse to )
Connect your Keplr wallet
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.
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.
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.

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.



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
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.
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:
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)
Quorum is reached: A minimum of 33.40% of the network's total voting power (staked KIMA) is required to participate
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
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.

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




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-prettyconst 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 AppThe 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.

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.



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:
To withdraw an asset on any blockchain in the Kima Finance protocol,follow these steps:
Before withdrawing liquidity, make sure:
You have assets available for withdrawal.
You have at least 0.2 Kima tokens in your Keplr wallet.
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.
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:
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
CCandBANK, then normalized toFIATbefore submission. ℹ️ Documentation usesBerachainandBerachain Bepoliaas display names. API responses may useBeraorBerachain, while the stable short name remainsBERA.
Kima is currently available on the following testnets, which can be used for development and/or testing in the Kima Demo App:
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 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
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.
Visit the faucet site.
Select the network you want to send funds from, whether this is for payment or bridging.
Connect your wallet by clicking the Connect button.
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.
You will first need to have a wallet installed that is designed to interact with the Cosmos ecosystem, such as Keplr.
Visit the .
Connect your wallet by clicking the Connect button.
Go ahead and click the Get Free 10 KIMA button.
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.
ℹ️ Kima is constantly updating the available payment and settlement methods, currencies, and supported countries - stay tuned.
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.
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.
⚠️
txIdis the transaction id returned from/submit/transferor/submit/swap- not the transaction hash. I.e22843
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.
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:
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.
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 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.
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.
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.
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)
Some wallet options are Keplr (recommended), Station and Leap.
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.)
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
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
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
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.
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.
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.
From the "Source Network" dropdown, select "Bank Transfer"
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.
User selects the origin and target chains and amount.
Russian Federation
Syrian Arab Republic
United States
U.S. Minor Outlying Islands
U.S. Virgin Islands













































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.
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:
once for the approval transaction
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.
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.
I approve the transfer of {authorizationAmount} {originSymbol} from {originChain} to {targetAddress} on {targetChain}.npm install @kimafinance/kima-transaction-widgetgit pullBase 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
Avalanche
AVX
Base
BASE
Binance Smart chain
BSC
Berachain
BERA
Ethereum
ETH
Optimism
OPT
Polygon
POL
Solana
SOL
Tron
TRX
Worldchain
WLD
Bitcoin
BTC
Credit Card
FIAT
Bank Account
FIAT
Arbitrum Sepolia
ARB
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"
]
}<KimaProvider>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 />;
}The title and subtitle can be customized using the titleOption and paymentTitleOption props
⚠️
transactionOption.currencymust be a token symbol that is currently supported by Kima for the selected environment (mainnetortestnet) and selected chain. Resolve supported symbols dynamically from/chainsin your backend. ℹ️ The example below usesUSDC, which is valid on mainnet for Solana. If you are testing on Sardis, replace it with a supported testnet token such asUSDK.
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.
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.
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.
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.

/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:
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.
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.
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.
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.
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.
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.
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 .
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
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
The following steps outline the process of using the widget to buy stablecoins like USDC using a credit card.
From the "Source Network" dropdown, select "Credit Card"
From the "Target Network" dropdown, select the desired chain and token- i.e. USDT on Arbitrum
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 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.
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.
Please skip the KYC process by pressing the "Approve KYC" button. KYC will be required in the Mainnet version.
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
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.
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.
In this guide, you will learn how to delegate tokens to a validator using the Kima explorer.
Testnet explorer Mainnet explorer
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.
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.
Below is a step by-step guide on how to deposit assets:
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.
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
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>
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.
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 oering 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;
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
(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.




























Exit before period ends - no commission paid
Add KIMA to delegation will reset the period timer















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











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.
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.
git clone git@github.com:kima-finance/kima-external-validator.gitsudo chmod +x setup-validator.sh
sudo chmod +x update-config.sh
sudo chmod +x run-validator.sh cd $HOMEtouch .envcp .env.template .envETH_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: 5200000000002664gaiad q distribution community-pool --chain-id cosmoshub-4 --node <rpc-node-address>npm install @kimafinance/kima-transaction-widget redux react-redux pino-prettyimport 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/],
};
};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.



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:
POST /btc/htlc/lock-intent
User broadcasts BTC to the returned htlcAddress
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.
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
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.

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
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.
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.
transactionIdSeed — required
transactionIdSignature — required (derived from the seed server-side)
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-widgetgit 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)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.currencymust be a token symbol supported by Kima for the selected environment (mainnetortestnet) and target chain. Resolve valid symbols dynamically from your backend/chainsresponse.
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.
<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>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.
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
targetAddress (Address): receiving user addresstargetChain (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: stringevents: 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;
}htlcCreationVout
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
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.
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.
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.
{
"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=KimaKIMA_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=KimaTestcurl -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"]}}'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.
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=USDKhttp://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;
}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
approve()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

USDC
USDT
USD1 (Ethereum, Solana)
EURC (Avalanche, Base, Ethereum, Solana)
HONEY (Berachain)
WBTC (Bitcoin)
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
BTCfor simplicity, even though some API responses expose the underlying token symbol asWBTC.
USDK: Kima testnet USD pegged stablecoin
EURK: Kima testnet EURO pegged stablecoin
USDK2: Kima testnet USD pegged token used for Permit2 flows
Arbitrum
USDC
Arbitrum Sepolia
TFRNT
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