Tutorial: Structuring executable messages for Assembly proposals, Part 2: Adding proxy contracts

Intro to Proxy Contracts

  1. Adding ASTRO rewards to a pool (no third-party token rewards)
  2. Adding third-party token rewards to a pool (no ASTRO rewards)
  3. Adding dual rewards to a pool (combining steps 1 and 2)

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';
const ex_proxy_addr = 'terra1y3pjn6g0awzpkme2nfp4nzu75ae6wuhdfztdn2pqju5tlzhkphjq5st2ts';
const ex_lp_addr = 'terra1s4ls0amk56vvfgv5jvsdacvr39r3a76p49wgplv0r27nxt7g3ugqpwul97';
// custom functions
async function queryContract(terra, contractAddress, query) {
return await terra.wasm.contractQuery(contractAddress, query);
}
function toEncodedBinary(object) {
return Buffer.from(JSON.stringify(object)).toString('base64');
}
// update generator config
let config = await queryContract(terra, generator_address, {config: {}});
config.allowed_reward_proxies.push(ex_proxy_addr);// first msg
let msg = {
"set_allowed_reward_proxies": {
"proxies": config.allowed_reward_proxies
}
}
let binary = toEncodedBinary(msg)let allow_proxies_msg = {
order: "1",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: binary,
funds: []
}
}
}
}
// second msg
let msg2 = {
"move_to_proxy": {
"lp_token": ex_lp_addr,
"proxy": ex_proxy_addr,
}
}
let binary2 = toEncodedBinary(msg2)let move_to_proxy_msg = {
order: "2",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: binary2,
funds: []
}
}
}
}
// proposal msg
let proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": [allow_proxies_msg, move_to_proxy_msg]
}
}
let proposal_binary = toEncodedBinary(proposal_msg)let execute_msg = {
"send": {
"contract": assembly_address,
"amount": "15000000000",
"msg": proposal_binary
}
}
// execute proposal
let execute = new MsgExecuteContract(
wallet.key.accAddress,
xastro_address,
execute_msg,
);
let executeTx = await wallet.createAndSignTx({
msgs: [execute]
})
.then(tx => terra.tx.broadcast(tx))
.then((result) => console.log(result.txhash));
}main().catch(console.error)

Step-by-Step

Set-up

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

const assembly_address = 'terra195m6n5xq4rkjy47fn5y3s08tfmj3ryknj55jqvgq2y55zul9myzsgy06hk';
const xastro_address = 'terra1ctzthkc0nzseppqtqlwq9mjwy9gq8ht2534rtcj3yplerm06snmqfc5ucr';
const generator_address = 'terra1ksvlfex49desf4c452j6dewdjs6c48nafemetuwjyj6yexd7x3wqvwa7j9';
const ex_proxy_addr = 'terra1y3pjn6g0awzpkme2nfp4nzu75ae6wuhdfztdn2pqju5tlzhkphjq5st2ts';
const ex_lp_addr = 'terra1s4ls0amk56vvfgv5jvsdacvr39r3a76p49wgplv0r27nxt7g3ugqpwul97';

Custom Functions

async function queryContract(terra, contractAddress, query) {
return await terra.wasm.contractQuery(contractAddress, query);
}
function toEncodedBinary(object) {
return Buffer.from(JSON.stringify(object)).toString('base64');
}

Update Generator Config

let config = await queryContract(terra, generator_address, {config: {}});config.allowed_reward_proxies.push(ex_proxy_addr);

Allow Proxies Msg (1st Msg)

  1. Allow the proxy contract
  2. Stake LP tokens
let msg = {
"set_allowed_reward_proxies": {
"proxies": config.allowed_reward_proxies
}
}
let binary = toEncodedBinary(msg)let allow_proxies_msg = {
order: "1",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: binary,
funds: []
}
}
}
}

Move to Proxy Msg (2nd Msg)

let msg2 = {
"move_to_proxy": {
"lp_token": ex_lp_addr,
"proxy": ex_proxy_addr,
}
}
let binary2 = toEncodedBinary(msg2)let move_to_proxy_msg = {
order: "2",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: binary2,
funds: []
}
}
}
}

Proposal Msg

let proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": [allow_proxies_msg, move_to_proxy_msg]
}
}
let proposal_binary = toEncodedBinary(proposal_msg)let execute_msg = {
"send": {
"contract": assembly_address,
"amount": "15000000000",
"msg": proposal_binary
}
}

Execute and Broadcast Transaction

let execute = new MsgExecuteContract(
wallet.key.accAddress,
xastro_address,
execute_msg,
);
let executeTx = await wallet.createAndSignTx({
msgs: [execute]
})
.then(tx => terra.tx.broadcast(tx))
.then((result) => console.log(result.txhash));
}main().catch(console.error)

Integrating Dual Rewards

let proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": [astro_alloc_msg, allow_proxies_msg, move_to_proxy_msg]
}
}
let astro_alloc_msg = [
{
order: "1",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: generator_binary,
funds: []
}
}
}
}
]

DISCLAIMER

--

--

An automated, decentralised exchange protocol on the Terra blockchain. http://astroport.fi

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store