βοΈFine-Tuning Allocation Points
In this tutorial, we will cover fine-tuning allocation points for pools. These are pools that receive ASTRO emissions every block.
Code Overview
// setup
const { LCDClient, MnemonicKey, MsgExecuteContract } = require('@terra-money/terra.js');
async function main() {
const terra = new LCDClient({
URL: 'https://pisco-lcd.terra.dev',
chainID: 'pisco-1',
});
const mk = new MnemonicKey({
mnemonic: ''
});
const wallet = terra.wallet(mk);
// contract addresses (testnet)
const assembly_address = 'terra195m6n5xq4rkjy47fn5y3s08tfmj3ryknj55jqvgq2y55zul9myzsgy06hk';
const xastro_address = 'terra1ctzthkc0nzseppqtqlwq9mjwy9gq8ht2534rtcj3yplerm06snmqfc5ucr';
const generator_address = 'terra1ksvlfex49desf4c452j6dewdjs6c48nafemetuwjyj6yexd7x3wqvwa7j9';
// custom functions
function toEncodedBinary(object) {
return Buffer.from(JSON.stringify(object)).toString('base64');
}
// generator msg
const generator_msg = {
"setup_pools": {
"pools": [
("lp_token_address", "1000"),
("lp_addr2", "10"),
... etc
]
}
}
const generator_binary = toEncodedBinary(generator_msg)
const proposal_msgs = [
{
order: "1",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: generator_binary,
funds: []
}
}
}
}
]
// proposal msg
const proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": proposal_msgs
}
}
const proposal_binary = toEncodedBinary(proposal_msg)
const msg = {
"send": {
"contract": assembly_address,
"amount": "30000000000",
"msg": proposal_binary
}
}
// execute and broadcast transaction
const execute = new MsgExecuteContract(
wallet.key.accAddress,
xastro_address,
msg,
);
const executeTx = await wallet.createAndSignTx({
msgs: [execute]
})
.then(tx => terra.tx.broadcast(tx))
.then((data) => console.log(result.txhash));
}
main().catch(console.error)
Step-by-Step
Set up
Note: This guide uses the pisco-1 testnet. For a complete guide to setting up Terra.js, visit here.
const { LCDClient, MnemonicKey, MsgExecuteContract } = require('@terra-money/terra.js');
async function main() {
const terra = new LCDClient({
URL: 'https://pisco-lcd.terra.dev',
chainID: 'pisco-1',
});
const mk = new MnemonicKey({
mnemonic: ''
});
const wallet = terra.wallet(mk);
Contract Addresses
We will be using the following 3 testnet addresses below in our proposal. For a full list of mainnet and testnet addresses, visit here.
const assembly_address = 'terra195m6n5xq4rkjy47fn5y3s08tfmj3ryknj55jqvgq2y55zul9myzsgy06hk';
const xastro_address = 'terra1ctzthkc0nzseppqtqlwq9mjwy9gq8ht2534rtcj3yplerm06snmqfc5ucr';
const generator_address = 'terra1ksvlfex49desf4c452j6dewdjs6c48nafemetuwjyj6yexd7x3wqvwa7j9';
Custom Functions
We will be using a custom function to encode our messages in binary format.
function toEncodedBinary(object) {
return Buffer.from(JSON.stringify(object)).toString('base64');
}
Generator Msg
The Generator contract allocates token rewards (ASTRO) for various LP tokens and distributes them pro-rata to LP stakers. The setup_pools
endpoint within the Generator contract creates a new list of pools
with allocation points and updates the contractβs config. pools
is a vector that contains LP token addresses and allocation points.
Lastly, we use our toEncodedBinary
function to encode our message and pass the binary into our executable message.
const generator_msg = {
"setup_pools": {
"pools": [
("lp_token_address", "1000"),
("lp_addr2", "10"),
... etc
]
}
}
const generator_binary = toEncodedBinary(generator_msg)
const proposal_msgs = [
{
order: "1",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: generator_binary,
funds: []
}
}
}
}
]
Proposal Msg
Now that we have our proxy messages, we can create a submit_proposal
message and pass in our message. We encode our proposal message and pass our binary into a send
message that will be sent to the xASTRO contract.
const proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": proposal_msgs
}
}
const proposal_binary = toEncodedBinary(proposal_msg)
const msg = {
"send": {
"contract": assembly_address,
"amount": "30000000000",
"msg": proposal_binary
}
}
Execute and Broadcast Transaction
Lastly, execute and broadcast the transaction.
const execute = new MsgExecuteContract(
wallet.key.accAddress,
xastro_address,
msg,
);
const executeTx = await wallet.createAndSignTx({
msgs: [execute]
})
.then(tx => terra.tx.broadcast(tx))
.then((data) => console.log(result.txhash));
}
main().catch(console.error)
Thatβs it! Simply use the command line and node.js to execute the script and retrieve the transaction hash along with other information such as the proposal id.
Last updated
Was this helpful?