🧱Astroport Factory
Contract used to create new Astroport pairs
1. Overview
The factory contract can create new Astroport pair contracts which are tracked in a registry. Right now, the only available pair types are constant product, stableswap, and non-boosted constant product pairs.
The factory contract code can be found here.
2. Variables & Functions
Constants
CONTRACT_NAME
The factory contract name
CONTRACT_VERSION
The current factory version
INSTANTIATE_PAIR_REPLY_ID
A reply
call code ID used in a sub-message
TMP_PAIR_INFO
Mapping that saves pair info key
CONFIG
Struct that stores general contract params
PAIRS
Array that stores created pairs, in the order they were created
PAIR_CONFIGS
Mapping that stores configurations for each pair type
MAX_LIMIT
The maximum amount of pairs that can be retrieved at once when querying for data
DEFAULT_LIMIT
The default amount of pairs that are retrieved when querying for data
OWNERSHIP_PROPOSAL
Struct that stores the latest ownership transfer proposal
Structs
InstantiateMsg
This struct holds data used to instantiate the factory contract
pair_configs
- Initial pair type configurations available in the factory
token_code_id
- The code ID of the token implementation used in Astroport pairs (CW20)
fee_address
- The Maker contract address
generator_address
- The Generator contract address
owner
- The address of the contract owner
whitelist_code_id
- CW1 w
Config
This struct holds general contract parameters
owner
- The current contract owner
token_code_id
- The code ID of the token implementation used in Astroport pairs (CW20)
generator_address
- The Generator contract address
fee_address
- The Maker contract address
whitelist_code_id
- CW1 whitelist contract code id used to store 3rd party rewards for staking Astroport LP tokens
TmpPairInfo
This is an intermediate struct for storing a pair's key. It is used in a sub-message response.
pair_key
- The key (uint8) associated with a pair in the factory
UpdateConfig
This struct holds newly proposed config parameters used to update values in the factory contract.
token_code_id
- The code ID of the token implementation used in Astroport pairs (CW20)
fee_address
- The Maker contract address
generator_address
- The Generator contract address
whitelist_code_id
- CW1 whitelist contract code id used to store 3rd party rewards for staking Astroport LP tokens
PairConfig
This struct holds data about a pair type's configuration.
code_id
- The code ID used to instantiate pairs of this type
pair_type
- The pair type (XYK, stableswap etc)
total_fee_bps
- The total amount of fees charged on a swap (e.g if set to 30, it means 30 bps)
maker_fee_bps
- The amount of fees (out of total fees) that go to governance (e.g if set to 3333, 33.33% of the fees go to governance; max possible is 10,000 which is 100%)
is_disabled
- Whether the pair type is disabled which means no more pairs of this type can be created
ConfigResponse
This struct holds parameters returned when someone queries the contract configuration.
owner
- the current contract owner
pair_configs
- The current available pair type configurations
token_code_id
- The code ID of the token implementation used in Astroport pairs (CW20)
fee_address
- The Maker contract address
generator_address
- The Generator contract address
whitelist_code_id
- CW1 whitelist contract code id used to store 3rd party rewards for staking Astroport LP tokens
MigrateMsg
This struct holds parameters used in a contract migration.
whitelist_code_id
- CW1 whitelist contract code id used to store 3rd party staking rewards for Astroport LP tokens
PairsResponse
This struct is used to return an array of PairInfo
structs.
pairs
- The array of pairs being returned
FeeInfoResponse
This struct holds returns the fee configuration for a specific pair type.
fee_address
- The Maker contract address
total_fee_bps
- The total amount of fees charged on a swap (e.g if set to 30, it means 30 bps)
maker_fee_bps
- The amount of fees (out of total fees) that go to governance (e.g if set to 3333, 33.33% of the fees go to governance; max possible is 10,000 which is 100%)
ConfigV100
This struct holds general contract parameters.
owner
- the current contract owner
token_code_id
- The code ID of the token implementation used in Astroport pairs (CW20)
generator_address
- The Generator contract address
fee_address
- The Maker contract address
Struct Logic
PairConfig
The implementation checks if total_fee_bps
and maker_fee_bps
are both lower than or equal to 10,000
Functions
pair_key
(asset_infos: &[AssetInfo; 2])
->
Vec<u8>
Retrieve the key for a specific pair. AssetInfo
is imported from the asset file
read_pairs
(deps: Deps
, start_after: Option<[AssetInfo; 2]>
, limit: Option<u32>)
->
Vec<Addr>
Return an array of pair addresses; start to read pair addresses from the pair that has the assets specified in start_after. AssetInfo
is imported from the asset file
query_pair_info
(deps: Deps
, pair_contract: &Addr)
->
StdResult<PairInfo>
Return the information about a specific pair by passing a reference to a pair contract address. PairInfo
is imported from the asset file
instantiate
(deps: DepsMut
, _env: Env
, _info: MessageInfo
, msg: InstantiateMsg)
->
Result<Response, ContractError>
Instantiate the factory contract
execute
(deps: DepsMut
, env: Env
, info: MessageInfo
, msg: ExecuteMsg)
->
Result<Response, ContractError>
Execute a function from the contract
execute_update_config
(deps: DepsMut
, _env: Env
, info: MessageInfo
, param: UpdateConfig)
->
Result<Response, ContractError>
Update the general contract configuration. Only the owner
can call this
execute_update_pair_config
(deps: DepsMut
, info: MessageInfo
, pair_config: PairConfig)
->
Result<Response, ContractError>
Update the configuration for a pair type. Only the owner
can call this
execute_create_pair
(deps: DepsMut
, env: Env
, pair_type: PairType
, asset_infos: [AssetInfo; 2]
, init_params: Option<Binary>)
create a new Astroport pair. Anyone can call this function. A pair can only be created if the assets mentioned in asset_infos
don't already have a pair. AssetInfo
is imported from the asset file
deregister
(deps: DepsMut
, info: MessageInfo
, asset_infos: [AssetInfo; 2])
->
Result<Response, ContractError>
Deregister a pair from the factory. Someone else can create a new pair for the assets in asset_infos. AssetInfo
is imported from the asset file
query
(deps: Deps
, _env: Env
, msg: QueryMsg)
->
StdResult<Binary>
Access point for all contract queries
query
(deps: Deps
, _env: Env
, msg: QueryMsg)
->
StdResult<ConfigResponse>
Return the contract configuration
query_pair
(deps: Deps
, asset_infos: [AssetInfo; 2])
->
StdResult<PairInfo>
Retrieve information about a specific pair. PairInfo
and AssetInfo
are imported from the asset file
query_pairs
(deps: Deps
, start_after: Option<[AssetInfo; 2]>
, limit: Option<u32>)
->
StdResult<PairsResponse>
Return information about multiple pairs. AssetInfo
is imported from the asset file
query_fee_info
(deps: Deps
, pair_type: PairType)
->
StdResult<FeeInfoResponse>
Return the fee configuration for a specific pair type
migrate
(deps: DepsMut
, _env: Env
, msg: MigrateMsg)
->
Result<Response
, ContractError>
Migrate the contract to a new implementation
3. Pool Creation & Querying Walkthrough
Each pool within an AMM system may use a different algorithm for swapping tokens and determining token prices based on the ratio of the two tokens in the pool — thus, we say that these different algorithms define different "pool types".
Different tokens have different properties and characteristics; therefore, different pool types can be more or less appropriate for a particular token. Choosing the appropriate pool type for a given token can increase efficiency for both traders and LPs. Right now, the Factory contract stores the following pool types:
Constant Product Pools - Good choice for pairs with high volatility (e.g. mBTC-UST), as they facilitate trading at all possible prices, even during large, sudden market moves.
Stableswap Pools - Most suitable for ‘stable’ pairs, where each token is meant to represent the same underlying value.
Non-Boosted Constant Product Pools - Works just like Astroport’s standard constant product pools. However, they send a much larger percentage of their fees to LPs but in return, they are not eligible for ASTRO emissions. Altering the fee structure for these long-tail pools will make Astroport competitive with other Terra DEXs where fees go entirely to LPs.
Total fee and reward details for different pool types are listed below:
Constant Product
0.3% / 30bps
0.2% -> LPs 0.1% -> ASTRO Stakers
Yes
Stableswap
0.05% / 5bps
0.025% -> LPs 0.025% -> ASTRO Stakers
Yes
Non-Boosted Constant Product
0.3% / 30bps
0.28% -> LPs 0.02% -> ASTRO Stakers
No
Factory Contract Queries
query_config
The factory contract can be queried for data about each pool type. Calling the query_config
function will return:
the
owner
of the contract. After the initial bootstrapping of Astroport contracts, ownership will be transferred from the Astroport Multisig to the Astral Assembly Contract.the different
pair_types
("xyk"
,"stable"
, and"XYK-2BPS"
)the
total_fee_bps
for each pool (30bps for"xyk"
/"XYK-2BPS"
pools and 5bps for"stable"
pools)the
maker_fee_bps
for each pool (50%, 33.3%, and 6.67% for"stable"
,"xyk"
, and"XYK-2BPS"
pools respectively)the
fee_address
(Maker Contract)
{
"config": {}
}
fee_info
fee_info
The Factory contract also allows queries for the fee_info
for individual pair_types
. These queries return the fee_address
, the total_fee_bps
, and the maker_fee_bps
for each.
{
"fee_info": {
"pair_type": {
"xyk": {}
}
}
}
pairs
pairs
The Factory contract can be queried for paginated information about multiple pairs, including their contract_addr
and liquidity_token
. The query accepts a limit
for the number of pairs to return and a timestamp to start_after
(pools that were created after start_after
are taken into consideration).
{
"pairs": {}
}
Create a Pool
create_pair
create_pair
When an address executes the CreatePair
operation, it creates an Astroport Pair
contract and an associated Liquidity Token
contract. It also creates a PairInfo
struct with information about the newly created pair.
The CreatePair
operation takes in a pair_type
and asset_infos
for each of the two tokens in the pool. asset_infos
for each token can include a CW-20 contract_addr
or a native_token
denomination. init_params
accepts binary serialized parameters for custom pool types.
{
"create_pair": {
"pair_type": {
"xyk": {}
},
"asset_infos": [
{
"token": {
"contract_addr": "terra..."
}
},
{
"native_token": {
"denom": "uusd"
}
}
]
}
}
Deregister a Pool
deregister
deregister
An address can execute the deregister
operation to deregister an already registered pair (deletes a pair from the factory). Deregistering is subject to a governance decision.
The deregister
operation takes inasset_info
for each of the two tokens in the pool. asset_info
for each token can include a CW-20 contract_addr
or a native_token
denomination.
{
"deregister": {
"asset_infos": [
{
"token": {
"contract_addr": "terra..."
}
},
{
"native_token": {
"denom": "uusd"
}
}
]
}
}
Astroport Pair and Liquidity Token Contracts
pair
After executing the CreatePair
operation, the factory contract can be queried to reveal an Astroport pair's contract_addr
and liquidity token
. The pair
query takes in asset_infos
for each of the two tokens in a given pool and returns information about the specific pair. asset_infos
for each token can include a CW-20 contract_addr
or a native_token
denomination.
{
"pair": {
"asset_infos": [
{
"token": {
"contract_addr": "terra..."
}
},
{
"native_token": {
"denom": "uusd"
}
}
]
}
}
Astroport Pair Contract (contract_addr
)
contract_addr
)pair
The contract_addr
for an Astroport pair
can also be queried to confirm the same information returned in the Factory pair
query.
{
"pair": {}
}
pool
The contract_addr
for an Astroport pair can be queried for general information regarding the pool
, including the amount of tokens deposited into the pair and the total_share
which is the total amount of LP tokens currently issued.
{
"pool": {}
}
Liquidity Token Contract (liquidity_token
)
liquidity_token
)balance
The liquidity_token
contract for an Astroport pair can be queried to return a balance,
or the amount of LP tokens a specific address has.
{
"balance": {
"address": "terra..."
}
}
token_info
The liquidity_token
contract for an Astroport pair can be queried to return token_info
, including the name
of the LP token, its symbol
and the total_supply.
{
"token_info": {}
}
minter
The liquidity_token
contract can be queried to return the minter
address. The minter
address should be the same as the contract_addr
, which is a pool created by the Factory contract.
{
"minter": {}
}
Last updated
Was this helpful?