πΈIntegrating Dual Rewards
Prerequisites
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 = 'terra1gc4d4v82vjgkz0ag28lrmlxx3tf6sq69tmaujjpe7jwmnqakkx0qm28j2l';
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: []
}
}
}
}
// third msg
let msg3 = {
"setup_pools": {
"pools": [
("lp_token_address", "1000"),
("lp_addr2", "10"),
... etc
]
}
}
let binary3 = toEncodedBinary(msg3)
let setup_pools_msg = [
{
order: "3",
msg: {
wasm: {
execute: {
contract_addr: generator_address,
msg: binary3,
funds: []
}
}
}
}
]
// proposal msg
let proposal_msg = {
"submit_proposal": {
"title": "testing",
"description": "testing",
"link": null,
"messages": [allow_proxies_msg, move_to_proxy_msg, setup_pools_msg]
}
}
let proposal_binary = toEncodedBinary(proposal_msg)
let execute_msg = {
"send": {
"contract": assembly_address,
"amount": "15000000000",
"msg": proposal_binary
}
}
// execute and broadcast 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
Contract Addresses
Custom Functions
Update Generator Config
Allow Proxies Msg (1st Msg)
Move to Proxy Msg (2nd Msg)
SetupPools Msg (3rd Msg)
Proposal Msg
Execute and Broadcast Transaction
Last updated