πIntegrating Proxy Contracts
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 = '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 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)
Proposal Msg
Execute and Broadcast Transaction
Last updated