diff --git a/.gitignore b/.gitignore index 1c8528a6..2220c13b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ coverage .idea *.tgz docs/ +.yalc +yalc.lock diff --git a/packages/http/src/resources/Vars.ts b/packages/http/src/resources/Vars.ts index 2520f83a..9feb055a 100644 --- a/packages/http/src/resources/Vars.ts +++ b/packages/http/src/resources/Vars.ts @@ -1,16 +1,60 @@ -import type Client from '../Client' import camelcaseKeys from 'camelcase-keys' +import type Client from '../Client' + +interface TransactionVars { + txnFeeMultiplier?: number + dcPayloadSize?: number + stakingFeeTxnAssertLocationV1?: number + stakingFeeTxnAddGatewayV1?: number +} export default class Vars { private client!: Client + /** + * The chain vars needed for transaction configuration. + * @private + */ + private TXN_VARS: string[] = [ + 'txn_fee_multiplier', + 'dc_payload_size', + 'staking_fee_txn_assert_location_v1', + 'staking_fee_txn_add_gateway_v1', + ] + + private baseUrl = '/vars' + constructor(client: Client) { this.client = client } - async get(): Promise { - const url = `/vars` - const { data: { data: vars } } = await this.client.get(url) + /** + * Fetches the chain vars required to configure helium-js for blockchain transactions. + */ + async getTransactionVars(): Promise { + const { data: { data: vars } } = await this.client.get(this.baseUrl, { keys: this.TXN_VARS.join(',') }) + return camelcaseKeys(vars) + } + + /** + * Fetches the specific chain vars passed in keys. If called without keys it will fetch the + * transaction vars returned by {@link getTransactionVars}. + * @param keys array of chain vars to fetch eg 'poc_v4_prob_no_rssi' + */ + async get(keys: string[] = []): Promise { + if (keys.length === 0) { + return this.getTransactionVars() + } + const { data: { data: vars } } = await this.client.get(this.baseUrl, { keys: keys.join(',') }) + return camelcaseKeys(vars) + } + + /** + * WARNING: This will be return over 10 MB of data. + * Fetches all chain vars. + */ + async getAll(): Promise { + const { data: { data: vars } } = await this.client.get(this.baseUrl) return camelcaseKeys(vars) } } diff --git a/packages/http/src/resources/__mocks__/varsMock.ts b/packages/http/src/resources/__mocks__/varsMock.ts new file mode 100644 index 00000000..b706bdb3 --- /dev/null +++ b/packages/http/src/resources/__mocks__/varsMock.ts @@ -0,0 +1,3 @@ +const MOCK_CHAIN_VARS = '{"poc_v4_prob_no_rssi":0.5,"poc_addr_hash_byte_count":8,"min_score":0.15,"nonce":92,"max_antenna_gain":150,"assert_loc_txn_version":2,"var_gw_inactivity_threshold":600,"poc_v4_target_challenge_age":1000,"price_oracle_refresh_interval":10,"net_emissions_enabled":true,"sc_open_validation_bugfix":1,"dkg_penalty":1.0,"poc_challenge_sync_interval":90,"hip17_res_1":[2,100000,100000],"net_emissions_max_rate":3424000000,"witness_refresh_interval":200,"region_cn470_params":"CjUI4LLx5wEQyNAHGL8BIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CKDN_ecBEMjQBxi_ASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjg54noARDI0AcYvwEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIoIKW6AEQyNAHGL8BIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1COCcougBEMjQBxi_ASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQigt67oARDI0AcYvwEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUI4NG66AEQyNAHGL8BIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CKDsxugBEMjQBxi_ASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","poc_challengers_percent":0.009,"region_ru864_params":"CjUIoL2EnAMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CODXkJwDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQig8pycAxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUI4IypnAMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CKCntZwDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQiguameAxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUI4NO1ngMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAg","election_cluster_res":4,"dc_percent":0.35,"poc_v4_prob_rssi_wt":0.0,"sc_overcommit":2,"min_antenna_gain":10,"poc_good_bucket_low":-130,"region_as923_1_params":"CjUIgNSbuAMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMDup7gDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQiAibS4AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIwKPAuAMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CIC-zLgDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjA2Ni4AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIgPPkuAMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMCN8bgDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","poc_v4_prob_count_wt":0.0,"validator_liveness_interval":100,"poc_v4_prob_good_rssi":1.0,"poc_v4_target_prob_score_wt":0.0,"election_bba_penalty":0.1,"dataonly_gateway_capabilities_mask":1,"hip17_res_0":[2,100000,100000],"sc_gc_interval":10,"poc_centrality_wt":0.5,"price_oracle_height_delta":10,"poc_witnesses_percent":0.2008,"consensus_percent":0.06,"poc_v4_target_prob_edge_wt":0.0,"staking_fee_txn_assert_location_dataonly_gateway_v1":500000,"election_replacement_slope":20,"transfer_hotspot_stale_poc_blocks":1200,"poc_v4_randomness_wt":0.5,"staking_fee_txn_add_dataonly_gateway_v1":1000000,"min_expire_within":15,"beta_decay":0.002,"hip15_tx_reward_unit_cap":2.0,"poc_challengees_percent":0.0502,"region_as923_4_params":"CjUIoMaztQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CODgv7UDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQig-8u1AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUI4JXYtQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CKCw5LUDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjgyvC1AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIoOX8tQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1COD_iLYDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","poc_witness_consideration_limit":20,"vars_commit_delay":1,"region_in865_params":"CjUI5Jy_nAMQyNAHGKwCIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CIT905wDEMjQBxisAiImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjow_ecAxDI0AcYrAIiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIAC","predicate_callback_fun":"version","hip17_res_12":[2,100000,100000],"penalty_history_limit":20160,"light_gateway_capabilities_mask":31,"election_restart_interval":5,"poc_v4_prob_time_wt":0.0,"poc_target_hex_parent_res":5,"poc_v4_parent_res":11,"block_version":"v1","hip17_res_11":[2,100000,100000],"poc_v5_target_prob_randomness_wt":1.0,"election_version":6,"hip17_res_6":[1,25,100],"election_restart_interval_range":3,"price_oracle_price_scan_delay":3600,"price_oracle_price_scan_max":90000,"allow_payment_v2_memos":true,"staking_keys_to_mode_mappings":{"14sKWeeYWQWrBSnLGq79uRQqZyw3Ldi7oBdxbF6a54QboTNBXDL":"full","14rb2UcfS9U89QmKswpZpjRCUVCVu1haSyqyGY486EvsYtvdJmR":"full","14iLrXUuGVhb7w1P8X3iBvRwoT9oemgbDonm5VVZJk56TdV8NV1":"full","14iC6N1HkqUjH7WEChHVQhPqJ1hbWBKpZXZVeHHykCA7tNDYF2C":"full","14h2zf1gEr9NmvDb2U53qucLN2jLrKU1ECBoxGnSnQ6tiT6V2kM":"full","14go8hvEDnotWTyhYv6Hu5PTnRUAQzJqbB6dsDm1oThkCcZe9zd":"full","14eUfY1GsjK4WH6uZYoeagnFtigBKdvPruAXLmc5UsUMEDj3yib":"full","14NBXJE5kAAZTMigY4dcjXSMG4CSqjYwvteQWwQsYhsu2TKN6AF":"full","14DdSjvEkBQ46xQ24LAtHwQkAeoUUZHfGCosgJe33nRQ6rZwPG3":"full","143QF5dTGyAg1FqaE85mPApvjauFU8fUy6wavirQfJJDgSkC4gn":"full","13y2EqUUzyQhQGtDSoXktz8m5jHNSiwAKLTYnHNxZq2uH5GGGym":"full","13v9iGhjvQUtVaZXcFFRCEbL1nPR4R8QJowBgMUcaGM2v1aV6mn":"full","13daGGWvDQyTyHFDCPz8zDSVTWgPNNfJ4oh31Teec4TRWfjMx53":"full","13Zni1he7KY9pUmkXMhEhTwfUpL9AcEV1m2UbbvFsrU9QPTMgE3":"full","13XuP2DjHEHVkKguDDZD2ev5AeqMLuJ8UQ44efEcDmVTnBcvc6F":"full","13Mpg5hCNjSxHJvWjaanwJPBuTXu1d4g5pGvGBkqQe3F8mAwXhK":"full","13MS2kZHU4h6wp3tExgoHdDFjBsb9HB9JBvcbK9XmfNyJ7jqzVv":"full","13LVwCqZEKLTVnf3sjGPY1NMkTE7fWtUVjmDfeuscMFgeK3f9pn":"full","13H6RpJojJjkqPRfzdrFBDbpYw4b3A6HyMxgGFRgXf31Nuwq4xJ":"full","13ENbEQPAvytjLnqavnbSAzurhGoCSNkGECMx7eHHDAfEaDirdY":"full","134C7Hn3vhfBLQZex4PVwtxQ2uPJH97h9YD2bhzy1W2XhMJyY6d":"full","12zX4jgDGMbJgRwmCfRNGXBuphkQRqkUTcLzYHTQvd4Qgu8kiL4":"full"},"hip17_res_7":[2,5,20],"max_xor_filter_num":5,"region_eu433_params":"CjMI_PHTFBDI0AcYeSImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKMwicjtUUEMjQBxh5IiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgozCLyq1hQQyNAHGHkiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIAC","hip17_res_10":[2,1,1],"poc_reward_decay_rate":0.8,"allow_zero_amount":false,"sc_grace_blocks":10,"election_selection_pct":1,"validator_minimum_stake":1000000000000,"staking_fee_txn_add_gateway_v1":4000000,"tenure_penalty":0.5,"block_time":60000,"snapshot_interval":720,"securities_percent":0.33,"region_au915_params":"CjUIgISVtQMQyNAHGKwCIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMCeobUDEMjQBxisAiImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQiAua21AxDI0AcYrAIiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIwNO5tQMQyNAHGKwCIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CIDuxbUDEMjQBxisAiImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjAiNK1AxDI0AcYrAIiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIgKPetQMQyNAHGKwCIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMC96rUDEMjQBxisAiImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","snapshot_version":1,"rewards_txn_version":2,"txn_fees":true,"predicate_threshold":0.95,"dkg_curve":"SS512","poc_challenge_interval":240,"poc_max_hop_cells":2000,"predicate_callback_mod":"miner","density_tgt_res":4,"batch_size":1500,"poc_per_hop_max_witnesses":18,"region_as923_2_params":"CjUIwOWttwMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CICAurcDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjAmsa3AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIgLXStwMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMDP3rcDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQiA6uq3AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIwIT3twMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CICfg7gDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","dc_payload_size":24,"region_us915_params":"CikI4NaBrwMQyNAHGOgCIhoKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgopCKDxja8DEMjQBxjoAiIaCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKKQjgi5qvAxDI0AcY6AIiGgoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCikIoKamrwMQyNAHGOgCIhoKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgopCODAsq8DEMjQBxjoAiIaCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKKQig276vAxDI0AcY6AIiGgoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCikI4PXKrwMQyNAHGOgCIhoKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgopCKCQ168DEMjQBxjoAiIaCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","full_gateway_capabilities_mask":63,"stake_withdrawal_cooldown":250000,"validator_penalty_filter":10.0,"poc_v4_target_score_curve":5,"alpha_decay":0.0035,"stake_withdrawal_max":60,"monthly_reward":250000000000000,"h3_max_grid_distance":120,"poc_v4_target_exclusion_cells":6000,"max_subnet_size":65536,"sc_only_count_open_active":true,"hip17_res_2":[2,100000,100000],"min_assert_h3_res":12,"staking_fee_txn_oui_v1_per_address":10000000,"max_payments":50,"staking_fee_txn_oui_v1":10000000,"max_open_sc":25,"poc_v4_exclusion_cells":8,"poc_v4_prob_bad_rssi":0.01,"witness_refresh_rand_n":1000,"h3_exclusion_ring_dist":6,"poc_typo_fixes":true,"hip17_res_3":[2,100000,100000],"hip17_interactivity_blocks":3600,"num_consensus_members":43,"staking_keys":["13ENbEQPAvytjLnqavnbSAzurhGoCSNkGECMx7eHHDAfEaDirdY","13daGGWvDQyTyHFDCPz8zDSVTWgPNNfJ4oh31Teec4TRWfjMx53","13Zni1he7KY9pUmkXMhEhTwfUpL9AcEV1m2UbbvFsrU9QPTMgE3","14rb2UcfS9U89QmKswpZpjRCUVCVu1haSyqyGY486EvsYtvdJmR","14sKWeeYWQWrBSnLGq79uRQqZyw3Ldi7oBdxbF6a54QboTNBXDL","12zX4jgDGMbJgRwmCfRNGXBuphkQRqkUTcLzYHTQvd4Qgu8kiL4","13MS2kZHU4h6wp3tExgoHdDFjBsb9HB9JBvcbK9XmfNyJ7jqzVv","14h2zf1gEr9NmvDb2U53qucLN2jLrKU1ECBoxGnSnQ6tiT6V2kM","13Mpg5hCNjSxHJvWjaanwJPBuTXu1d4g5pGvGBkqQe3F8mAwXhK","13LVwCqZEKLTVnf3sjGPY1NMkTE7fWtUVjmDfeuscMFgeK3f9pn","14NBXJE5kAAZTMigY4dcjXSMG4CSqjYwvteQWwQsYhsu2TKN6AF","134C7Hn3vhfBLQZex4PVwtxQ2uPJH97h9YD2bhzy1W2XhMJyY6d","13XuP2DjHEHVkKguDDZD2ev5AeqMLuJ8UQ44efEcDmVTnBcvc6F","14eUfY1GsjK4WH6uZYoeagnFtigBKdvPruAXLmc5UsUMEDj3yib","14go8hvEDnotWTyhYv6Hu5PTnRUAQzJqbB6dsDm1oThkCcZe9zd","14iC6N1HkqUjH7WEChHVQhPqJ1hbWBKpZXZVeHHykCA7tNDYF2C","13y2EqUUzyQhQGtDSoXktz8m5jHNSiwAKLTYnHNxZq2uH5GGGym","13v9iGhjvQUtVaZXcFFRCEbL1nPR4R8QJowBgMUcaGM2v1aV6mn","14DdSjvEkBQ46xQ24LAtHwQkAeoUUZHfGCosgJe33nRQ6rZwPG3","143QF5dTGyAg1FqaE85mPApvjauFU8fUy6wavirQfJJDgSkC4gn","14iLrXUuGVhb7w1P8X3iBvRwoT9oemgbDonm5VVZJk56TdV8NV1","13H6RpJojJjkqPRfzdrFBDbpYw4b3A6HyMxgGFRgXf31Nuwq4xJ"],"hip17_res_5":[1,100,400],"region_kr920_params":"CjUIoMLYtwMQyNAHGIwBIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CODc5LcDEMjQBxiMASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQig9_C3AxDI0AcYjAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUI4JH9twMQyNAHGIwBIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CKCsibgDEMjQBxiMASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjgxpW4AxDI0AcYjAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIoOGhuAMQyNAHGIwBIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAg","sc_max_actors":2000,"witness_redundancy":4,"region_as923_3_params":"CjUIwOmItQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CICElbUDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQjAnqG1AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIgLmttQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CMDTubUDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAIKNQiA7sW1AxDI0AcYoAEiJgoECAYQGQoECAUQGQoECAQQGQoECAMQQwoFCAIQiwEKBQgBEIACCjUIwIjStQMQyNAHGKABIiYKBAgGEBkKBAgFEBkKBAgEEBkKBAgDEEMKBQgCEIsBCgUIARCAAgo1CICj3rUDEMjQBxigASImCgQIBhAZCgQIBRAZCgQIBBAZCgQIAxBDCgUIAhCLAQoFCAEQgAI","data_aggregation_version":3,"staking_fee_txn_assert_location_light_gateway_v1":1000000,"reward_version":6,"election_seen_penalty":0.33,"election_removal_pct":40,"staking_fee_txn_add_light_gateway_v1":4000000,"hip17_res_4":[1,250,800],"hip17_res_9":[2,1,2],"txn_fee_multiplier":5000,"price_oracle_public_keys":["13CFFcmPtMvNQCpWQRXCTqXPnXtcsibDWVwiQRKpUCt4nqtF7RE","1431WVQvoV7RAJpoLCaBrTKner1Soed4bk69DddcrHUTCWHV6pj","136n9BEbreGUNgXJWtyzkBQcXiNzdMQ5GBoP8L2J6ZReFUAwUjy","14sqAYg1qxzjKTtyHLYZdH6yDtA3KgyoARhWN1cvLZ94dZw5vEc","145J6Aye86pKTJrUHREiXu7qqppZBcWY1bvWo8id7ZjxyuainYj","14EzXp4i1xYA7SNyim6R4J5aXN1yHYKNiPrrJ2WEvoDnxmLgaCg","147yRbowD1krUCC1DhhSMhpFEqnkwb26mHBow5nk9q43AakSHNA","13ZGgWX4Ajz9g9t3tM9ohDyso12o2E2CpYbMF2RBaT93rj7souE","1489qpKWAoLrURcaQEM1wJEViD4mk9WcqZMGhiTFfNGmaz8NFdX","14hntpRicek9pxzHBDPVWPwYHHmExrksaxzAsTjjstgLfnfG5Ve","14aQaRARuwLTLHLygiDNNapKZ7bcLSyXhHq9DeZ5kB2dnCxiiKv"],"max_xor_filter_size":102400,"validator_liveness_grace_period":50,"max_subnet_num":5,"min_subnet_size":8,"poc_path_limit":1,"election_interval":30,"sc_causality_fix":1,"hip17_res_8":[2,1,4],"validator_version":3,"staking_fee_txn_assert_location_v1":1000000,"poc_good_bucket_high":-70,"chain_vars_version":2,"poc_version":10,"max_staleness":100000,"election_replacement_factor":4,"h3_neighbor_res":12,"region_eu868_params":"CiMI4Mq7nQMQyNAHGKEBIhQKBAgGEEEKBQgDEIEBCgUIAhDuAQojCKDlx50DEMjQBxihASIUCgQIBhBBCgUIAxCBAQoFCAIQ7gEKIwjg_9OdAxDI0AcYoQEiFAoECAYQQQoFCAMQgQEKBQgCEO4BCiMIoJrgnQMQyNAHGKEBIhQKBAgGEEEKBQgDEIEBCgUIAhDuAQojCOC07J0DEMjQBxihASIUCgQIBhBBCgUIAxCBAQoFCAIQ7gEKIwigz_idAxDI0AcYoQEiFAoECAYQQQoFCAMQgQEKBQgCEO4BCiMI4OmEngMQyNAHGKEBIhQKBAgGEEEKBQgDEIEBCgUIAhDuAQojCKCEkZ4DEMjQBxihASIUCgQIBhBBCgUIAxCBAQoFCAIQ7gE","sc_version":2}' + +export default MOCK_CHAIN_VARS diff --git a/packages/http/src/resources/__tests__/Vars.spec.ts b/packages/http/src/resources/__tests__/Vars.spec.ts index 7901cd4d..52d2fb18 100644 --- a/packages/http/src/resources/__tests__/Vars.spec.ts +++ b/packages/http/src/resources/__tests__/Vars.spec.ts @@ -1,36 +1,80 @@ import nock from 'nock' import Client from '../../Client' +import MOCK_CHAIN_VARS from '../__mocks__/varsMock' -const varsFixture = () => ({ - election_seen_penalty: 0.0033333, - election_removal_pct: 40, - price_oracle_public_keys: [ - '13Btezbvbwr9LhKmDQLgBnJUgjhZighEjNPLeu79dqBbmXRwoWm', - '13CFFcmPtMvNQCpWQRXCTqXPnXtcsibDWVwiQRKpUCt4nqtF7RE', - '1431WVQvoV7RAJpoLCaBrTKner1Soed4bk69DddcrHUTCWHV6pj', - '136n9BEbreGUNgXJWtyzkBQcXiNzdMQ5GBoP8L2J6ZReFUAwUjy', - '14sqAYg1qxzjKTtyHLYZdH6yDtA3KgyoARhWN1cvLZ94dZw5vEc', - '145J6Aye86pKTJrUHREiXu7qqppZBcWY1bvWo8id7ZjxyuainYj', - '13dUGHis1PdrSwxdseoyZKzQhc8WuWcueAWdT95sDVGDNhGRWV9', - '14EzXp4i1xYA7SNyim6R4J5aXN1yHYKNiPrrJ2WEvoDnxmLgaCg', - '147yRbowD1krUCC1DhhSMhpFEqnkwb26mHBow5nk9q43AakSHNA', - ], - max_xor_filter_size: 102400, - max_subnet_num: 5, - min_subnet_size: 8, -}) +const varsFixture = (keys: string[] = []) => { + const vars = JSON.parse(MOCK_CHAIN_VARS) + if (keys.length === 0) { + return vars + } + return Object.keys(vars) + .filter((key) => keys.includes(key)) + .reduce((res, key) => Object.assign(res, { [key]: vars[key] }), {}) +} describe('get vars', () => { - nock('https://api.helium.io').get('/v1/vars').reply(200, { - data: varsFixture(), + nock('https://api.helium.io') + .get('/v1/vars') + .reply(200, { + data: varsFixture(), + }) + + nock('https://api.helium.io') + .get('/v1/vars?keys=txn_fee_multiplier%2Cdc_payload_size%2Cstaking_fee_txn_assert_location_v1%2Cstaking_fee_txn_add_gateway_v1') + .reply(200, { + data: varsFixture([ + 'txn_fee_multiplier', + 'dc_payload_size', + 'staking_fee_txn_assert_location_v1', + 'staking_fee_txn_add_gateway_v1', + ]), + }) + + nock('https://api.helium.io') + .get('/v1/vars?keys=poc_v4_prob_no_rssi') + .reply(200, { + data: varsFixture([ + 'poc_v4_prob_no_rssi', + ]), + }) + + nock('https://api.helium.io') + .get('/v1/vars?keys=poc_v4_prob_no_rssi%2Cpoc_addr_hash_byte_count') + .reply(200, { + data: varsFixture([ + 'poc_v4_prob_no_rssi', + 'poc_addr_hash_byte_count', + ]), + }) + + it('getAll retrieves all chain vars', async () => { + const client = new Client() + const vars = await client.vars.getAll() + expect(Object.keys(vars).length).toBe(158) }) - it('retrieves chain vars', async () => { + it('get retrieves txn chain vars by default', async () => { const client = new Client() const vars = await client.vars.get() - expect(vars.electionRemovalPct).toBe(40) - expect(vars.priceOraclePublicKeys[0]).toBe( - '13Btezbvbwr9LhKmDQLgBnJUgjhZighEjNPLeu79dqBbmXRwoWm', - ) + expect(vars.txnFeeMultiplier).toBe(5000) + expect(vars.dcPayloadSize).toBe(24) + expect(vars.stakingFeeTxnAssertLocationV1).toBe(1000000) + expect(vars.stakingFeeTxnAddGatewayV1).toBe(4000000) + expect(Object.keys(vars).length).toBe(4) + }) + + it('get retrieves one specific chain var', async () => { + const client = new Client() + const vars = await client.vars.get(['poc_v4_prob_no_rssi']) + expect(vars.pocV4ProbNoRssi).toBe(0.5) + expect(Object.keys(vars).length).toBe(1) + }) + + it('get retrieves multiple specific chain vars', async () => { + const client = new Client() + const vars = await client.vars.get(['poc_v4_prob_no_rssi', 'poc_addr_hash_byte_count']) + expect(vars.pocV4ProbNoRssi).toBe(0.5) + expect(vars.pocAddrHashByteCount).toBe(8) + expect(Object.keys(vars).length).toBe(2) }) }) diff --git a/packages/http/yarn.lock b/packages/http/yarn.lock index 015a8691..7b823813 100644 --- a/packages/http/yarn.lock +++ b/packages/http/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@helium/currency@^3.45.0": + version "3.45.0" + resolved "https://registry.yarnpkg.com/@helium/currency/-/currency-3.45.0.tgz#326933225047601f447209fb9c77c6d4b114c381" + integrity sha512-6hajnB+L5OQgbQJyGzzYrHlcpRnt1j9thjt+zKhLP672VgfqJWaBs5unI+yhqHvF3JPB2/DsLj3/oT4hL0z84A== + dependencies: + bignumber.js "^9.0.0" + "@types/qs@6.9.5": version "6.9.5" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" @@ -14,6 +21,11 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" +bignumber.js@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" + integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"