Quellcode durchsuchen

Fix pyth test publisher (#76)

* Fix test pyth publisher to actually publish price

- Uses newer pyth images and removes existing hacks for old versions. It essentially makes dockers cleaner.
- Also improve some adds in dockers to cache more efficiently
Ali Behjati vor 3 Jahren
Ursprung
Commit
6544e97c35

+ 6 - 17
Dockerfile.solana

@@ -1,5 +1,7 @@
 #syntax=docker/dockerfile:1.2@sha256:e2a8561e419ab1ba6b2fe6cbdf49fd92b95912df1cf7d313c3e2230a333fdbcc
-FROM docker.io/library/rust:1.49@sha256:a50165ea96983c21832578afb1c8c028674c965bc1ed43b607871b1f362e06a5
+FROM pythfoundation/pyth-client:devnet-v2.10.1 as pyth-oracle-copy
+
+FROM docker.io/library/rust:1.49@sha256:a50165ea96983c21832578afb1c8c028674c965bc1ed43b607871b1f362e06a5 as build
 
 RUN apt-get update && \
     apt-get install -y \
@@ -23,21 +25,11 @@ RUN cargo init --lib /tmp/decoy-crate && \
     cd /tmp/decoy-crate && cargo build-bpf && \
     rm -rf /tmp/decoy-crate
 
-# Cache Pyth sources
-# This comes soon after mainnet-v2.1
-ENV PYTH_SRC_REV=31e3188bbf52ec1a25f71e4ab969378b27415b0a
-ENV PYTH_DIR=/usr/src/pyth/pyth-client
-
-WORKDIR $PYTH_DIR
-ADD https://github.com/pyth-network/pyth-client/archive/$PYTH_SRC_REV.tar.gz .
-
-# GitHub appends revision to dir in archive
-RUN tar -xvf *.tar.gz && rm -rf *.tar.gz && mv pyth-client-$PYTH_SRC_REV pyth-client
-
 # Add bridge contract sources
 WORKDIR /usr/src/bridge
 
-ADD . .
+ADD solana solana
+ADD third_party/pyth/p2w-sdk/rust third_party/pyth/p2w-sdk/rust
 RUN mkdir -p /opt/solana/deps
 
 ENV EMITTER_ADDRESS="11111111111111111111111111111115"
@@ -63,10 +55,7 @@ RUN --mount=type=cache,target=solana/bridge/target \
     cp solana/modules/token_bridge/token-metadata/spl_token_metadata.so /opt/solana/deps/spl_token_metadata.so && \
     cp solana/pyth2wormhole/target/deploy/pyth2wormhole.so /opt/solana/deps/pyth2wormhole.so
 
-# Build the Pyth Solana program
-WORKDIR $PYTH_DIR/pyth-client/program
-RUN make SOLANA=~/.local/share/solana/install/active_release/bin OUT_DIR=../target && \
-    cp ../target/oracle.so /opt/solana/deps/pyth_oracle.so
+COPY --from=pyth-oracle-copy /home/pyth/pyth-client/target/oracle.so /opt/solana/deps/pyth_oracle.so
 
 ENV RUST_LOG="solana_runtime::system_instruction_processor=trace,solana_runtime::message_processor=trace,solana_bpf_loader=debug,solana_rbpf=debug"
 ENV RUST_BACKTRACE=1

+ 1 - 1
Dockerfile.terra

@@ -6,7 +6,7 @@ COPY terra/Cargo.lock /code/
 COPY terra/Cargo.toml /code/
 COPY terra/contracts /code/contracts
 COPY terra/packages /code/packages
-COPY third_party/pyth /third_party/pyth 
+COPY third_party/pyth/p2w-sdk/rust /third_party/pyth/p2w-sdk/rust 
 RUN optimize_workspace.sh
 
 # Contract deployment stage

+ 2 - 11
third_party/pyth/Dockerfile.pyth

@@ -1,6 +1,6 @@
 # syntax=docker/dockerfile:1.2
 # Wormhole-specific setup for pyth
-FROM pythfoundation/pyth-client:devnet-v2.2@sha256:2ce8de6a43b2fafafd15ebdb723c530a0319860dc40c9fdb97149d5aa270fdde
+FROM pythfoundation/pyth-client:devnet-v2.10.1
 
 USER root
 
@@ -21,20 +21,10 @@ RUN cp /opt/solana/keys/pyth_publisher.json publish_key_pair.json && \
     chown pyth:pyth -R . && \
     chmod go-rwx -R .
 
-# Rebuild Pyth sources from scratch
-# This comes soon after mainnet-v2.1
-ENV PYTH_SRC_REV=31e3188bbf52ec1a25f71e4ab969378b27415b0a
 ENV PYTH_SRC_ROOT=/home/pyth/pyth-client
 
-ADD https://github.com/pyth-network/pyth-client/archive/$PYTH_SRC_REV.tar.gz .
-RUN tar -xvf *.tar.gz && \
-    rm -rf $PYTH_SRC_ROOT *.tar.gz && \
-    mv pyth-client-$PYTH_SRC_REV $PYTH_SRC_ROOT/
-
 WORKDIR $PYTH_SRC_ROOT/build
 
-RUN cmake .. && make
-
 # Prepare setup script
 ADD third_party/pyth/pyth_utils.py /opt/pyth/pyth_utils.py
 ADD third_party/pyth/pyth_publisher.py /opt/pyth/pyth_publisher.py
@@ -43,5 +33,6 @@ RUN chmod a+rx /opt/pyth/*.py
 USER pyth
 
 ENV PYTH=$PYTH_SRC_ROOT/build/pyth
+ENV PYTH_ADMIN=$PYTH_SRC_ROOT/build/pyth_admin
 ENV READINESS_PORT=2000
 ENV SOL_AIRDROP_AMT=100

+ 7 - 8
third_party/pyth/pyth_publisher.py

@@ -40,11 +40,12 @@ def publisher_random_update(price_pubkey):
     """
     Update the specified price with random values
     """
-    value = random.randrange(1024)
-    confidence = 5
+    value = random.randrange(1000, 2000)
+    confidence = random.randrange(1, 10)
     pyth_run_or_die("upd_price_val", args=[
         price_pubkey, str(value), str(confidence), "trading"
     ])
+
     print(f"Price {price_pubkey} value updated to {str(value)}!")
 
 
@@ -61,25 +62,23 @@ def accounts_endpoint():
 def add_symbol(num: int):
     symbol_name = f"Test symbol {num}"
     # Add a product
-    prod_pubkey = pyth_run_or_die(
+    prod_pubkey = pyth_admin_run_or_die(
         "add_product", capture_output=True).stdout.strip()
 
     print(f"{symbol_name}: Added product {prod_pubkey}")
 
     # Add a price
-    price_pubkey = pyth_run_or_die(
+    price_pubkey = pyth_admin_run_or_die(
         "add_price",
         args=[prod_pubkey, "price"],
-        confirm=False,
         capture_output=True
     ).stdout.strip()
 
     print(f"{symbol_name}: Added price {price_pubkey}")
 
     # Become a publisher for the new price
-    pyth_run_or_die(
+    pyth_admin_run_or_die(
         "add_publisher", args=[publisher_pubkey, price_pubkey],
-        confirm=False,
         debug=True,
         capture_output=True)
     print(f"{symbol_name}: Added publisher {publisher_pubkey}")
@@ -108,7 +107,7 @@ sol_run_or_die("airdrop", [
 ])
 
 # Create a mapping
-pyth_run_or_die("init_mapping")
+pyth_admin_run_or_die("init_mapping")
 
 print(f"Creating {PYTH_TEST_SYMBOL_COUNT} test Pyth symbols")
 

+ 18 - 4
third_party/pyth/pyth_utils.py

@@ -5,6 +5,7 @@ import sys
 
 # Settings specific to local devnet Pyth instance
 PYTH = os.environ.get("PYTH", "./pyth")
+PYTH_ADMIN = os.environ.get("PYTH_ADMIN", "./pyth_admin")
 PYTH_KEY_STORE = os.environ.get("PYTH_KEY_STORE", "/home/pyth/.pythd")
 PYTH_PROGRAM_KEYPAIR = os.environ.get(
     "PYTH_PROGRAM_KEYPAIR", f"{PYTH_KEY_STORE}/publish_key_pair.json"
@@ -58,14 +59,27 @@ def run_or_die(args, die=True, **kwargs):
     return ret
 
 
-def pyth_run_or_die(subcommand, args=[], debug=False, confirm=True, **kwargs):
+def pyth_run_or_die(subcommand, args=[], debug=False, **kwargs):
     """
-    Pyth boilerplate in front of run_or_die
+    Pyth boilerplate in front of run_or_die.
     """
     return run_or_die(
         [PYTH, subcommand] + args + (["-d"] if debug else [])
-        # Note: not all pyth subcommands accept -n
-        + ([] if confirm else ["-n"])
+        + ["-k", PYTH_KEY_STORE]
+        + ["-r", SOL_RPC_HOST]
+        + ["-c", "finalized"]
+        + ["-x"], # These means to bypass transaction proxy server. In this setup it's not running and it's required to bypass
+        **kwargs,
+    )
+
+
+def pyth_admin_run_or_die(subcommand, args=[], debug=False, **kwargs):
+    """
+    Pyth_admin boilerplate in front of run_or_die.
+    """
+    return run_or_die(
+        [PYTH_ADMIN, subcommand] + args + (["-d"] if debug else [])
+        + ["-n"] # These commands require y/n confirmation. This bypasses that
         + ["-k", PYTH_KEY_STORE]
         + ["-r", SOL_RPC_HOST]
         + ["-c", "finalized"],