From e0b6d26cf0eee976b00f17ad26f29587d5f65d02 Mon Sep 17 00:00:00 2001 From: trentmc Date: Wed, 28 Feb 2024 10:03:31 +0100 Subject: [PATCH 01/22] Fix #688: [Bug, pdr bot] PredictoorContract deepcopy() causes RecursionError --- .../contract/test/test_predictoor_contract.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pdr_backend/contract/test/test_predictoor_contract.py b/pdr_backend/contract/test/test_predictoor_contract.py index 6ed252511..ad0185d77 100644 --- a/pdr_backend/contract/test/test_predictoor_contract.py +++ b/pdr_backend/contract/test/test_predictoor_contract.py @@ -1,3 +1,4 @@ +import copy from unittest.mock import Mock import pytest @@ -5,7 +6,10 @@ from pytest import approx from pdr_backend.conftest_ganache import S_PER_EPOCH -from pdr_backend.contract.predictoor_contract import mock_predictoor_contract +from pdr_backend.contract.predictoor_contract import ( + PredictoorContract, + mock_predictoor_contract, +) from pdr_backend.contract.token import Token from pdr_backend.util.mathutil import from_wei, to_wei @@ -169,3 +173,11 @@ def test_mock_predictoor_contract(): c = mock_predictoor_contract("0x123", (3, 4)) assert c.contract_address == "0x123" assert c.get_agg_predval() == (3, 4) + + +@enforce_types +def test_deepcopy(predictoor_contract): + """Why test? Because there had previously been a RecursionError + when attempting to deepcopy(predictoor_contract. Issue #688""" + assert isinstance(predictoor_contract, PredictoorContract) + copy.deepcopy(predictoor_contract) From 7ff01baaa738c0a906700929e8c7a1beee9859bb Mon Sep 17 00:00:00 2001 From: trentmc Date: Wed, 28 Feb 2024 13:58:38 +0100 Subject: [PATCH 02/22] revert contract: remove deepcopy test --- .../contract/test/test_predictoor_contract.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/pdr_backend/contract/test/test_predictoor_contract.py b/pdr_backend/contract/test/test_predictoor_contract.py index ad0185d77..6ed252511 100644 --- a/pdr_backend/contract/test/test_predictoor_contract.py +++ b/pdr_backend/contract/test/test_predictoor_contract.py @@ -1,4 +1,3 @@ -import copy from unittest.mock import Mock import pytest @@ -6,10 +5,7 @@ from pytest import approx from pdr_backend.conftest_ganache import S_PER_EPOCH -from pdr_backend.contract.predictoor_contract import ( - PredictoorContract, - mock_predictoor_contract, -) +from pdr_backend.contract.predictoor_contract import mock_predictoor_contract from pdr_backend.contract.token import Token from pdr_backend.util.mathutil import from_wei, to_wei @@ -173,11 +169,3 @@ def test_mock_predictoor_contract(): c = mock_predictoor_contract("0x123", (3, 4)) assert c.contract_address == "0x123" assert c.get_agg_predval() == (3, 4) - - -@enforce_types -def test_deepcopy(predictoor_contract): - """Why test? Because there had previously been a RecursionError - when attempting to deepcopy(predictoor_contract. Issue #688""" - assert isinstance(predictoor_contract, PredictoorContract) - copy.deepcopy(predictoor_contract) From e30f0277ad6bf6d0dbcc4b875ce13f31266928eb Mon Sep 17 00:00:00 2001 From: trentmc Date: Wed, 28 Feb 2024 14:03:54 +0100 Subject: [PATCH 03/22] Fix via two Web3Config objects --- pdr_backend/predictoor/predictoor_agent.py | 97 +++++++++++++--------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index 6c6e2e3f2..008af679f 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -25,6 +25,26 @@ class PredictoorAgent: - Fetches Predictoor contracts from subgraph, and filters them - Monitors each contract for epoch changes. - When a value can be predicted, call calc_stakes() + + Prediction is two-sided: it submits for both up and down directions, + with a stake for each. + - But: the contracts have a constraint: an account can only submit + *one* dir'n at an epoch. But we need to submit *both* dir'ns. + - Idea: redo smart contracts. Issue: significant work, especially rollout + - Idea: bot has *two* accounts: one for up, one for down. Yes this works** + + OK. Assume two private keys are available. How should bot manage this? + - Idea: implement with a copy of the contract? (one for up, one for down) + - Via copy()? Issue: fails because it's too shallow, misses stuff + - Via deepcopy()? Issue: causes infinite recursion (py bug) + - Via deepcopy() with surgical changes? Issue: error prone + - Via query subgraph twice? Issue: many seconds slower -> annoying + - Via fill in whole contract again? Issue: tedious & error prone + - Idea: implement with a second Web3Config, and JIT switch on tx calls + - **Via 2nd constructor call? Yes, this works.** Easy because few params. + + Summary of how to do two-sided predictions: + - two envvars --> two private keys -> two Web3Configs, JIT switch for txs """ @enforce_types @@ -33,6 +53,14 @@ def __init__(self, ppss: PPSS): self.ppss = ppss logger.info(self.ppss) + # set web3_config_up/down (details in class docstring) + self.web3_config_up = self.ppss.web3_pp.web3_config + + rpc_url = self.ppss.web3_pp.rpc_url + pk2 = os.getenv("PRIVATE_KEY2") + assert pk2 is not None, "Need PRIVATE_KEY2 envvar" + self.web3_config_down = Web3Config(rpc_url, pk2) + # set self.feed cand_feeds: Dict[str, SubgraphFeed] = ppss.web3_pp.query_feed_contracts() print_feeds(cand_feeds, f"cand feeds, owner={ppss.web3_pp.owner_addrs}") @@ -44,18 +72,11 @@ def __init__(self, ppss: PPSS): print_feeds({feed.address: feed}, "filtered feed") self.feed: SubgraphFeed = feed - # set self.feed_contract, self.feed_contract2 + # set self.feed_contract. For both up/down. See submit_prediction_tx self.feed_contract: PredictoorContract = ppss.web3_pp.get_single_contract( feed.address ) - pk2: Optional[str] = os.getenv("PRIVATE_KEY2") - assert pk2 is not None, "Need PRIVATE_KEY2 envvar" - rpc_url: str = self.ppss.web3_pp.rpc_url - web3_config2 = Web3Config(rpc_url, pk2) - self.feed_contract2 = copy.deepcopy(self.feed_contract) - self.feed_contract2.web3_pp.set_web3_config(web3_config2) - # ensure ohlcv data cache is up to date if self.use_ohlcv_data(): _ = self.get_ohlcv_data() @@ -176,20 +197,10 @@ def submit_prediction_txs( target_slot: UnixTimeS, # a timestamp ): logger.info("Submit 'up' prediction tx to chain...") - tx1 = self.feed_contract.submit_prediction( - True, - stake_up, - target_slot, - wait_for_receipt=True, - ) - + tx1 = self.submit_1prediction_tx(True, stake_up, target_slot) + logger.info("Submit 'down' prediction tx to chain...") - tx2 = self.feed_contract2.submit_prediction( - False, - stake_down, - target_slot, - wait_for_receipt=True, - ) + tx2 = self.submit_1prediction_tx(False, stake_up, target_slot) # handle errors if _tx_failed(tx1) or _tx_failed(tx2): @@ -198,22 +209,34 @@ def submit_prediction_txs( logger.warning(s) logger.info("Re-submit 'up' prediction tx to chain... (stake=0)") - self.feed_contract.submit_prediction( - True, - 1e-10, - target_slot, - wait_for_receipt=True, - ) - - logger.info("Re-submit 'down' prediction tx to chain... (stake=0)") - self.feed_contract2.submit_prediction( - False, - 1e-10, - target_slot, - wait_for_receipt=True, - ) - - return True + self.submit_1prediction_tx(True, 1e-10, target_slot) + self.submit_1prediction_tx(False, 1e-10, target_slot) + + @enforce_types + def submit_1prediction_tx( + self, + direction: bool, + stake: float, # in units of Eth + target_slot: UnixTimeS, # a timestamp + ): + web3_config = self._updown_web3_config(direction) + self.feed_contract.web3_pp.set_web3_config(web3_config) + + tx = self.feed_contract.submit_prediction( + direction, + stake, + target_slot, + wait_for_receipt=True, + ) + return tx + + def _updown_web3_config(self, direction: bool) -> Web3Config: + """Returns the web3_config corresponding to up vs down direction""" + if direction == True: + return self.web3_config_up + else: + return self.web3_config_down + @enforce_types def calc_stakes(self) -> Tuple[float, float]: From f7977a1c31130d746aaf1ac2bbd84b69d6a1ebec Mon Sep 17 00:00:00 2001 From: trentmc Date: Wed, 28 Feb 2024 14:05:44 +0100 Subject: [PATCH 04/22] black --- pdr_backend/predictoor/predictoor_agent.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index 008af679f..fb1d33f24 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -27,7 +27,7 @@ class PredictoorAgent: - When a value can be predicted, call calc_stakes() Prediction is two-sided: it submits for both up and down directions, - with a stake for each. + with a stake for each. - But: the contracts have a constraint: an account can only submit *one* dir'n at an epoch. But we need to submit *both* dir'ns. - Idea: redo smart contracts. Issue: significant work, especially rollout @@ -55,7 +55,7 @@ def __init__(self, ppss: PPSS): # set web3_config_up/down (details in class docstring) self.web3_config_up = self.ppss.web3_pp.web3_config - + rpc_url = self.ppss.web3_pp.rpc_url pk2 = os.getenv("PRIVATE_KEY2") assert pk2 is not None, "Need PRIVATE_KEY2 envvar" @@ -72,7 +72,7 @@ def __init__(self, ppss: PPSS): print_feeds({feed.address: feed}, "filtered feed") self.feed: SubgraphFeed = feed - # set self.feed_contract. For both up/down. See submit_prediction_tx + # set self.feed_contract. For both up/down. See submit_prediction_tx self.feed_contract: PredictoorContract = ppss.web3_pp.get_single_contract( feed.address ) @@ -198,7 +198,7 @@ def submit_prediction_txs( ): logger.info("Submit 'up' prediction tx to chain...") tx1 = self.submit_1prediction_tx(True, stake_up, target_slot) - + logger.info("Submit 'down' prediction tx to chain...") tx2 = self.submit_1prediction_tx(False, stake_up, target_slot) @@ -221,7 +221,7 @@ def submit_1prediction_tx( ): web3_config = self._updown_web3_config(direction) self.feed_contract.web3_pp.set_web3_config(web3_config) - + tx = self.feed_contract.submit_prediction( direction, stake, @@ -236,7 +236,6 @@ def _updown_web3_config(self, direction: bool) -> Web3Config: return self.web3_config_up else: return self.web3_config_down - @enforce_types def calc_stakes(self) -> Tuple[float, float]: From 16c3333f4f2cc01def3addab003f22069dde6222 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 16:21:56 +0300 Subject: [PATCH 05/22] Fixes --- pdr_backend/predictoor/predictoor_agent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index fb1d33f24..deef08160 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -200,7 +200,7 @@ def submit_prediction_txs( tx1 = self.submit_1prediction_tx(True, stake_up, target_slot) logger.info("Submit 'down' prediction tx to chain...") - tx2 = self.submit_1prediction_tx(False, stake_up, target_slot) + tx2 = self.submit_1prediction_tx(False, stake_down, target_slot) # handle errors if _tx_failed(tx1) or _tx_failed(tx2): @@ -210,6 +210,7 @@ def submit_prediction_txs( logger.info("Re-submit 'up' prediction tx to chain... (stake=0)") self.submit_1prediction_tx(True, 1e-10, target_slot) + logger.info("Re-submit 'down' prediction tx to chain... (stake=0)") self.submit_1prediction_tx(False, 1e-10, target_slot) @enforce_types From f4a48e5ea381e32cab9075e0a0f79c6aa0640b72 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:02:13 +0000 Subject: [PATCH 06/22] Fix allowance tracking --- pdr_backend/contract/predictoor_contract.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pdr_backend/contract/predictoor_contract.py b/pdr_backend/contract/predictoor_contract.py index 32f3cb9e8..f1cc78724 100644 --- a/pdr_backend/contract/predictoor_contract.py +++ b/pdr_backend/contract/predictoor_contract.py @@ -20,7 +20,7 @@ def __init__(self, web3_pp, address: str): super().__init__(web3_pp, address, "ERC20Template3") stake_token = self.get_stake_token() self.token = Token(web3_pp, stake_token) - self.last_allowance = 0 + self.last_allowance = {} def is_valid_subscription(self): """Does this account have a subscription to this feed yet?""" @@ -269,14 +269,15 @@ def submit_prediction( stake_amt_wei = to_wei(stake_amt) # Check allowance first, only approve if needed - if self.last_allowance <= 0: - self.last_allowance = self.token.allowance( + allowance = self.last_allowance.get(self.config.owner, 0) + if allowance <= 0: + self.last_allowance[self.config.owner] = self.token.allowance( self.config.owner, self.contract_address ) - if self.last_allowance < stake_amt_wei: + if allowance < stake_amt_wei: try: self.token.approve(self.contract_address, MAX_UINT) - self.last_allowance = MAX_UINT + self.last_allowance[self.config.owner] = MAX_UINT except Exception as e: logger.error( "Error while approving the contract to spend tokens: %s", e @@ -296,7 +297,7 @@ def submit_prediction( predicted_value, stake_amt_wei, prediction_ts ).transact(call_params) txhash = tx.hex() - self.last_allowance -= stake_amt_wei + self.last_allowance[self.config.owner] -= stake_amt_wei logger.info("Submitted prediction, txhash: %s", txhash) if not wait_for_receipt: From 1eeec7f1898e4fd4f28de7c928388c498641a081 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:02:23 +0000 Subject: [PATCH 07/22] More checks --- pdr_backend/predictoor/predictoor_agent.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index deef08160..6f909b163 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -58,9 +58,15 @@ def __init__(self, ppss: PPSS): rpc_url = self.ppss.web3_pp.rpc_url pk2 = os.getenv("PRIVATE_KEY2") - assert pk2 is not None, "Need PRIVATE_KEY2 envvar" + if pk2 is None: + raise ValueError("Need PRIVATE_KEY2 envvar") + if not hasattr(self.web3_config_up, "owner"): + raise ValueError("Need PRIVATE_KEY envvar") self.web3_config_down = Web3Config(rpc_url, pk2) + if self.web3_config_up.owner == self.web3_config_down.owner: + raise ValueError("private keys must differ") + # set self.feed cand_feeds: Dict[str, SubgraphFeed] = ppss.web3_pp.query_feed_contracts() print_feeds(cand_feeds, f"cand feeds, owner={ppss.web3_pp.owner_addrs}") From 403db4a81890e61e8e2e79bd6dad6a5243e0c1ab Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:36:18 +0000 Subject: [PATCH 08/22] Add set_token method to PredictoorContract --- pdr_backend/contract/predictoor_contract.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pdr_backend/contract/predictoor_contract.py b/pdr_backend/contract/predictoor_contract.py index f1cc78724..c57f7504e 100644 --- a/pdr_backend/contract/predictoor_contract.py +++ b/pdr_backend/contract/predictoor_contract.py @@ -18,9 +18,12 @@ class PredictoorContract(BaseContract): # pylint: disable=too-many-public-methods def __init__(self, web3_pp, address: str): super().__init__(web3_pp, address, "ERC20Template3") + self.set_token(web3_pp) + self.last_allowance = {} + + def set_token(self, web3_pp): stake_token = self.get_stake_token() self.token = Token(web3_pp, stake_token) - self.last_allowance = {} def is_valid_subscription(self): """Does this account have a subscription to this feed yet?""" From 35667eac68e7a225e93bfbbe131f8560836c7583 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:36:32 +0000 Subject: [PATCH 09/22] Call set_token with updated pp --- pdr_backend/predictoor/predictoor_agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index 6f909b163..f27672900 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -228,6 +228,7 @@ def submit_1prediction_tx( ): web3_config = self._updown_web3_config(direction) self.feed_contract.web3_pp.set_web3_config(web3_config) + self.feed_contract.set_token(self.feed_contract.web3_pp) tx = self.feed_contract.submit_prediction( direction, From 310a635fca79b050f90b27207f7a1c017eae2458 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:56:26 +0000 Subject: [PATCH 10/22] Add mock owner --- system_tests/test_predictoor_system.py | 1 + 1 file changed, 1 insertion(+) diff --git a/system_tests/test_predictoor_system.py b/system_tests/test_predictoor_system.py index 8c5a9d0d2..d4ee7a59b 100644 --- a/system_tests/test_predictoor_system.py +++ b/system_tests/test_predictoor_system.py @@ -23,6 +23,7 @@ def setup_mock_web3_pp(mock_feeds, mock_predictoor_contract): mock_web3_config = Mock(spec=Web3Config) mock_web3_config.w3 = Mock() + mock_web3_config.owner = "0xowner" mock_web3_config.get_block.return_value = {"timestamp": 100} mock_web3_pp.web3_config = mock_web3_config From 3dcc63ed6deb3247d4c73c6c7574d897d5bc8d48 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:56:38 +0000 Subject: [PATCH 11/22] Type annotation --- pdr_backend/contract/predictoor_contract.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdr_backend/contract/predictoor_contract.py b/pdr_backend/contract/predictoor_contract.py index c57f7504e..3e9bd1822 100644 --- a/pdr_backend/contract/predictoor_contract.py +++ b/pdr_backend/contract/predictoor_contract.py @@ -1,5 +1,5 @@ import logging -from typing import List, Tuple +from typing import Dict, List, Tuple from unittest.mock import Mock from enforce_typing import enforce_types @@ -19,7 +19,7 @@ class PredictoorContract(BaseContract): # pylint: disable=too-many-public-metho def __init__(self, web3_pp, address: str): super().__init__(web3_pp, address, "ERC20Template3") self.set_token(web3_pp) - self.last_allowance = {} + self.last_allowance: Dict[str, int] = {} def set_token(self, web3_pp): stake_token = self.get_stake_token() From ba59bc33af5dda4f59aa0f1e31b598030fdbef79 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:58:57 +0000 Subject: [PATCH 12/22] Add missing function to mock --- pdr_backend/ppss/web3_pp.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index ad47572e2..340b2a0f2 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -330,6 +330,9 @@ def __init__(self, web3_pp, w3, s_per_epoch: int, contract_address: str): def get_current_epoch(self) -> int: """Returns an epoch number""" return self.get_current_epoch_ts() // self.s_per_epoch + + def set_token(self, web3_pp): + pass def get_current_epoch_ts(self) -> UnixTimeS: """Returns a timestamp""" From 1724fbc7e07ff220dce58e3475fe9c731d363ed5 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 15:01:07 +0000 Subject: [PATCH 13/22] Formatting --- pdr_backend/ppss/web3_pp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index 340b2a0f2..c03d843b6 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -330,7 +330,7 @@ def __init__(self, web3_pp, w3, s_per_epoch: int, contract_address: str): def get_current_epoch(self) -> int: """Returns an epoch number""" return self.get_current_epoch_ts() // self.s_per_epoch - + def set_token(self, web3_pp): pass From 73192fe55a177c5bc8c8a532f636d10dda84b7e5 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 18:46:32 +0300 Subject: [PATCH 14/22] Add and use copy_with_pk function --- pdr_backend/predictoor/predictoor_agent.py | 3 +-- pdr_backend/util/web3_config.py | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pdr_backend/predictoor/predictoor_agent.py b/pdr_backend/predictoor/predictoor_agent.py index f27672900..f424039d6 100644 --- a/pdr_backend/predictoor/predictoor_agent.py +++ b/pdr_backend/predictoor/predictoor_agent.py @@ -56,13 +56,12 @@ def __init__(self, ppss: PPSS): # set web3_config_up/down (details in class docstring) self.web3_config_up = self.ppss.web3_pp.web3_config - rpc_url = self.ppss.web3_pp.rpc_url pk2 = os.getenv("PRIVATE_KEY2") if pk2 is None: raise ValueError("Need PRIVATE_KEY2 envvar") if not hasattr(self.web3_config_up, "owner"): raise ValueError("Need PRIVATE_KEY envvar") - self.web3_config_down = Web3Config(rpc_url, pk2) + self.web3_config_down = self.web3_config_up.copy_with_pk(pk2) if self.web3_config_up.owner == self.web3_config_down.owner: raise ValueError("private keys must differ") diff --git a/pdr_backend/util/web3_config.py b/pdr_backend/util/web3_config.py index 92c5cd427..52476f15d 100644 --- a/pdr_backend/util/web3_config.py +++ b/pdr_backend/util/web3_config.py @@ -41,6 +41,9 @@ def __init__(self, rpc_url: str, private_key: Optional[str] = None): ) self.w3.middleware_onion.add(http_retry_request_middleware) + def copy_with_pk(self, pk: str) -> Web3Config: + return Web3Config(self.rpc_url, pk) + def get_block( self, block: BlockIdentifier, full_transactions: bool = False, tries: int = 0 ) -> BlockData: From 503f46b9b3e09d054d8dac1b1be5fc048da1c3b3 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 19:14:26 +0300 Subject: [PATCH 15/22] Fix type --- pdr_backend/util/web3_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdr_backend/util/web3_config.py b/pdr_backend/util/web3_config.py index 52476f15d..fa115d135 100644 --- a/pdr_backend/util/web3_config.py +++ b/pdr_backend/util/web3_config.py @@ -41,7 +41,7 @@ def __init__(self, rpc_url: str, private_key: Optional[str] = None): ) self.w3.middleware_onion.add(http_retry_request_middleware) - def copy_with_pk(self, pk: str) -> Web3Config: + def copy_with_pk(self, pk: str) -> self: return Web3Config(self.rpc_url, pk) def get_block( From ccfbafcd50848414a38b5629379ea425df6b290a Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 19:55:53 +0300 Subject: [PATCH 16/22] Fix --- pdr_backend/util/web3_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdr_backend/util/web3_config.py b/pdr_backend/util/web3_config.py index fa115d135..46df45150 100644 --- a/pdr_backend/util/web3_config.py +++ b/pdr_backend/util/web3_config.py @@ -41,7 +41,7 @@ def __init__(self, rpc_url: str, private_key: Optional[str] = None): ) self.w3.middleware_onion.add(http_retry_request_middleware) - def copy_with_pk(self, pk: str) -> self: + def copy_with_pk(self, pk: str): return Web3Config(self.rpc_url, pk) def get_block( From 3b0819777e8908875880d0cf55c16f7cefcfe235 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:16:50 +0000 Subject: [PATCH 17/22] Add new pk --- pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/pytest.ini b/pytest.ini index 7196e6bc9..d280981f9 100644 --- a/pytest.ini +++ b/pytest.ini @@ -5,3 +5,4 @@ env = D:RPC_URL=http://127.0.0.1:8545 D:SUBGRAPH_URL=http://172.15.0.15:8000/subgraphs/name/oceanprotocol/ocean-subgraph D:PRIVATE_KEY=0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58 + D:PRIVATE_KEY2=0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209 From 6cbdb822a61d3cda69b756ad6877af04f325c519 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:17:25 +0000 Subject: [PATCH 18/22] Fix mock --- pdr_backend/ppss/web3_pp.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index c03d843b6..0864209a3 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -2,6 +2,7 @@ import logging import os import random +from copy import deepcopy from pathlib import Path from typing import Any, Dict, List, Optional, Union from unittest.mock import Mock @@ -395,5 +396,10 @@ def advance_func(*args, **kwargs): # pylint: disable=unused-argument assert hasattr(web3_pp.web3_config, "w3") web3_pp.web3_config.w3 = mock_w3 + web3_pp.web3_config.copy_with_pk = Mock() + copy_config = deepcopy(web3_pp.web3_config) + copy_config.owner = "0x3" + web3_pp.web3_config.copy_with_pk.return_value = copy_config + return _mock_pdr_contract From a3366dc8492fa7750e3ef321e584bddea296b7fd Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:17:43 +0000 Subject: [PATCH 19/22] Formatting --- pdr_backend/ppss/web3_pp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index 0864209a3..69929cdf3 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -401,5 +401,4 @@ def advance_func(*args, **kwargs): # pylint: disable=unused-argument copy_config.owner = "0x3" web3_pp.web3_config.copy_with_pk.return_value = copy_config - return _mock_pdr_contract From 44fbffefcd5df60dcc0184f078dd981e6b56c415 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 20:24:40 +0300 Subject: [PATCH 20/22] Mypy ignore --- pdr_backend/ppss/web3_pp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index 69929cdf3..e8e8c638b 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -396,9 +396,9 @@ def advance_func(*args, **kwargs): # pylint: disable=unused-argument assert hasattr(web3_pp.web3_config, "w3") web3_pp.web3_config.w3 = mock_w3 - web3_pp.web3_config.copy_with_pk = Mock() copy_config = deepcopy(web3_pp.web3_config) copy_config.owner = "0x3" + web3_pp.web3_config.copy_with_pk = Mock() # type: ignore web3_pp.web3_config.copy_with_pk.return_value = copy_config return _mock_pdr_contract From 9070aad066768ccde0260b0045b9b26f888e22a1 Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:31:55 +0000 Subject: [PATCH 21/22] Formatting --- barge | 1 + pdr_backend/ppss/web3_pp.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 barge diff --git a/barge b/barge new file mode 160000 index 000000000..c64475430 --- /dev/null +++ b/barge @@ -0,0 +1 @@ +Subproject commit c64475430cb1d12d928a69363e1313ff33685eeb diff --git a/pdr_backend/ppss/web3_pp.py b/pdr_backend/ppss/web3_pp.py index e8e8c638b..4a74c6585 100644 --- a/pdr_backend/ppss/web3_pp.py +++ b/pdr_backend/ppss/web3_pp.py @@ -398,7 +398,7 @@ def advance_func(*args, **kwargs): # pylint: disable=unused-argument web3_pp.web3_config.w3 = mock_w3 copy_config = deepcopy(web3_pp.web3_config) copy_config.owner = "0x3" - web3_pp.web3_config.copy_with_pk = Mock() # type: ignore + web3_pp.web3_config.copy_with_pk = Mock() # type: ignore web3_pp.web3_config.copy_with_pk.return_value = copy_config return _mock_pdr_contract From ee4594d897987bafb90487537c47de19f39d1bdb Mon Sep 17 00:00:00 2001 From: trizin <25263018+trizin@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:38:56 +0000 Subject: [PATCH 22/22] Remove submodule --- barge | 1 - 1 file changed, 1 deletion(-) delete mode 160000 barge diff --git a/barge b/barge deleted file mode 160000 index c64475430..000000000 --- a/barge +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c64475430cb1d12d928a69363e1313ff33685eeb