From 4bffbdb4e6acf6f701db156e45001030b63c8d50 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 16 Aug 2022 23:00:49 +0000 Subject: [PATCH 01/14] Format --- program/c/src/oracle/test_oracle.c | 21 ------------------- program/rust/src/tests/mod.rs | 1 + program/rust/src/tests/test_sizes.rs | 31 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 21 deletions(-) delete mode 100644 program/c/src/oracle/test_oracle.c create mode 100644 program/rust/src/tests/test_sizes.rs diff --git a/program/c/src/oracle/test_oracle.c b/program/c/src/oracle/test_oracle.c deleted file mode 100644 index 10eae3e58..000000000 --- a/program/c/src/oracle/test_oracle.c +++ /dev/null @@ -1,21 +0,0 @@ -char heap_start[8192]; -#define PC_HEAP_START (heap_start) -#include "oracle.c" -#include - -uint64_t MAPPING_ACCOUNT_LAMPORTS = 143821440; -uint64_t PRODUCT_ACCOUNT_LAMPORTS = 4454400; -uint64_t PRICE_ACCOUNT_LAMPORTS = 23942400; - -Test(oracle, pc_size ) { - cr_assert( sizeof( pc_pub_key_t ) == 32 ); - cr_assert( sizeof( pc_map_table_t ) == - 24 + (PC_MAP_TABLE_SIZE+1)*sizeof( pc_pub_key_t) ); - cr_assert( sizeof( pc_price_info_t ) == 32 ); - cr_assert( sizeof( pc_price_comp_t ) == sizeof( pc_pub_key_t ) + - 2*sizeof( pc_price_info_t ) ); - cr_assert( sizeof( pc_price_t ) == 48 + - 8*sizeof(int64_t) + - 3*sizeof( pc_pub_key_t ) + sizeof( pc_price_info_t ) + - PC_COMP_SIZE * sizeof( pc_price_comp_t ) ); -} diff --git a/program/rust/src/tests/mod.rs b/program/rust/src/tests/mod.rs index 06009cd10..1274dfd1f 100644 --- a/program/rust/src/tests/mod.rs +++ b/program/rust/src/tests/mod.rs @@ -6,6 +6,7 @@ mod test_del_publisher; mod test_init_mapping; mod test_init_price; mod test_set_min_pub; +mod test_sizes; mod test_upd_aggregate; mod test_upd_price; mod test_upd_price_no_fail_on_error; diff --git a/program/rust/src/tests/test_sizes.rs b/program/rust/src/tests/test_sizes.rs new file mode 100644 index 000000000..507583961 --- /dev/null +++ b/program/rust/src/tests/test_sizes.rs @@ -0,0 +1,31 @@ +use crate::c_oracle_header::{ + pc_map_table_t, + pc_price_comp_t, + pc_price_info_t, + pc_price_t, + pc_pub_key_t, + PC_COMP_SIZE, + PC_MAP_TABLE_SIZE, +}; +use std::mem::size_of; + +#[test] +fn test_sizes() { + assert_eq!(size_of::(), 32); + assert_eq!( + size_of::(), + 24 + (PC_MAP_TABLE_SIZE as usize + 1) * size_of::() + ); + assert_eq!(size_of::(), 32); + assert_eq!( + size_of::(), + size_of::() + 2 * size_of::() + ); + assert_eq!( + size_of::(), + 48 + 8 * size_of::() + + 3 * size_of::() + + size_of::() + + (PC_COMP_SIZE as usize) * size_of::() + ); +} From 2f8037a6cee3bd1e04f07e439668ea51145a5101 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 16 Aug 2022 23:41:32 +0000 Subject: [PATCH 02/14] Cleanup --- program/c/makefile | 4 +- .../c/src/oracle/model/bin/test_price_model | Bin 0 -> 37416 bytes .../cpyth_test.c => native/upd_aggregate.c} | 0 program/c/src/oracle/oracle.c | 177 ------------------ program/c/src/oracle/upd_aggregate.c | 10 + scripts/build-bpf.sh | 17 +- 6 files changed, 14 insertions(+), 194 deletions(-) create mode 100755 program/c/src/oracle/model/bin/test_price_model rename program/c/src/oracle/{for_cargo_test/cpyth_test.c => native/upd_aggregate.c} (100%) delete mode 100644 program/c/src/oracle/oracle.c create mode 100644 program/c/src/oracle/upd_aggregate.c diff --git a/program/c/makefile b/program/c/makefile index fdccf0eb2..fbc9832b6 100644 --- a/program/c/makefile +++ b/program/c/makefile @@ -7,6 +7,6 @@ cpyth-bpf: bash -c "ar rcs target/libcpyth-bpf.a target/**/*.o" cpyth-native: # Compile C code to system architecture for use by rust's cargo test - gcc -c ./src/oracle/for_cargo_test/cpyth_test.c -o ./target/cpyth_test.o + gcc -c ./src/oracle/native/upd_aggregate.c -o ./target/cpyth-native.o # Bundle C code compiled to system architecture for use by rust's cargo test - ar rcs target/libcpyth-native.a ./target/cpyth_test.o + ar rcs target/libcpyth-native.a ./target/cpyth-native.o diff --git a/program/c/src/oracle/model/bin/test_price_model b/program/c/src/oracle/model/bin/test_price_model new file mode 100755 index 0000000000000000000000000000000000000000..b29373e2893fcf40e75fb764c6a9570e3969dcb6 GIT binary patch literal 37416 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 literal 0 HcmV?d00001 diff --git a/program/c/src/oracle/for_cargo_test/cpyth_test.c b/program/c/src/oracle/native/upd_aggregate.c similarity index 100% rename from program/c/src/oracle/for_cargo_test/cpyth_test.c rename to program/c/src/oracle/native/upd_aggregate.c diff --git a/program/c/src/oracle/oracle.c b/program/c/src/oracle/oracle.c deleted file mode 100644 index c82d56a85..000000000 --- a/program/c/src/oracle/oracle.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * BPF pyth price oracle program - */ -#include -#include "oracle.h" -#include "upd_aggregate.h" - - -// Returns the minimum number of lamports required to make an account -// with dlen bytes of data rent exempt. These values were calculated -// using the getMinimumBalanceForRentExemption RPC call, and are -// guaranteed never to increase. -static uint64_t rent_exempt_amount( uint64_t dlen ) -{ - switch ( dlen ) - { - case sizeof( pc_map_table_t ): - return 143821440; - case PC_PROD_ACC_SIZE: - return 4454400; - case sizeof( pc_price_t ): - return 23942400; - case PRICE_ACCOUNT_SIZE: - return 36915840; - default: - return UINT64_MAX; - } -} - -static bool is_rent_exempt( uint64_t lamports, uint64_t dlen ) -{ - return lamports >= rent_exempt_amount( dlen ); -} - -static bool valid_funding_account( SolAccountInfo *ka ) -{ - return ka->is_signer && - ka->is_writable; -} - -static bool valid_writable_account( SolParameters *prm, - SolAccountInfo *ka, - uint64_t min_dlen ) -{ - return ka->is_writable && - SolPubkey_same( ka->owner, prm->program_id ) && - ka->data_len >= min_dlen && - is_rent_exempt( *ka->lamports, ka->data_len ); -} - -static uint64_t upd_price( SolParameters *prm, SolAccountInfo *ka ) -{ - // Validate command parameters - cmd_upd_price_t *cptr = (cmd_upd_price_t*)prm->data; - if ( prm->data_len != sizeof( cmd_upd_price_t ) ) { - return ERROR_INVALID_ARGUMENT; - } - - // Account (1) is the price account - // Account (2) is the sysvar_clock account - // Verify that this is signed, writable with correct ownership and size - uint32_t clock_idx = prm->ka_num == 3 ? 2 : 3; - if ( (prm->ka_num != 3 && prm->ka_num != 4) || - !valid_funding_account( &ka[0] ) || - !valid_writable_account( prm, &ka[1], sizeof( pc_price_t ) ) || - !pc_pub_key_equal( (pc_pub_key_t*)ka[clock_idx].key, - (pc_pub_key_t*)sysvar_clock ) ) { - return ERROR_INVALID_ARGUMENT; - } - - // Verify that symbol account is initialized and corresponds to the - // same symbol in the instruction parameters - pc_price_t *pptr = (pc_price_t*)ka[1].data; - if ( pptr->magic_ != PC_MAGIC || - pptr->ver_ != cptr->ver_ || - pptr->type_ != PC_ACCTYPE_PRICE ) { - return ERROR_INVALID_ARGUMENT; - } - - // verify that publisher is valid - uint32_t i = 0; - pc_pub_key_t *kptr = (pc_pub_key_t*)ka[0].key; - for( i=0; i != pptr->num_; ++i ) { - pc_price_comp_t *iptr = &pptr->comp_[i]; - if ( pc_pub_key_equal( kptr, &iptr->pub_ ) ) { - break; - } - } - if ( i == pptr->num_ ) { - return ERROR_INVALID_ARGUMENT; - } - - // reject if this price corresponds to the same or earlier time - pc_price_info_t *fptr = &pptr->comp_[i].latest_; - sysvar_clock_t *sptr = (sysvar_clock_t*)ka[clock_idx].data; - if ( ( cptr->cmd_ == e_cmd_upd_price || cptr->cmd_ == e_cmd_upd_price_no_fail_on_error ) && - cptr->pub_slot_ <= fptr->pub_slot_ ) { - return ERROR_INVALID_ARGUMENT; - } - bool updated_aggregate = false; - // update aggregate price as necessary - if ( sptr->slot_ > pptr->agg_.pub_slot_ ) { - updated_aggregate = upd_aggregate( pptr, sptr->slot_, sptr->unix_timestamp_ ); - } - - // update component price if required - if ( cptr->cmd_ == e_cmd_upd_price || cptr->cmd_ == e_cmd_upd_price_no_fail_on_error ) { - uint32_t status = cptr->status_; - - // Set publisher's status to unknown unless their CI is sufficiently tight. - int64_t threshold_conf = (cptr->price_ / PC_MAX_CI_DIVISOR); - if (threshold_conf < 0) { - // Safe as long as threshold_conf isn't the min int64, which it isn't as long as PC_MAX_CI_DIVISOR > 1. - threshold_conf = -threshold_conf; - } - if ( cptr->conf_ > (uint64_t) threshold_conf ) { - status = PC_STATUS_UNKNOWN; - } - - fptr->price_ = cptr->price_; - fptr->conf_ = cptr->conf_; - fptr->status_ = status; - fptr->pub_slot_ = cptr->pub_slot_; - } - if (updated_aggregate){ - return SUCCESSFULLY_UPDATED_AGGREGATE; - } - return SUCCESS; -} - -static uint64_t upd_price_no_fail_on_error( SolParameters *prm, SolAccountInfo *ka ) -{ - return upd_price( prm, ka ) == SUCCESSFULLY_UPDATED_AGGREGATE? SUCCESSFULLY_UPDATED_AGGREGATE : SUCCESS; -} - -static uint64_t dispatch( SolParameters *prm, SolAccountInfo *ka ) -{ - if (prm->data_len < sizeof(cmd_hdr_t) ) { - return ERROR_INVALID_ARGUMENT; - } - cmd_hdr_t *hdr = (cmd_hdr_t*)prm->data; - if ( hdr->ver_ != PC_VERSION ) { - return ERROR_INVALID_ARGUMENT; - } - switch(hdr->cmd_) { - case e_cmd_upd_price: - case e_cmd_agg_price: return upd_price( prm, ka ); - case e_cmd_upd_price_no_fail_on_error: return upd_price_no_fail_on_error( prm, ka ); - case e_cmd_init_mapping: return ERROR_INVALID_ARGUMENT; - case e_cmd_add_mapping: return ERROR_INVALID_ARGUMENT; - case e_cmd_add_product: return ERROR_INVALID_ARGUMENT; - case e_cmd_upd_product: return ERROR_INVALID_ARGUMENT; - case e_cmd_add_price: return ERROR_INVALID_ARGUMENT; - case e_cmd_add_publisher: return ERROR_INVALID_ARGUMENT; - case e_cmd_del_publisher: return ERROR_INVALID_ARGUMENT; - case e_cmd_init_price: return ERROR_INVALID_ARGUMENT; - case e_cmd_init_test: return ERROR_INVALID_ARGUMENT; - case e_cmd_upd_test: return ERROR_INVALID_ARGUMENT; - case e_cmd_set_min_pub: return ERROR_INVALID_ARGUMENT; - default: return ERROR_INVALID_ARGUMENT; - } -} - -extern uint64_t c_entrypoint(const uint8_t *input) -{ - SolAccountInfo ka[4]; - SolParameters prm[1]; - prm->ka = ka; - if (!sol_deserialize(input, prm, SOL_ARRAY_SIZE(ka))) { - return ERROR_INVALID_ARGUMENT; - } - return dispatch( prm, ka ); -} - -extern bool c_upd_aggregate( pc_price_t *ptr, uint64_t slot, int64_t timestamp ){ - return upd_aggregate(ptr, slot, timestamp ); -} diff --git a/program/c/src/oracle/upd_aggregate.c b/program/c/src/oracle/upd_aggregate.c new file mode 100644 index 000000000..05c9bfa93 --- /dev/null +++ b/program/c/src/oracle/upd_aggregate.c @@ -0,0 +1,10 @@ +/* + * BPF upd_aggregate binding + */ +#include +#include "oracle.h" +#include "upd_aggregate.h" + +extern bool c_upd_aggregate( pc_price_t *ptr, uint64_t slot, int64_t timestamp ){ + return upd_aggregate(ptr, slot, timestamp ); +} diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 8a932201d..1d506be1d 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -1,10 +1,4 @@ #!/usr/bin/env bash -# -# Build given bpf makefile dir (./program by default): -# ~/pyth-client$ ./scripts/build-bpf.sh -# ~/pyth-client/program$ ../scripts/build-bpf.sh . -# ~/$ ./pyth-client/scripts/build-bpf.sh ./serum-pyth/program -# set -eu @@ -15,20 +9,13 @@ PYTH_DIR=$( cd "${1:-.}" && pwd) C_DIR="$( find $PYTH_DIR | grep makefile)" C_DIR=$(dirname $C_DIR) -if ! which cargo 2> /dev/null -then - # shellcheck disable=SC1090 - source "${CARGO_HOME:-$HOME/.cargo}/env" -fi - - set -x #build the C code and make an archive file out of it cd "${C_DIR}" -export V="${V:-1}" +export V=1 make clean -make "${@:2}" +make make cpyth-bpf make cpyth-native rm ./target/*-keypair.json From 2c53ac158afa3b606bc398b76864f49959a2d43f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 16 Aug 2022 23:43:45 +0000 Subject: [PATCH 03/14] Delete accidentaly pushed --- program/c/src/oracle/model/bin/test_price_model | Bin 37416 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 program/c/src/oracle/model/bin/test_price_model diff --git a/program/c/src/oracle/model/bin/test_price_model b/program/c/src/oracle/model/bin/test_price_model deleted file mode 100755 index b29373e2893fcf40e75fb764c6a9570e3969dcb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37416 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 From 98be34413bcf455028e124503dbf7274c1093122 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 17 Aug 2022 00:06:18 +0000 Subject: [PATCH 04/14] Restore cargo --- scripts/build-bpf.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 1d506be1d..35272a940 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -9,6 +9,12 @@ PYTH_DIR=$( cd "${1:-.}" && pwd) C_DIR="$( find $PYTH_DIR | grep makefile)" C_DIR=$(dirname $C_DIR) +if ! which cargo 2> /dev/null +then + # shellcheck disable=SC1090 + source "${CARGO_HOME:-$HOME/.cargo}/env" +fi + set -x #build the C code and make an archive file out of it From c54261b3f5719e97b6a4ff031098638f85b5aa93 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 17 Aug 2022 00:22:11 +0000 Subject: [PATCH 05/14] Add aggregation tests to CI --- docker/Dockerfile | 1 + program/c/src/oracle/model/run_tests | 4 ++-- program/c/src/oracle/sort/run_tests | 4 ++-- program/c/src/oracle/util/run_tests | 6 +++--- scripts/run-aggregation-tests.sh | 15 +++++++++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100755 scripts/run-aggregation-tests.sh diff --git a/docker/Dockerfile b/docker/Dockerfile index 62e3dec84..bbcd09f8b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -70,6 +70,7 @@ RUN ./pyth-client/scripts/patch-solana.sh # Build and test the oracle program. RUN cd pyth-client && ./scripts/build-bpf.sh . +RUN ./scripts/run-aggregation-tests.sh RUN /bin/bash -l -c "pytest-3 --pyargs pyth" ENTRYPOINT [] diff --git a/program/c/src/oracle/model/run_tests b/program/c/src/oracle/model/run_tests index ab5c8a1ce..07191b452 100755 --- a/program/c/src/oracle/model/run_tests +++ b/program/c/src/oracle/model/run_tests @@ -1,7 +1,7 @@ #!/bin/sh -module purge || exit 1 -module load gcc-9.3.0 || exit 1 +# module purge || exit 1 +# module load gcc-9.3.0 || exit 1 ./clean || exit 1 mkdir -pv bin || exit 1 diff --git a/program/c/src/oracle/sort/run_tests b/program/c/src/oracle/sort/run_tests index 310a2e4ae..a02cefbd5 100755 --- a/program/c/src/oracle/sort/run_tests +++ b/program/c/src/oracle/sort/run_tests @@ -1,7 +1,7 @@ #!/bin/sh -module purge || exit 1 -module load gcc-9.3.0 || exit 1 +# module purge || exit 1 +# module load gcc-9.3.0 || exit 1 ./clean || exit 1 mkdir -pv bin || exit 1 diff --git a/program/c/src/oracle/util/run_tests b/program/c/src/oracle/util/run_tests index 00ae9dbba..c6da4e347 100755 --- a/program/c/src/oracle/util/run_tests +++ b/program/c/src/oracle/util/run_tests @@ -1,7 +1,7 @@ #!/bin/sh -module purge || exit 1 -module load gcc-9.3.0 || exit 1 +# module purge || exit 1 +# module load gcc-9.3.0 || exit 1 ./clean || exit 1 mkdir -pv bin || exit 1 @@ -50,5 +50,5 @@ bin/test_avg || exit 1 #bin/test_prng_battery 2 0 0 || exit 1 # SmallCrush (seq 0, idx 0) #bin/test_prng_battery 3 0 0 || exit 1 # Crush: Takes >~20 min (seq 0, idx 0) #bin/test_prng_battery 4 0 0 || exit 1 # BigCrush: Takes >~3 hours (seq 0, idx 0) - +exit 1 echo all tests passed diff --git a/scripts/run-aggregation-tests.sh b/scripts/run-aggregation-tests.sh new file mode 100755 index 000000000..81caab69c --- /dev/null +++ b/scripts/run-aggregation-tests.sh @@ -0,0 +1,15 @@ +set -eux + +PYTH_DIR=$( cd "${1:-.}" && pwd) + +#find the makefile in pyth-client +#ASSUMES THAT there is only one makefile there +C_DIR="$( find $PYTH_DIR | grep makefile)" +C_DIR=$(dirname $C_DIR) + +cd "${C_DIR}/src/oracle/model" +./run_tests +cd "${C_DIR}/src/oracle/sort" +./run_tests +cd "${C_DIR}/src/oracle/util" +./run_tests \ No newline at end of file From 063371ae6fc08a0c0000f572b4bcf45b5485920c Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 17 Aug 2022 00:31:47 +0000 Subject: [PATCH 06/14] CI --- program/c/src/oracle/util/run_tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program/c/src/oracle/util/run_tests b/program/c/src/oracle/util/run_tests index c6da4e347..eb19703f3 100755 --- a/program/c/src/oracle/util/run_tests +++ b/program/c/src/oracle/util/run_tests @@ -50,5 +50,5 @@ bin/test_avg || exit 1 #bin/test_prng_battery 2 0 0 || exit 1 # SmallCrush (seq 0, idx 0) #bin/test_prng_battery 3 0 0 || exit 1 # Crush: Takes >~20 min (seq 0, idx 0) #bin/test_prng_battery 4 0 0 || exit 1 # BigCrush: Takes >~3 hours (seq 0, idx 0) -exit 1 + echo all tests passed From 0dcee46dff744e058136a94d544806f387ce22d4 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 17 Aug 2022 15:26:11 +0000 Subject: [PATCH 07/14] Should work --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index bbcd09f8b..3914942e6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -70,7 +70,7 @@ RUN ./pyth-client/scripts/patch-solana.sh # Build and test the oracle program. RUN cd pyth-client && ./scripts/build-bpf.sh . -RUN ./scripts/run-aggregation-tests.sh +RUN cd pyth-client && ./scripts/run-aggregation-tests.sh RUN /bin/bash -l -c "pytest-3 --pyargs pyth" ENTRYPOINT [] From 95623575e13219522c73449d48a4217496a36812 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Thu, 18 Aug 2022 19:08:23 +0000 Subject: [PATCH 08/14] Remove files --- program/c/src/oracle/util/bin/test_align | Bin 28592 -> 0 bytes program/c/src/oracle/util/bin/test_avg | Bin 156976 -> 0 bytes program/c/src/oracle/util/bin/test_hash | Bin 24320 -> 0 bytes program/c/src/oracle/util/bin/test_prng | Bin 46304 -> 0 bytes program/c/src/oracle/util/bin/test_round | Bin 20856 -> 0 bytes program/c/src/oracle/util/bin/test_sar | Bin 38032 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 program/c/src/oracle/util/bin/test_align delete mode 100755 program/c/src/oracle/util/bin/test_avg delete mode 100755 program/c/src/oracle/util/bin/test_hash delete mode 100755 program/c/src/oracle/util/bin/test_prng delete mode 100755 program/c/src/oracle/util/bin/test_round delete mode 100755 program/c/src/oracle/util/bin/test_sar diff --git a/program/c/src/oracle/util/bin/test_align b/program/c/src/oracle/util/bin/test_align deleted file mode 100755 index fced7c870f3d4f99f724f9bcd623675bb5c99522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28592 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 diff --git a/program/c/src/oracle/util/bin/test_avg b/program/c/src/oracle/util/bin/test_avg deleted file mode 100755 index 707face010aa2e04ce90650a7f836fea9dc14145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156976 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

