Skip to main content

Creating a Pair

Overview​

The factory contract can create new Astroport pair contracts (and associated LP token contracts) which are tracked in a registry and used as a directory for all pairs.

Currently, Astroport support's the following pool types:

  • Constant Product Pools
  • Stableswap Pools

Governance may decide to add custom pools that can have any implementation.

Constant Product Pools​

Creates an xyk pair.

create_pair​

To create an xyk pair, you need to execute a contract message pointing to the create_pair endpoint in the factory contract.

create_pair takes in the pair_type (xyk) and a vector containing objects of type AssetInfo (contract addresses or native denomenations for the pair).


_19
{
_19
"create_pair": {
_19
"pair_type": {
_19
"xyk": {}
_19
},
_19
"asset_infos": [
_19
{
_19
"token": {
_19
"contract_addr": astroAddress
_19
}
_19
},
_19
{
_19
"token": {
_19
"contract_addr": steakAddress
_19
}
_19
}
_19
]
_19
}
_19
}

feather.js example​

For example, if you want to create a pair on Terra, you can implement this operation using feather.js.


_40
const factoryAddress = `terra1z3y69xas85r7egusa0c7m5sam0yk97gsztqmh8f2cc6rr4s4anysudp7k0`;
_40
const astroAddress = 'terra167dsqkh2alurx997wmycw9ydkyu54gyswe3ygmrs4lwume3vmwks8ruqnv';
_40
const steakAddress = 'terra1xztnx8mm7dagn4ck3dgylaqucp6h6agw83pmyc29hnplq7355trs78fkcq'
_40
_40
const createPair = new MsgExecuteContract(
_40
wallet.key.accAddress('terra'),
_40
factoryAddress,
_40
{
_40
"create_pair": {
_40
"pair_type": {
_40
"xyk": {}
_40
},
_40
"asset_infos": [
_40
{
_40
"token": {
_40
"contract_addr": astroAddress
_40
}
_40
},
_40
{
_40
"token": {
_40
"contract_addr": steakAddress
_40
}
_40
}
_40
]
_40
}
_40
}
_40
)
_40
_40
let fee = new Fee(2000000, { uluna: 200000 });
_40
_40
// // BROADCAST TRANSACTION
_40
let tx = await wallet.createAndSignTx({
_40
msgs: [createPair],
_40
fee,
_40
chainID: 'pisco-1',
_40
});
_40
_40
let result = await lcd.tx.broadcast(tx, 'pisco-1');
_40
_40
console.log(result);

create_pair​

To create an xyk pair, you need to execute a contract message pointing to the create_pair endpoint in the factory contract.

create_pair takes in the pair_type (xyk) and a vector containing objects of type AssetInfo (contract addresses or native denomenations for the pair).

feather.js example​

For example, if you want to create a pair on Terra, you can implement this operation using feather.js.


_19
{
_19
"create_pair": {
_19
"pair_type": {
_19
"xyk": {}
_19
},
_19
"asset_infos": [
_19
{
_19
"token": {
_19
"contract_addr": astroAddress
_19
}
_19
},
_19
{
_19
"token": {
_19
"contract_addr": steakAddress
_19
}
_19
}
_19
]
_19
}
_19
}

Stableswap Pools​

Creates a stable pair.

create_pair​

To create a stable pair, you need to execute a contract message pointing to the create_pair endpoint in the factory contract like we did with xyk pairs above.

However, there are two key differences:

  • pair_type is now defined as stable: {}
  • init_params is used to pass in a binary encoded message. In this case, additional pool parameters needed for initializing stableswap pairs such as amplitude.

_24
{
_24
"create_pair": {
_24
"pair_type": {
_24
"stable": {}
_24
},
_24
"asset_infos": [
_24
{
_24
"token": {
_24
"contract_addr": lunaxAddress
_24
}
_24
},
_24
{
_24
"token": {
_24
"contract_addr": steakAddress
_24
}
_24
}
_24
],
_24
"init_params": toBase64(
_24
{
_24
"amp": 10
_24
}
_24
)
_24
}
_24
}

Encoding our Msg​

To encode our message, there are two common options:

The code in this section uses a custom function (toBase64) to display our binary message - this function needs to be defined elsewhere to be used. The actual string representation of our message would be an encoded binary.


_24
{
_24
"create_pair": {
_24
"pair_type": {
_24
"stable": {}
_24
},
_24
"asset_infos": [
_24
{
_24
"token": {
_24
"contract_addr": lunaxAddress
_24
}
_24
},
_24
{
_24
"token": {
_24
"contract_addr": steakAddress
_24
}
_24
}
_24
],
_24
"init_params": toBase64(
_24
{
_24
"amp": 10
_24
}
_24
)
_24
}
_24
}

toBase64​

The code in this section is an example of using feather.js to define a custom function to encode our init_params message.


_50
const factoryAddress = `terra1z3y69xas85r7egusa0c7m5sam0yk97gsztqmh8f2cc6rr4s4anysudp7k0`;
_50
const lunaxAddress = 'terra138fmmywk3zvqezaqwnxyv8kyr8k7q4e7latncv0xreej62u9mx0su95h7d';
_50
const steakAddress = 'terra1xztnx8mm7dagn4ck3dgylaqucp6h6agw83pmyc29hnplq7355trs78fkcq'
_50
_50
const toBase64 = (obj) => {
_50
return Buffer.from(JSON.stringify(obj)).toString("base64");
_50
};
_50
_50
const createStablePair = new MsgExecuteContract(
_50
wallet.key.accAddress('terra'),
_50
factoryAddress,
_50
{
_50
"create_pair": {
_50
"pair_type": {
_50
"stable": {}
_50
},
_50
"asset_infos": [
_50
{
_50
"token": {
_50
"contract_addr": lunaxAddress
_50
}
_50
},
_50
{
_50
"token": {
_50
"contract_addr": steakAddress
_50
}
_50
}
_50
],
_50
"init_params": toBase64(
_50
{
_50
"amp": 10
_50
}
_50
)
_50
}
_50
}
_50
)
_50
_50
_50
let fee = new Fee(2000000, { uluna: 200000 });
_50
_50
// // BROADCAST TRANSACTION
_50
let tx = await wallet.createAndSignTx({
_50
msgs: [createStablePair],
_50
fee,
_50
chainID: 'pisco-1',
_50
});
_50
_50
let result = await lcd.tx.broadcast(tx, 'pisco-1');
_50
_50
console.log(result);

create_pair​

To create a stable pair, you need to execute a contract message pointing to the create_pair endpoint in the factory contract like we did with xyk pairs above.

However, there are two key differences:

  • pair_type is now defined as stable: {}
  • init_params is used to pass in a binary encoded message. In this case, additional pool parameters needed for initializing stableswap pairs such as amplitude.

Encoding our Msg​

To encode our message, there are two common options:

The code in this section uses a custom function (toBase64) to display our binary message - this function needs to be defined elsewhere to be used. The actual string representation of our message would be an encoded binary.

toBase64​

The code in this section is an example of using feather.js to define a custom function to encode our init_params message.


_24
{
_24
"create_pair": {
_24
"pair_type": {
_24
"stable": {}
_24
},
_24
"asset_infos": [
_24
{
_24
"token": {
_24
"contract_addr": lunaxAddress
_24
}
_24
},
_24
{
_24
"token": {
_24
"contract_addr": steakAddress
_24
}
_24
}
_24
],
_24
"init_params": toBase64(
_24
{
_24
"amp": 10
_24
}
_24
)
_24
}
_24
}