eth-prototype 1.5.0b1__tar.gz → 1.5.0b3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/PKG-INFO +1 -1
  2. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/PKG-INFO +1 -1
  3. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/aa_bundler.py +67 -19
  4. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.coveragerc +0 -0
  5. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.github/workflows/publish.yaml +0 -0
  6. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.github/workflows/test.yaml +0 -0
  7. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.gitignore +0 -0
  8. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.isort.cfg +0 -0
  9. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.pre-commit-config.yaml +0 -0
  10. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/.readthedocs.yml +0 -0
  11. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/AUTHORS.rst +0 -0
  12. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/CHANGELOG.rst +0 -0
  13. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/LICENSE.txt +0 -0
  14. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/README.md +0 -0
  15. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/Makefile +0 -0
  16. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/_static/.gitignore +0 -0
  17. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/authors.rst +0 -0
  18. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/changelog.rst +0 -0
  19. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/conf.py +0 -0
  20. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/index.rst +0 -0
  21. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/license.rst +0 -0
  22. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/readme.rst +0 -0
  23. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/docs/requirements.txt +0 -0
  24. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/pyproject.toml +0 -0
  25. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/setup.cfg +0 -0
  26. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/setup.py +0 -0
  27. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/SOURCES.txt +0 -0
  28. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/dependency_links.txt +0 -0
  29. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/not-zip-safe +0 -0
  30. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/requires.txt +0 -0
  31. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/eth_prototype.egg-info/top_level.txt +0 -0
  32. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/__init__.py +0 -0
  33. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/build_artifacts.py +0 -0
  34. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/contracts.py +0 -0
  35. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/defender_relay.py +0 -0
  36. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/test_utils/__init__.py +0 -0
  37. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/test_utils/factories.py +0 -0
  38. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/test_utils/hardhat.py +0 -0
  39. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/test_utils/vcr_utils.py +0 -0
  40. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/w3wrappers.py +0 -0
  41. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/wadray.py +0 -0
  42. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/src/ethproto/wrappers.py +0 -0
  43. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/__init__.py +0 -0
  44. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/cassettes/test_aa_bundler/test_build_user_operation.yaml +0 -0
  45. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/conftest.py +0 -0
  46. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/README.md +0 -0
  47. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/artifacts2/TestCurrency.sol/TestCurrency.json +0 -0
  48. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/Count.sol +0 -0
  49. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/Counter.sol +0 -0
  50. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/CounterUpgradeable.sol +0 -0
  51. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/CounterUpgradeableWithLibrary.sol +0 -0
  52. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/CounterWithLibrary.sol +0 -0
  53. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/Datatypes.sol +0 -0
  54. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/EventLauncher.sol +0 -0
  55. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/TestCurrency.sol +0 -0
  56. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/TestCurrencyUUPS.sol +0 -0
  57. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/contracts/TestNFT.sol +0 -0
  58. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/hardhat.config.js +0 -0
  59. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/package-lock.json +0 -0
  60. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/package.json +0 -0
  61. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/verifiable-binaries/@anotherOrg/aPkg/1.0.2/build/contracts/TestCurrency.sol/TestCurrency.json +0 -0
  62. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/verifiable-binaries/@org/pkg/0.2.1/build/contracts/TestCurrency.json +0 -0
  63. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/hardhat-project/verifiable-binaries/@org/pkg/0.3.0/build/contracts/TestCurrency.json +0 -0
  64. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_aa_bundler.py +0 -0
  65. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_build_artifacts.py +0 -0
  66. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_contracts.py +0 -0
  67. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_defender.py +0 -0
  68. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_time_control.py +0 -0
  69. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_w3.py +0 -0
  70. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tests/test_wadray.py +0 -0
  71. {eth_prototype-1.5.0b1 → eth_prototype-1.5.0b3}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth-prototype
3
- Version: 1.5.0b1
3
+ Version: 1.5.0b3
4
4
  Summary: Prototype Ethereum Smart Contracts in Python
5
5
  Home-page: https://github.com/gnarvaja/eth-prototype
6
6
  Author: Guillermo M. Narvaja
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth-prototype
3
- Version: 1.5.0b1
3
+ Version: 1.5.0b3
4
4
  Summary: Prototype Ethereum Smart Contracts in Python
5
5
  Home-page: https://github.com/gnarvaja/eth-prototype
6
6
  Author: Guillermo M. Narvaja
@@ -13,6 +13,7 @@ from eth_account.messages import encode_defunct
13
13
  from eth_typing import HexAddress
14
14
  from eth_utils import add_0x_prefix, function_signature_to_4byte_selector
15
15
  from hexbytes import HexBytes
16
+ from requests import HTTPError
16
17
  from web3 import Web3
17
18
  from web3.constants import ADDRESS_ZERO
18
19
  from web3.types import StateOverride, TxParams
@@ -197,7 +198,7 @@ class UserOperation:
197
198
  "maxFeePerGas": "0x%x" % self.max_fee_per_gas,
198
199
  "signature": add_0x_prefix(self.signature.hex()),
199
200
  "paymaster": self.paymaster,
200
- "paymasterData": self.paymaster_data,
201
+ "paymasterData": self.paymaster_data.to_0x_hex(),
201
202
  "paymasterVerificationGasLimit": "0x%x" % self.paymaster_verification_gas_limit,
202
203
  "paymasterPostOpGasLimit": "0x%x" % self.paymaster_post_op_gas_limit,
203
204
  }
