injective.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { getNetworkInfo, Network } from "@injectivelabs/networks";
  2. import { getStdFee, DEFAULT_STD_FEE } from "@injectivelabs/utils";
  3. import {
  4. PrivateKey,
  5. TxGrpcApi,
  6. ChainRestAuthApi,
  7. createTransaction,
  8. MsgExecuteContract,
  9. } from "@injectivelabs/sdk-ts";
  10. import { fromUint8Array } from "js-base64";
  11. import { impossible, Payload } from "./vaa";
  12. import { NETWORKS } from "./networks";
  13. import { CONTRACTS } from "@certusone/wormhole-sdk/lib/cjs/utils/consts";
  14. export async function execute_injective(
  15. payload: Payload,
  16. vaa: Buffer,
  17. environment: "MAINNET" | "TESTNET" | "DEVNET"
  18. ) {
  19. if (environment === "DEVNET") {
  20. throw new Error("Injective is not supported in DEVNET");
  21. }
  22. const chainName = "injective";
  23. let n = NETWORKS[environment][chainName];
  24. if (!n.key) {
  25. throw Error(`No ${environment} key defined for Injective`);
  26. }
  27. let contracts = CONTRACTS[environment][chainName];
  28. const endPoint =
  29. environment === "MAINNET" ? Network.MainnetK8s : Network.TestnetK8s;
  30. const network = getNetworkInfo(endPoint);
  31. const walletPKHash = n.key;
  32. const walletPK = PrivateKey.fromMnemonic(walletPKHash);
  33. const walletInjAddr = walletPK.toBech32();
  34. const walletPublicKey = walletPK.toPublicKey().toBase64();
  35. let target_contract: string;
  36. let action: string;
  37. let execute_msg: object;
  38. switch (payload.module) {
  39. case "Core":
  40. target_contract = contracts.core;
  41. action = "submit_v_a_a";
  42. execute_msg = {
  43. [action]: {
  44. vaa: fromUint8Array(vaa),
  45. },
  46. };
  47. switch (payload.type) {
  48. case "GuardianSetUpgrade":
  49. console.log("Submitting new guardian set");
  50. break;
  51. case "ContractUpgrade":
  52. console.log("Upgrading core contract");
  53. break;
  54. default:
  55. impossible(payload);
  56. }
  57. break;
  58. case "NFTBridge":
  59. if (contracts.nft_bridge === undefined) {
  60. // NOTE: this code can safely be removed once the injective NFT bridge is
  61. // released, but it's fine for it to stay, as the condition will just be
  62. // skipped once 'contracts.nft_bridge' is defined
  63. throw new Error("NFT bridge not supported yet for injective");
  64. }
  65. target_contract = contracts.nft_bridge;
  66. action = "submit_vaa";
  67. execute_msg = {
  68. [action]: {
  69. data: fromUint8Array(vaa),
  70. },
  71. };
  72. switch (payload.type) {
  73. case "ContractUpgrade":
  74. console.log("Upgrading contract");
  75. break;
  76. case "RegisterChain":
  77. console.log("Registering chain");
  78. break;
  79. case "Transfer":
  80. console.log("Completing transfer");
  81. break;
  82. default:
  83. impossible(payload);
  84. }
  85. break;
  86. case "TokenBridge":
  87. console.log("contracts:", contracts);
  88. if (contracts.token_bridge === undefined) {
  89. throw new Error("contracts.token_bridge is undefined");
  90. }
  91. target_contract = contracts.token_bridge;
  92. action = "submit_vaa";
  93. execute_msg = {
  94. [action]: {
  95. data: fromUint8Array(vaa),
  96. },
  97. };
  98. switch (payload.type) {
  99. case "ContractUpgrade":
  100. console.log("Upgrading contract");
  101. break;
  102. case "RegisterChain":
  103. console.log("Registering chain");
  104. break;
  105. case "Transfer":
  106. console.log("Completing transfer");
  107. break;
  108. case "AttestMeta":
  109. console.log("Creating wrapped token");
  110. break;
  111. case "TransferWithPayload":
  112. throw Error("Can't complete payload 3 transfer from CLI");
  113. default:
  114. impossible(payload);
  115. break;
  116. }
  117. break;
  118. default:
  119. target_contract = impossible(payload);
  120. execute_msg = impossible(payload);
  121. }
  122. console.log("execute_msg", execute_msg);
  123. const transaction = MsgExecuteContract.fromJSON({
  124. sender: walletInjAddr,
  125. contractAddress: target_contract,
  126. exec: {
  127. action,
  128. msg: {
  129. ...execute_msg[action],
  130. },
  131. },
  132. });
  133. console.log("transaction:", transaction);
  134. const accountDetails = await new ChainRestAuthApi(network.rest).fetchAccount(
  135. walletInjAddr
  136. );
  137. const { signBytes, txRaw } = createTransaction({
  138. message: transaction.toDirectSign(),
  139. memo: "",
  140. fee: getStdFee((parseInt(DEFAULT_STD_FEE.gas, 10) * 2.5).toString()),
  141. pubKey: walletPublicKey,
  142. sequence: parseInt(accountDetails.account.base_account.sequence, 10),
  143. accountNumber: parseInt(
  144. accountDetails.account.base_account.account_number,
  145. 10
  146. ),
  147. chainId: network.chainId,
  148. });
  149. console.log("txRaw", txRaw);
  150. console.log("sign transaction...");
  151. /** Sign transaction */
  152. const sig = await walletPK.sign(Buffer.from(signBytes));
  153. /** Append Signatures */
  154. txRaw.setSignaturesList([sig]);
  155. const txService = new TxGrpcApi(network.grpc);
  156. console.log("simulate transaction...");
  157. /** Simulate transaction */
  158. try {
  159. const simulationResponse = await txService.simulate(txRaw);
  160. console.log(
  161. `Transaction simulation response: ${JSON.stringify(
  162. simulationResponse.gasInfo
  163. )}`
  164. );
  165. } catch (e) {
  166. console.log("Failed to simulate:", e);
  167. return;
  168. }
  169. console.log("broadcast transaction...");
  170. /** Broadcast transaction */
  171. const txResponse = await txService.broadcast(txRaw);
  172. console.log("txResponse", txResponse);
  173. if (txResponse.code !== 0) {
  174. console.log(`Transaction failed: ${txResponse.rawLog}`);
  175. } else {
  176. console.log(
  177. `Broadcasted transaction hash: ${JSON.stringify(txResponse.txHash)}`
  178. );
  179. }
  180. }