create_price_feed.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /// We build a programmable txn to create a price feed.
  2. import dotenv from "dotenv"
  3. import {
  4. RawSigner,
  5. SUI_CLOCK_OBJECT_ID,
  6. TransactionBlock,
  7. fromB64,
  8. normalizeSuiObjectId,
  9. JsonRpcProvider,
  10. Ed25519Keypair,
  11. testnetConnection,
  12. Connection,
  13. } from "@mysten/sui.js";
  14. dotenv.config({"path":"~/.env"})
  15. import {REGISTRY, NETWORK} from "./registry"
  16. let network = NETWORK.DEVNET
  17. const registry = REGISTRY[network]
  18. const provider = new JsonRpcProvider(new Connection({ fullnode: registry["RPC_URL"] }))
  19. const walletPrivateKey = process.env.SUI_DEVNET;
  20. async function main() {
  21. if (walletPrivateKey === undefined) {
  22. throw new Error("SUI_DEVNET unset in environment");
  23. }
  24. const wallet = new RawSigner(
  25. Ed25519Keypair.fromSecretKey(
  26. network == "MAINNET" ?
  27. Buffer.from(walletPrivateKey, "hex")
  28. :
  29. Buffer.from(walletPrivateKey, "base64").subarray(1)
  30. ),
  31. provider
  32. );
  33. console.log(wallet.getAddress())
  34. const vaa_bytes = "AQAAAAABAMN885gNTVEako6fczJq22AOFSRWdUsUOxPQVHSnxhj3ecU2gJVDBlAcY6G9FWmGCcGcdZ/5iVXQCm+0loHvfqwAZE/kXQAAAAAAGqJ4OdZBsHdDwMtfaMUfjNMdLAdivsANxvzSVDPvGrW2AAAAAADugxEBUDJXSAADAAEAAQIABQCdWnl7akEQMaEEfYaw/fhuJFW+jn/vFq7yPbIJcj2vlB9hIm05vuoZ0zTxfC/rzifhJkbYRnWSTrsCuc2upocn4wAAAABBxD4gAAAAAAAJ2WD////4AAAAAEIrzm4AAAAAAAn/ewEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAABBxC0/AAAAAAAJi/EAAAAAZE/kXLWIXWbTUV6YNI7DMlk7XRbg/bhT77Ye1dzAvPgOkWCB11ZqO6f3KG7VT0rn6YP0QgrgseDziS4R+cSrEHu617kAAAAAZCplIAAAAAAAEu4I////+AAAAABkvzOKAAAAAAAQZDgBAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAAAZCplIAAAAAAAFIotAAAAAGRP5Fw3+21L/xkSgKfP+Av17aeofBUakdmoW6So+OLPlX5BjbMn2c8OzXk6F1+nCsjS3BCdRGJ1jlVpYsSoewLsTz8VAAAAAC1gXb0AAAAAAAdkLv////gAAAAALZa00gAAAAAABpwgAQAAAAEAAAACAAAAAGRP5F0AAAAAZE/kXQAAAABkT+RcAAAAAC1gXb0AAAAAAAdkLgAAAABkT+RcHNsaXh40VtKXfuDT1wdlI58IpChVuVCP1HnhXG3E0f7s9VN3DZsQll+Ptkdx6T9WkKGC7cMr5KMjbgyqpuBYGgAAAAewLri2AAAAAAEnq0n////4AAAAB7uEHmgAAAAAAV8hnAEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAAewBz2PAAAAAAE4kisAAAAAZE/kXGogZxwOP4yyGc4/RuWuCWpPL9+TbSvU2okl9wCH1R3YMAKUeVmHlykONjihcSwpveI2fQ7KeU93iyW1pHLxkt4AAAACtJQuKQAAAAAAn4lX////+AAAAAK3aIHUAAAAAACmrg4BAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAACtJOhZQAAAAAAnAlPAAAAAGRP5Fw=";
  35. create_price_feeds(wallet, registry, vaa_bytes)
  36. }
  37. main();
  38. async function create_price_feeds(
  39. signer: RawSigner,
  40. registry: any,
  41. vaa_bytes: string
  42. ) {
  43. const tx = new TransactionBlock();
  44. let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"]
  45. let PYTH_STATE = registry["PYTH_STATE_ID"]
  46. let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"]
  47. let WORM_STATE = registry["WORMHOLE_STATE_ID"]
  48. console.log("PYTH_PACKAGE: ", PYTH_PACKAGE)
  49. console.log("PYTH_STATE: ", PYTH_STATE)
  50. console.log("WORM_PACKAGE: ", WORM_PACKAGE)
  51. console.log("WORM_STATE: ", WORM_STATE)
  52. let [verified_vaa] = tx.moveCall({
  53. target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
  54. arguments: [
  55. tx.object(WORM_STATE),
  56. tx.pure([...Buffer.from(vaa_bytes, "hex")]),
  57. tx.object(SUI_CLOCK_OBJECT_ID),
  58. ],
  59. });
  60. tx.moveCall({
  61. target: `${PYTH_PACKAGE}::pyth::create_price_feeds`,
  62. arguments: [
  63. tx.object(PYTH_STATE),
  64. verified_vaa,
  65. tx.object(SUI_CLOCK_OBJECT_ID)
  66. ],
  67. });
  68. tx.setGasBudget(1_000_000_000n);
  69. let result = await signer.signAndExecuteTransactionBlock({
  70. transactionBlock: tx,
  71. options: {
  72. showInput: true,
  73. showEffects: true,
  74. showEvents: true,
  75. showObjectChanges: true,
  76. showBalanceChanges: true,
  77. },
  78. });
  79. console.log(result)
  80. return result
  81. }