@@ -441,7 +442,7 @@ class Bundler:
441
442
  def estimate_user_operation_gas(self, user_operation: UserOperation) -> UserOpEstimation:
442
443
  resp = self.bundler.provider.make_request(
443
444
  "eth_estimateUserOperationGas",
444
- [user_operation.as_reduced_dict(), self.entrypoint, self.overrides],
445
+ [user_operation.as_dict(), self.entrypoint, self.overrides],
445
446
  )
446
447
  if "error" in resp:
447
448
  raise BundlerRevertError(resp["error"]["message"], user_operation, resp)
@@ -461,23 +462,32 @@ class Bundler:
461
462
  )
462
463
 
463
464
  def alchemy_estimation(self, user_operation: UserOperation) -> AlchemyGasAndPaymasterAndData:
464
- resp = self.bundler.provider.make_request(
465
- "alchemy_requestGasAndPaymasterAndData",
466
- [
467
- {
468
- "policyId": self.alchemy_gas_policy_id,
469
- "entryPoint": self.entrypoint,
470
- "dummySignature": DUMMY_SIGNATURE,
471
- "userOperation": user_operation.as_reduced_dict(),
472
- "overrides": {
473
- "maxFeePerGas": {"multiplier": self.base_gas_price_factor},
474
- "maxPriorityFeePerGas": {"multiplier": self.priority_gas_price_factor},
475
- "callGasLimit": {"multiplier": self.gas_limit_factor},
476
- "verificationGasLimit": {"multiplier": self.verification_gas_factor},
477
- },
478
- }
479
- ],
480
- )
465
+ try:
466
+ resp = self.bundler.provider.make_request(
467
+ "alchemy_requestGasAndPaymasterAndData",
468
+ [
469
+ {
470
+ "policyId": self.alchemy_gas_policy_id,
471
+ "entryPoint": self.entrypoint,
472
+ "dummySignature": DUMMY_SIGNATURE,
473
+ "userOperation": user_operation.as_reduced_dict(),
474
+ "overrides": {
475
+ "maxFeePerGas": {"multiplier": self.base_gas_price_factor},
476
+ "maxPriorityFeePerGas": {"multiplier": self.priority_gas_price_factor},
477
+ "callGasLimit": {"multiplier": self.gas_limit_factor},
478
+ "verificationGasLimit": {"multiplier": self.verification_gas_factor},
479
+ },
480
+ # Alchemy seems to be ignoring this, even though it's documented
481
+ "stateOverrideSet": self.overrides,
482
+ }
483
+ ],
484
+ )
485
+ except HTTPError as e:
486
+ raise BundlerRevertError(
487
+ f"HTTP error while requesting gas and paymaster data: {str(e)}",
488
+ userop=user_operation,
489
+ response=e.response.json(),
490
+ ) from e
481
491
 
482
492
  if "error" in resp:
483
493
  raise BundlerRevertError(resp["error"]["message"], userop=user_operation, response=resp)
@@ -516,6 +526,35 @@ class Bundler:
516
526
  paymaster_and_data=paymaster_and_data,
517
527
  )
518
528
 
529
+ def pimlico_gas_price(self):
530
+ resp = self.bundler.provider.make_request("pimlico_getUserOperationGasPrice", [])
531
+ if "error" in resp:
532
+ raise BundlerRevertError(resp["error"]["message"], response=resp)
533
+ # {
534
+ # "jsonrpc": "2.0",
535
+ # "id": 1,
536
+ # "result": {
537
+ # "slow": {
538
+ # "maxFeePerGas": "0x829b42b5",
539
+ # "maxPriorityFeePerGas": "0x829b42b5"
540
+ # },
541
+ # "standard": {
542
+ # "maxFeePerGas": "0x88d36a75",
543
+ # "maxPriorityFeePerGas": "0x88d36a75"
544
+ # },
545
+ # "fast": {
546
+ # "maxFeePerGas": "0x8f0b9234",
547
+ # "maxPriorityFeePerGas": "0x8f0b9234"
548
+ # }
549
+ # }
550
+ # }
551
+ priority_fee = int(resp["result"]["standard"]["maxPriorityFeePerGas"], 16)
552
+ total_fee = int(resp["result"]["standard"]["maxFeePerGas"], 16)
553
+ base_fee = total_fee - priority_fee
554
+ max_priority_fee_per_gas = int(priority_fee * self.priority_gas_price_factor)
555
+ max_fee_per_gas = min(max_priority_fee_per_gas + base_fee, self.max_fee_per_gas)
556
+ return GasPrice(max_priority_fee_per_gas=max_priority_fee_per_gas, max_fee_per_gas=max_fee_per_gas)
557
+
519
558
  def generic_gas_price(self):
520
559
  base_fee = self.get_base_fee()
521
560
  priority_fee = self.w3.eth.max_priority_fee
@@ -539,6 +578,15 @@ class Bundler:
539
578
  estimation_and_paymaster.paymaster_and_data
540
579
  )
541
580
 
581
+ elif self.bundler_type == "pimlico":
582
+ estimation = self.estimate_user_operation_gas(user_operation)
583
+
584
+ user_operation = user_operation.add_estimation(estimation)
585
+
586
+ gas_price = self.pimlico_gas_price()
587
+
588
+ user_operation = user_operation.add_gas_price(gas_price)
589
+
542
590
  elif self.bundler_type == "generic":
543
591
  estimation = self.estimate_user_operation_gas(user_operation)
544
592
 
File without changes