wormhole/clients/js/terra.ts

116 lines
2.9 KiB
TypeScript

import { LCDClient, MnemonicKey, MsgExecuteContract } from "@terra-money/terra.js";
import { fromUint8Array } from "js-base64";
import { impossible, Payload } from "./vaa";
import { NETWORKS } from "./networks"
import { CONTRACTS } from "@certusone/wormhole-sdk"
export async function execute_governance_terra(
payload: Payload,
vaa: Buffer,
network: "MAINNET" | "TESTNET" | "DEVNET"
) {
let n = NETWORKS[network]['terra']
let contracts = CONTRACTS[network]['terra']
const terra = new LCDClient({
URL: n.rpc,
chainID: n.chain_id,
})
const wallet = terra.wallet(new MnemonicKey({
mnemonic: n.key
}))
let target_contract: string
let execute_msg: object
switch (payload.module) {
case "Core":
target_contract = contracts.core
// sigh...
execute_msg = {
submit_v_a_a: {
vaa: fromUint8Array(vaa)
},
}
switch (payload.type) {
case "GuardianSetUpgrade":
console.log("Submitting new guardian set")
break
case "ContractUpgrade":
console.log("Upgrading core contract")
break
default:
impossible(payload)
}
break
case "NFTBridge":
if (contracts.nft_bridge === undefined) {
// NOTE: this code can safely be removed once the terra NFT bridge is
// released, but it's fine for it to stay, as the condition will just be
// skipped once 'contracts.nft_bridge' is defined
throw new Error("NFT bridge not supported yet for terra")
}
target_contract = contracts.nft_bridge
execute_msg = {
submit_vaa: {
data: fromUint8Array(vaa)
},
}
switch (payload.type) {
case "ContractUpgrade":
console.log("Upgrading contract")
break
case "RegisterChain":
console.log("Registering chain")
break
default:
impossible(payload)
}
break
case "TokenBridge":
target_contract = contracts.token_bridge
execute_msg = {
submit_vaa: {
data: fromUint8Array(vaa)
},
}
switch (payload.type) {
case "ContractUpgrade":
console.log("Upgrading contract")
break
case "RegisterChain":
console.log("Registering chain")
break
default:
impossible(payload)
execute_msg = impossible(payload)
}
break
default:
target_contract = impossible(payload)
execute_msg = impossible(payload)
}
const transaction = new MsgExecuteContract(
wallet.key.accAddress,
target_contract,
execute_msg,
{ uluna: 1000 }
)
wallet
.createAndSignTx({
msgs: [transaction],
memo: '',
})
.then(tx => terra.tx.broadcast(tx))
.then(result => {
console.log(result)
console.log(`TX hash: ${result.txhash}`)
})
}