xpla.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import {
  2. Coin,
  3. Fee,
  4. LCDClient,
  5. MnemonicKey,
  6. MsgExecuteContract,
  7. } from "@xpla/xpla.js";
  8. import { fromUint8Array } from "js-base64";
  9. import { impossible, Payload } from "./vaa";
  10. import { NETWORKS } from "./networks";
  11. import { CONTRACTS } from "@certusone/wormhole-sdk/lib/cjs/utils/consts";
  12. export async function execute_xpla(
  13. payload: Payload,
  14. vaa: Buffer,
  15. network: "MAINNET" | "TESTNET" | "DEVNET"
  16. ) {
  17. const chain = "xpla";
  18. let n = NETWORKS[network][chain];
  19. let contracts = CONTRACTS[network][chain];
  20. const client = new LCDClient({
  21. URL: n.rpc,
  22. chainID: n.chain_id,
  23. });
  24. const wallet = client.wallet(
  25. new MnemonicKey({
  26. mnemonic: n.key,
  27. })
  28. );
  29. let target_contract: string;
  30. let execute_msg: object;
  31. switch (payload.module) {
  32. case "Core":
  33. target_contract = contracts.core;
  34. execute_msg = {
  35. submit_v_a_a: {
  36. vaa: fromUint8Array(vaa),
  37. },
  38. };
  39. switch (payload.type) {
  40. case "GuardianSetUpgrade":
  41. console.log("Submitting new guardian set");
  42. break;
  43. case "ContractUpgrade":
  44. console.log("Upgrading core contract");
  45. break;
  46. default:
  47. impossible(payload);
  48. }
  49. break;
  50. case "NFTBridge":
  51. if (contracts.nft_bridge === undefined) {
  52. // NOTE: this code can safely be removed once the terra NFT bridge is
  53. // released, but it's fine for it to stay, as the condition will just be
  54. // skipped once 'contracts.nft_bridge' is defined
  55. throw new Error("NFT bridge not supported yet for terra");
  56. }
  57. target_contract = contracts.nft_bridge;
  58. execute_msg = {
  59. submit_vaa: {
  60. data: fromUint8Array(vaa),
  61. },
  62. };
  63. switch (payload.type) {
  64. case "ContractUpgrade":
  65. console.log("Upgrading contract");
  66. break;
  67. case "RegisterChain":
  68. console.log("Registering chain");
  69. break;
  70. case "Transfer":
  71. console.log("Completing transfer");
  72. break;
  73. default:
  74. impossible(payload);
  75. }
  76. break;
  77. case "TokenBridge":
  78. target_contract = contracts.token_bridge;
  79. execute_msg = {
  80. submit_vaa: {
  81. data: fromUint8Array(vaa),
  82. },
  83. };
  84. switch (payload.type) {
  85. case "ContractUpgrade":
  86. console.log("Upgrading contract");
  87. break;
  88. case "RegisterChain":
  89. console.log("Registering chain");
  90. break;
  91. case "Transfer":
  92. console.log("Completing transfer");
  93. break;
  94. case "AttestMeta":
  95. console.log("Creating wrapped token");
  96. break;
  97. case "TransferWithPayload":
  98. throw Error("Can't complete payload 3 transfer from CLI");
  99. default:
  100. impossible(payload);
  101. break;
  102. }
  103. break;
  104. default:
  105. target_contract = impossible(payload);
  106. execute_msg = impossible(payload);
  107. }
  108. const transaction = new MsgExecuteContract(
  109. wallet.key.accAddress,
  110. target_contract,
  111. execute_msg,
  112. { axpla: 1700000000000000000 }
  113. );
  114. const feeDenoms = ["axpla"];
  115. // const gasPrices = await axios
  116. // .get("https://dimension-lcd.xpla.dev/v1/txs/gas_prices")
  117. // .then((result) => result.data);
  118. const feeEstimate = await client.tx.estimateFee(
  119. [
  120. {
  121. sequenceNumber: await wallet.sequence(),
  122. publicKey: wallet.key.publicKey,
  123. },
  124. ],
  125. {
  126. msgs: [transaction],
  127. memo: "",
  128. feeDenoms,
  129. // gasPrices,
  130. }
  131. );
  132. wallet
  133. .createAndSignTx({
  134. msgs: [transaction],
  135. memo: "",
  136. fee: new Fee(
  137. feeEstimate.gas_limit,
  138. feeEstimate.amount.add(new Coin("axpla", 18))
  139. ),
  140. })
  141. .then((tx) => client.tx.broadcast(tx))
  142. .then((result) => {
  143. console.log(result);
  144. console.log(`TX hash: ${result.txhash}`);
  145. });
  146. }