m$M+6IlpbHtGwrh2<7%NIe@_FWxcIpv{WO|I zQL?cXYRg(EzgBy%vSZ5avyIKY_;Z^*uOpc9c(Xn8O#jkm&%dusTRE}H0k_ZozGk!M z=e$fCSW!`X|NlzZjH7^}QRQURnze{D;XP)VgVbhF_?fH85atC?4KHnsFooD+uAfUO&_Ph?` z?|xlU@$>v-J08bpU`r}&&+E0Hb^=6cm!!03d#1mH#A+}4m8zP!|C9auHhaE4ZCCaj zr}A1l{+Ry=6^e!9=j*_2%AVt7eU%Po#WmCjQ|cw0?Qbn1vcmRE>rvslRW+m>+Wp#f zY5icw$j=v);cGUbjTM`guupW$XkN1hg}U9oYYF?^TczQ{HUk?gb|`y$Kfl={?a$i| zIJRfHSJ~Ub6zT2Co(EPbupR3kSi-)uPinlvic8p&KR$PqsqU2Af;w<+21{My`NY2; hbbhmiXc{gInnbL&Ik(5(x`h3Y_elGPYz8(~{5RPT8aV&} diff --git a/program/c/src/oracle/util/bin/test_sar b/program/c/src/oracle/util/bin/test_sar deleted file mode 100755 index 974af586e56a3f72b20da2ffc69b228c3de40c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38032 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 Date: Thu, 18 Aug 2022 19:09:57 +0000 Subject: [PATCH 09/14] Remove files --- program/c/src/oracle/model/bin/test_price_model | Bin 37416 -> 0 bytes program/c/src/oracle/sort/bin/test_sort_stable | Bin 33848 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 program/c/src/oracle/model/bin/test_price_model delete mode 100755 program/c/src/oracle/sort/bin/test_sort_stable diff --git a/program/c/src/oracle/model/bin/test_price_model b/program/c/src/oracle/model/bin/test_price_model deleted file mode 100755 index b29373e2893fcf40e75fb764c6a9570e3969dcb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37416 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 diff --git a/program/c/src/oracle/sort/bin/test_sort_stable b/program/c/src/oracle/sort/bin/test_sort_stable deleted file mode 100755 index 977c82fae742dfc25bf4e68e7cfc10807be926b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33848 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 Date: Thu, 18 Aug 2022 19:16:17 +0000 Subject: [PATCH 10/14] Cleanup --- scripts/build-bpf.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 35272a940..4f1c74d14 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -19,7 +19,7 @@ set -x #build the C code and make an archive file out of it cd "${C_DIR}" -export V=1 +export V=1 #verbose flag for solana make clean make make cpyth-bpf From 9ca746d56c55b99863f6ee8bdbe82e10ffb18fb1 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Thu, 18 Aug 2022 19:21:34 +0000 Subject: [PATCH 11/14] Restore V flag --- scripts/build-bpf.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 4f1c74d14..7accae619 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -19,7 +19,7 @@ set -x #build the C code and make an archive file out of it cd "${C_DIR}" -export V=1 #verbose flag for solana +export V="${V:-1}" #verbose flag for solana make clean make make cpyth-bpf From d1c700adb963a5fcc64dd2be208280c22ed5d5fd Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Thu, 18 Aug 2022 19:26:23 +0000 Subject: [PATCH 12/14] Restore comment --- scripts/build-bpf.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 7accae619..56409d7ae 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# +# Build given bpf makefile dir (./program by default): +# ~/pyth-client$ ./scripts/build-bpf.sh +# ~/pyth-client/program$ ../scripts/build-bpf.sh set -eu From dbf911fdafc07173301a468ad427052589de43de Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Thu, 18 Aug 2022 19:27:20 +0000 Subject: [PATCH 13/14] Update comment --- scripts/build-bpf.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-bpf.sh b/scripts/build-bpf.sh index 56409d7ae..53bf39f2e 100755 --- a/scripts/build-bpf.sh +++ b/scripts/build-bpf.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build given bpf makefile dir (./program by default): +# Build bpf oracle program : # ~/pyth-client$ ./scripts/build-bpf.sh # ~/pyth-client/program$ ../scripts/build-bpf.sh From 7edfe84948c7d7e745466782fbb3598f33f22107 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Thu, 18 Aug 2022 21:21:38 +0000 Subject: [PATCH 14/14] Proper entrypoint --- program/c/src/oracle/oracle.h | 7 ----- program/rust/src/error.rs | 4 --- program/rust/src/lib.rs | 46 ++-------------------------- program/rust/src/processor.rs | 19 +++++------- program/rust/src/rust_oracle.rs | 53 ++++++++++++++++----------------- 5 files changed, 35 insertions(+), 94 deletions(-) diff --git a/program/c/src/oracle/oracle.h b/program/c/src/oracle/oracle.h index 3db9b8b09..ae13a6fd5 100644 --- a/program/c/src/oracle/oracle.h +++ b/program/c/src/oracle/oracle.h @@ -6,13 +6,6 @@ extern "C" { #endif -//A return value indicating that the aggregate price was updated -//this triggers SMA trackers to update -//values 0-14 are defined in solana_sdk.h (v1.10.31 ) -//used consts instead of define because bingen always turns -// defines to u32 (even with ULL suffix) -const uint64_t SUCCESSFULLY_UPDATED_AGGREGATE = 1000ULL; - // The size of the "time machine" account defined in the // Rust portion of the codebase. const uint64_t TIME_MACHINE_STRUCT_SIZE = 1864ULL; diff --git a/program/rust/src/error.rs b/program/rust/src/error.rs index ba89117bb..91d9f9b71 100644 --- a/program/rust/src/error.rs +++ b/program/rust/src/error.rs @@ -1,11 +1,7 @@ //! Error types use solana_program::program_error::ProgramError; -use std::result::Result; use thiserror::Error; -// similar to ProgramResult but allows for multiple success values -pub type OracleResult = Result; - /// Errors that may be returned by the oracle program #[derive(Clone, Debug, Eq, Error, PartialEq)] pub enum OracleError { diff --git a/program/rust/src/lib.rs b/program/rust/src/lib.rs index d8fbb3d5d..424d00eee 100644 --- a/program/rust/src/lib.rs +++ b/program/rust/src/lib.rs @@ -18,22 +18,10 @@ mod tests; #[cfg(feature = "debug")] mod log; -use crate::c_oracle_header::SUCCESSFULLY_UPDATED_AGGREGATE; use crate::error::OracleError; - -#[cfg(feature = "debug")] -use crate::log::{ - post_log, - pre_log, -}; - use processor::process_instruction; -use solana_program::entrypoint::deserialize; -use solana_program::{ - custom_heap_default, - custom_panic_default, -}; +use solana_program::entrypoint; //Below is a high lever description of the rust/c setup. @@ -50,34 +38,4 @@ use solana_program::{ //at the the top of c_oracle_headers.rs. One of the most important traits we deal are the Borsh //serialization traits. - -#[no_mangle] -pub extern "C" fn entrypoint(input: *mut u8) -> u64 { - let (program_id, accounts, instruction_data) = unsafe { deserialize(input) }; - - #[cfg(feature = "debug")] - if let Err(error) = pre_log(&accounts, instruction_data) { - return error.into(); - } - - let c_ret_val = match process_instruction(program_id, &accounts, instruction_data) { - Err(error) => error.into(), - Ok(success_status) => success_status, - }; - - #[cfg(feature = "debug")] - if let Err(error) = post_log(c_ret_val, &accounts) { - return error.into(); - } - - - if c_ret_val == SUCCESSFULLY_UPDATED_AGGREGATE { - //0 is the SUCCESS value for solana - 0 - } else { - c_ret_val - } -} - -custom_heap_default!(); -custom_panic_default!(); +entrypoint!(process_instruction); diff --git a/program/rust/src/processor.rs b/program/rust/src/processor.rs index 09343022f..28f734fd2 100644 --- a/program/rust/src/processor.rs +++ b/program/rust/src/processor.rs @@ -1,7 +1,3 @@ -use solana_program::program_error::ProgramError; -use solana_program::pubkey::Pubkey; -use solana_program::sysvar::slot_history::AccountInfo; - use crate::c_oracle_header::{ cmd_hdr, command_t_e_cmd_add_mapping, @@ -20,10 +16,12 @@ use crate::c_oracle_header::{ PC_VERSION, }; use crate::deserialize::load; -use crate::error::{ - OracleError, - OracleResult, -}; +use crate::error::OracleError; +use solana_program::entrypoint::ProgramResult; +use solana_program::program_error::ProgramError; +use solana_program::pubkey::Pubkey; +use solana_program::sysvar::slot_history::AccountInfo; + use crate::rust_oracle::{ add_mapping, add_price, @@ -44,13 +42,10 @@ pub fn process_instruction( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_data = load::(instruction_data)?; if cmd_data.ver_ != PC_VERSION { - //FIXME: I am not sure what's best to do here (this is copied from C) - // it seems to me like we should not break when version numbers change - //instead we should log a message that asks users to call update_version return Err(ProgramError::InvalidArgument); } diff --git a/program/rust/src/rust_oracle.rs b/program/rust/src/rust_oracle.rs index 5dbcfe7f3..c44ec9faf 100644 --- a/program/rust/src/rust_oracle.rs +++ b/program/rust/src/rust_oracle.rs @@ -9,7 +9,7 @@ use bytemuck::{ }; use solana_program::account_info::AccountInfo; use solana_program::clock::Clock; -use solana_program::entrypoint::SUCCESS; +use solana_program::entrypoint::ProgramResult; use solana_program::program_error::ProgramError; use solana_program::program_memory::{ sol_memcpy, @@ -57,7 +57,6 @@ use crate::deserialize::{ load_account_as_mut, load_checked, }; -use crate::error::OracleResult; use crate::OracleError; use crate::utils::{ @@ -113,7 +112,7 @@ pub fn resize_price_account( program_id: &Pubkey, accounts: &[AccountInfo], _instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let [funding_account_info, price_account_info, system_program] = match accounts { [x, y, z] => Ok([x, y, z]), _ => Err(ProgramError::InvalidArgument), @@ -156,9 +155,9 @@ pub fn resize_price_account( load_checked::(price_account_info, PC_VERSION)?; //Initialize Time Machine price_account.initialize_time_machine()?; - Ok(SUCCESS) + Ok(()) } - PRICE_ACCOUNT_SIZE => Ok(SUCCESS), + PRICE_ACCOUNT_SIZE => Ok(()), _ => Err(ProgramError::InvalidArgument), } } @@ -171,7 +170,7 @@ pub fn init_mapping( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let [funding_account, fresh_mapping_account] = match accounts { [x, y] => Ok([x, y]), _ => Err(ProgramError::InvalidArgument), @@ -189,14 +188,14 @@ pub fn init_mapping( let hdr = load::(instruction_data)?; initialize_pyth_account_checked::(fresh_mapping_account, hdr.ver_)?; - Ok(SUCCESS) + Ok(()) } pub fn add_mapping( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let [funding_account, cur_mapping, next_mapping] = match accounts { [x, y, z] => Ok([x, y, z]), _ => Err(ProgramError::InvalidArgument), @@ -217,7 +216,7 @@ pub fn add_mapping( initialize_pyth_account_checked::(next_mapping, hdr.ver_)?; pubkey_assign(&mut cur_mapping.next_, &next_mapping.key.to_bytes()); - Ok(SUCCESS) + Ok(()) } /// a publisher updates a price @@ -228,7 +227,7 @@ pub fn upd_price( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_args = load::(instruction_data)?; let [funding_account, price_account, clock_account] = match accounts { @@ -316,16 +315,16 @@ pub fn upd_price( } } - Ok(SUCCESS) + Ok(()) } pub fn upd_price_no_fail_on_error( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { match upd_price(program_id, accounts, instruction_data) { - Err(_) => Ok(SUCCESS), + Err(_) => Ok(()), Ok(value) => Ok(value), } } @@ -339,7 +338,7 @@ pub fn add_price( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_args = load::(instruction_data)?; check_exponent_range(cmd_args.expo_)?; @@ -369,14 +368,14 @@ pub fn add_price( pubkey_assign(&mut price_data.next_, bytes_of(&product_data.px_acc_)); pubkey_assign(&mut product_data.px_acc_, &price_account.key.to_bytes()); - Ok(SUCCESS) + Ok(()) } pub fn init_price( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_args = load::(instruction_data)?; check_exponent_range(cmd_args.expo_)?; @@ -432,7 +431,7 @@ pub fn init_price( ); } - Ok(SUCCESS) + Ok(()) } /// add a publisher to a price account @@ -442,7 +441,7 @@ pub fn add_publisher( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_args = load::(instruction_data)?; pyth_assert( @@ -485,7 +484,7 @@ pub fn add_publisher( price_data.size_ = try_convert::<_, u32>(size_of::() - size_of_val(&price_data.comp_))? + price_data.num_ * try_convert::<_, u32>(size_of::())?; - Ok(SUCCESS) + Ok(()) } /// add a publisher to a price account @@ -495,7 +494,7 @@ pub fn del_publisher( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd_args = load::(instruction_data)?; pyth_assert( @@ -529,7 +528,7 @@ pub fn del_publisher( price_data.size_ = try_convert::<_, u32>(size_of::() - size_of_val(&price_data.comp_))? + price_data.num_ * try_convert::<_, u32>(size_of::())?; - return Ok(SUCCESS); + return Ok(()); } } Err(ProgramError::InvalidArgument) @@ -539,7 +538,7 @@ pub fn add_product( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let [funding_account, tail_mapping_account, new_product_account] = match accounts { [x, y, z] => Ok([x, y, z]), _ => Err(ProgramError::InvalidArgument), @@ -574,7 +573,7 @@ pub fn add_product( try_convert::<_, u32>(size_of::() - size_of_val(&mapping_data.prod_))? + mapping_data.num_ * try_convert::<_, u32>(size_of::())?; - Ok(SUCCESS) + Ok(()) } /// Update the metadata associated with a product, overwriting any existing metadata. @@ -583,7 +582,7 @@ pub fn upd_product( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let [funding_account, product_account] = match accounts { [x, y] => Ok([x, y]), _ => Err(ProgramError::InvalidArgument), @@ -634,14 +633,14 @@ pub fn upd_product( let mut product_data = load_checked::(product_account, hdr.ver_)?; product_data.size_ = try_convert(size_of::() + new_data.len())?; - Ok(SUCCESS) + Ok(()) } pub fn set_min_pub( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], -) -> OracleResult { +) -> ProgramResult { let cmd = load::(instruction_data)?; pyth_assert( @@ -660,5 +659,5 @@ pub fn set_min_pub( let mut price_account_data = load_checked::(price_account, cmd.ver_)?; price_account_data.min_pub_ = cmd.min_pub_; - Ok(SUCCESS) + Ok(()) }