Asset Conversion
Wallet and UI Developers
The DOT ACP UI project is part of Polkadot initiative for building front-end and UI for Asset Conversion Pallet on Polkadot's Asset Hub. Currently, the app is deployed on Westend and Kusama here.
The tutorial below demonstrates the complete journey from creating a liquidity pool on Paseo test net and exploring all of the key functionalities of Asset Conversion pallet.
Create a Liquidity Pool¶
If there is no existing liquidity pool for an asset on Asset Hub, the first step is to create a liquidity pool. If you are looking for a guide on how to create an asset on Asset Hub, it is available here.
The create_pool function is used to create an empty liquidity pool along with a new lp_token
asset. This asset's ID is announced in the Event::PoolCreated event. After creating a pool,
liquidity can be added to it via the Pallet::add_liquidity function.
For example, the snapshot below shows how to create liquidity pool with PAS tokens and EDU
tokens with the asset ID 149 on Paseo Asset Hub. Creating this extrinsic requires knowledge of
XCM Multilocations. From the perspective of AssetHub,
an Asset Hub, the asset with an AssetId of 149 has a MultiLocation of
{
parents: 0,
interior: {
X2: [{PalletInstance: 50}, {GeneralIndex: 149}]
}
}
The PalletInstance of 50 represents the Assets pallet on Asset Hub and the GeneralIndex is the
AssetId of the asset.

The lp_token ID created for this pool is 24, and
here is the event for
reference.
Liquidity Provision¶
The add_liquidity function allows users to provide liquidity to a pool composed of two assets. It
requires specifying the desired amounts for both assets and minimum acceptable amounts. The function
calculates an optimal contribution of assets, which may differ from the desired amounts but will not
be less than the specified minimums. Liquidity providers receive liquidity tokens representing their
share of the pool.
For example, the snapshot below shows how to provide liquidity to the pool with PAS tokens and
EDU tokens with the asset ID 149 on Paseo Asset Hub. The intention is to provide liquidity of 1
PAS token (u128 value of 1000000000000 as it has 12 decimals) and 100 EDU tokens (u128
value of 1000000000000 as it has 10 decimals).

After successful submission of the extrinsic above, LP tokens are minted to the specified account. Below is the snapshot of the liquidity pool on the DOT ACP UI.

Swap Assets¶
Swap from an exact amount of Tokens¶
The swap_exact_tokens_for_tokens function allows users to swap a precise amount of one asset for
another within a specified liquidity pool, ensuring the user receives at least a minimum expected
amount of the second asset in return. This function aims to provide predictability in trading
outcomes, allowing users to manage their asset exchanges with confidence regarding the minimum
return.
For example, the snapshot below shows how to swap PAS tokens to EDU tokens with the asset ID
149 on Paseo Asset Hub. The intention is to swap 0.1 PAS tokens (u128 value of 100000000000
as it has 12 decimals) to at least 9 EDU tokens (u128 value of 90000000000 as it has 10
decimals).

Below is the snapshot of the liquidity pool on the
DOT ACP UI. after successful submission of the
extrinsic above. It can be observed that the pool now has 1.1 ROC tokens and around 9.06 EDU
tokens are transferred out of it.

Swap to an exact amount of Tokens¶
On the other hand, the swap_tokens_for_exact_tokens function allows users to trade a flexible
amount of one asset to precisely obtain a specified amount of another asset. It ensures that users
do not spend more than a predetermined maximum amount of the initial asset to acquire the exact
target amount of the second asset, providing a way to control the cost of the transaction while
achieving the desired outcome.
For example, the snapshot below shows how to swap EDU tokens with the asset ID 149 on Paseo
Asset Hub to PAS Tokens. The intention is to swap for obtaining 0.1 PAS tokens (u128 value of
100000000000 as it has 12 decimals) for a maximum of 10 EDU tokens (u128 value of
100000000000 as it has 10 decimals).

Below is the snapshot of the liquidity pool on the DOT ACP UI. after successful submission of the extrinsic above.

Withdraw Provided Liquidity¶
The remove_liquidity function allows users to withdraw their provided liquidity from a pool,
receiving back the original assets. When calling this function, users specify the amount of
liquidity tokens (representing their share in the pool) they wish to burn. They also set minimum
acceptable amounts for the assets they expect to receive back. This mechanism ensures users can
control the minimum value they receive, protecting against unfavourable price movements during the
withdrawal process​.
For example, the snapshot below shows how to remove liquidity by specifying the number of LP tokens.
In exchange of removing around half of the liquidity of the pool, the expecation is that we receive
at least 0.4 ROC tokens (u128 value of400000000000 as it has 12 decimals) and 40 EDU tokens
(u128 value of 400000000000 as it has 10 decimals).

Below is the snapshot of the liquidity pool on the DOT ACP UI. after successful submission of the extrinsic above.
