algorand-python-testing 1.2.0b4__tar.gz → 1.2.0b6__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 (382) hide show
  1. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/CHANGELOG.md +24 -0
  2. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/PKG-INFO +1 -1
  3. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/coverage.md +4 -0
  4. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/state-management.md +77 -0
  5. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/pyproject.toml +1 -1
  6. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/__init__.py +3 -1
  7. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/contract.py +69 -64
  8. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/misc.py +24 -30
  9. algorand_python_testing-1.2.0b6/src/_algopy_testing/state/__init__.py +7 -0
  10. algorand_python_testing-1.2.0b6/src/_algopy_testing/state/global_map.py +95 -0
  11. algorand_python_testing-1.2.0b6/src/_algopy_testing/state/local_map.py +121 -0
  12. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/state/local_state.py +12 -17
  13. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/state/utils.py +12 -0
  14. algorand_python_testing-1.2.0b6/src/_algopy_testing/utilities/__init__.py +5 -0
  15. algorand_python_testing-1.2.0b6/src/_algopy_testing/utilities/log.py +116 -0
  16. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/__init__.py +13 -2
  17. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/Contract.arc56.json +2 -2
  18. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV0.arc56.json +1 -1
  19. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV1.arc56.json +1 -1
  20. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +1 -1
  21. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +6 -6
  22. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +1 -1
  23. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +12 -4
  24. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +7 -7
  25. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/Contract.approval.teal +32 -17
  26. algorand_python_testing-1.2.0b6/tests/artifacts/Arrays/data/Contract.arc56.json +371 -0
  27. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +1 -1
  28. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +335 -473
  29. algorand_python_testing-1.2.0b6/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +807 -0
  30. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +13 -10
  31. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +29 -25
  32. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/BoxContract/data/BoxContract.approval.teal +21 -22
  33. algorand_python_testing-1.2.0b6/tests/artifacts/BoxContract/data/BoxContract.arc56.json +788 -0
  34. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json +1 -1
  35. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +1 -1
  36. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +1 -1
  37. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.arc56.json +1 -1
  38. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/VerifierContract.arc56.json +1 -1
  39. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +1 -1
  40. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +1 -1
  41. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/PrimitiveOps/contract.py +37 -1
  42. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +308 -192
  43. algorand_python_testing-1.2.0b6/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +1677 -0
  44. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/StateMutations.approval.teal +288 -332
  45. algorand_python_testing-1.2.0b6/tests/artifacts/StateMutations/data/StateMutations.arc56.json +250 -0
  46. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/statemutations.py +7 -0
  47. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/contract.py +292 -0
  48. algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/GlobalMapContract.approval.teal +677 -0
  49. algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/GlobalMapContract.arc56.json +784 -0
  50. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +113 -113
  51. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +2 -2
  52. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +20 -20
  53. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +2 -2
  54. algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/LocalMapContract.approval.teal +814 -0
  55. algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/LocalMapContract.arc56.json +904 -0
  56. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +73 -73
  57. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +2 -2
  58. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +114 -114
  59. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +2 -2
  60. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +22 -22
  61. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +2 -2
  62. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +18 -14
  63. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +9 -4
  64. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +30 -30
  65. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +2 -2
  66. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +7 -7
  67. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +2 -2
  68. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +64 -64
  69. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +2 -2
  70. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +7 -7
  71. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json +2 -2
  72. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +85 -85
  73. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +2 -2
  74. algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +7 -0
  75. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Tuples/data/TuplesContract.arc56.json +1 -1
  76. algorand_python_testing-1.2.0b6/tests/artifacts/Tuples/data/TuplesContract.clear.teal +7 -0
  77. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_contract.py +2 -0
  78. algorand_python_testing-1.2.0b6/tests/state/test_global_map.py +430 -0
  79. algorand_python_testing-1.2.0b6/tests/state/test_local_map.py +508 -0
  80. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/test_op.py +2 -2
  81. algorand_python_testing-1.2.0b6/tests/utilities/test_log.py +242 -0
  82. algorand_python_testing-1.2.0b4/src/_algopy_testing/state/__init__.py +0 -5
  83. algorand_python_testing-1.2.0b4/src/_algopy_testing/utilities/__init__.py +0 -5
  84. algorand_python_testing-1.2.0b4/src/_algopy_testing/utilities/log.py +0 -42
  85. algorand_python_testing-1.2.0b4/tests/artifacts/Arrays/data/Contract.arc56.json +0 -367
  86. algorand_python_testing-1.2.0b4/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +0 -828
  87. algorand_python_testing-1.2.0b4/tests/artifacts/BoxContract/data/BoxContract.arc56.json +0 -768
  88. algorand_python_testing-1.2.0b4/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +0 -1607
  89. algorand_python_testing-1.2.0b4/tests/artifacts/StateMutations/data/StateMutations.arc56.json +0 -258
  90. algorand_python_testing-1.2.0b4/tests/utilities/test_log.py +0 -79
  91. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.coveragerc +0 -0
  92. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.editorconfig +0 -0
  93. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  94. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  95. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/dependabot.yml +0 -0
  96. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/pull_request_template.md +0 -0
  97. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/workflows/cd.yaml +0 -0
  98. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/workflows/ci.yaml +0 -0
  99. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.github/workflows/gh-pages.yaml +0 -0
  100. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.gitignore +0 -0
  101. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.pre-commit-config.yaml +0 -0
  102. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.vscode/extensions.json +0 -0
  103. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.vscode/launch.json +0 -0
  104. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/.vscode/settings.json +0 -0
  105. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/CONTRIBUTING.md +0 -0
  106. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/LICENSE +0 -0
  107. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/README.md +0 -0
  108. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/Makefile +0 -0
  109. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/__init__.py +0 -0
  110. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/_static/custom.css +0 -0
  111. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/algopy.md +0 -0
  112. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/api.md +0 -0
  113. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/conf.py +0 -0
  114. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/examples.md +0 -0
  115. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/faq.md +0 -0
  116. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/index.md +0 -0
  117. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/make.bat +0 -0
  118. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/arc4-types.md +0 -0
  119. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/avm-types.md +0 -0
  120. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/concepts.md +0 -0
  121. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/contract-testing.md +0 -0
  122. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/index.md +0 -0
  123. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/opcodes.md +0 -0
  124. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/signature-testing.md +0 -0
  125. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/subroutines.md +0 -0
  126. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/docs/testing-guide/transactions.md +0 -0
  127. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/README.md +0 -0
  128. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/__init__.py +0 -0
  129. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/auction/__init__.py +0 -0
  130. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/auction/contract.py +0 -0
  131. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/auction/test_contract.py +0 -0
  132. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/htlc_logicsig/__init__.py +0 -0
  133. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/htlc_logicsig/signature.py +0 -0
  134. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/htlc_logicsig/test_signature.py +0 -0
  135. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/marketplace/__init__.py +0 -0
  136. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/marketplace/contract.py +0 -0
  137. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/marketplace/test_contract.py +0 -0
  138. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/proof_of_attendance/__init__.py +0 -0
  139. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/proof_of_attendance/contract.py +0 -0
  140. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/proof_of_attendance/test_contract.py +0 -0
  141. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/scratch_storage/__init__.py +0 -0
  142. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/scratch_storage/contract.py +0 -0
  143. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/scratch_storage/test_contract.py +0 -0
  144. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/simple_voting/__init__.py +0 -0
  145. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/simple_voting/contract.py +0 -0
  146. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/simple_voting/test_contract.py +0 -0
  147. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/zk_whitelist/__init__.py +0 -0
  148. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/zk_whitelist/contract.py +0 -0
  149. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/examples/zk_whitelist/test_contract.py +0 -0
  150. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/scripts/__init__.py +0 -0
  151. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/scripts/check_stubs_cov.py +0 -0
  152. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/scripts/refresh_test_artifacts.py +0 -0
  153. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/scripts/validate_examples.py +0 -0
  154. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/arc4.py +0 -0
  155. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/compiled.py +0 -0
  156. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/constants.py +0 -0
  157. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/context.py +0 -0
  158. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/context_helpers/__init__.py +0 -0
  159. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/context_helpers/context_storage.py +0 -0
  160. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/context_helpers/ledger_context.py +0 -0
  161. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/context_helpers/txn_context.py +0 -0
  162. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/decorators/__init__.py +0 -0
  163. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/decorators/arc4.py +0 -0
  164. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/decorators/subroutine.py +0 -0
  165. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/enums.py +0 -0
  166. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/gtxn.py +0 -0
  167. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/itxn.py +0 -0
  168. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/itxn_loader.py +0 -0
  169. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/__init__.py +0 -0
  170. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/account.py +0 -0
  171. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/application.py +0 -0
  172. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/asset.py +0 -0
  173. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/logicsig.py +0 -0
  174. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/template_variable.py +0 -0
  175. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/txn_fields.py +0 -0
  176. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/models/unsigned_builtins.py +0 -0
  177. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/mutable.py +0 -0
  178. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/__init__.py +0 -0
  179. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/block.py +0 -0
  180. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/constants.py +0 -0
  181. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/crypto.py +0 -0
  182. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/global_values.py +0 -0
  183. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/itxn.py +0 -0
  184. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/pure.py +0 -0
  185. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/op/txn.py +0 -0
  186. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/__init__.py +0 -0
  187. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/array.py +0 -0
  188. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/biguint.py +0 -0
  189. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/bytes.py +0 -0
  190. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/fixed_bytes.py +0 -0
  191. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/string.py +0 -0
  192. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/primitives/uint64.py +0 -0
  193. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/protocols.py +0 -0
  194. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/py.typed +0 -0
  195. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/serialize.py +0 -0
  196. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/state/box.py +0 -0
  197. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/state/global_state.py +0 -0
  198. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/utilities/budget.py +0 -0
  199. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/utilities/size_of.py +0 -0
  200. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/utils.py +0 -0
  201. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/value_generators/__init__.py +0 -0
  202. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/value_generators/arc4.py +0 -0
  203. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/value_generators/avm.py +0 -0
  204. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/_algopy_testing/value_generators/txn.py +0 -0
  205. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/arc4.py +0 -0
  206. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/gtxn.py +0 -0
  207. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/itxn.py +0 -0
  208. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/op.py +0 -0
  209. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy/py.typed +0 -0
  210. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy_testing/__init__.py +0 -0
  211. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/src/algopy_testing/py.typed +0 -0
  212. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/templates/.macros.j2 +0 -0
  213. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/templates/.release_notes.md.j2 +0 -0
  214. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/templates/CHANGELOG.md.j2 +0 -0
  215. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/__init__.py +0 -0
  216. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/__init__.py +0 -0
  217. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/conftest.py +0 -0
  218. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_abi_call.py +0 -0
  219. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_address.py +0 -0
  220. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_arc4_method_signature.py +0 -0
  221. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_bool.py +0 -0
  222. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_dynamic_array.py +0 -0
  223. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_dynamic_bytes.py +0 -0
  224. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_emit.py +0 -0
  225. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_static_array.py +0 -0
  226. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_string.py +0 -0
  227. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_struct.py +0 -0
  228. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_tuple.py +0 -0
  229. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_ufixednxm.py +0 -0
  230. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/arc4/test_uintn.py +0 -0
  231. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/__init__.py +0 -0
  232. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/contract.py +0 -0
  233. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/Contract.approval.teal +2 -2
  234. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/Contract.clear.teal +0 -0
  235. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV0.approval.teal +0 -0
  236. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV0.clear.teal +0 -0
  237. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV1.approval.teal +0 -0
  238. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/AVM12/data/ContractV1.clear.teal +0 -0
  239. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/__init__.py +0 -0
  240. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/contract.py +0 -0
  241. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc32.json +0 -0
  242. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +0 -0
  243. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/__init__.py +0 -0
  244. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/contract.py +0 -0
  245. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +0 -0
  246. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc32.json +0 -0
  247. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +0 -0
  248. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/__init__.py +0 -0
  249. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/contract.py +0 -0
  250. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc32.json +0 -0
  251. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +0 -0
  252. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/__init__.py +0 -0
  253. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/Contract.arc32.json +0 -0
  254. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/Contract.clear.teal +0 -0
  255. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal +0 -0
  256. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal +0 -0
  257. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayContract.arc32.json +0 -0
  258. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal +0 -0
  259. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal +0 -0
  260. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json +0 -0
  261. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal +0 -0
  262. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/StaticSizeContract.arc32.json +0 -0
  263. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal +0 -0
  264. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/immutable.py +0 -0
  265. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/static_size.py +0 -0
  266. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Arrays/uint64.py +0 -0
  267. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/BoxContract/__init__.py +0 -0
  268. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/BoxContract/contract.py +0 -0
  269. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/BoxContract/data/BoxContract.arc32.json +0 -0
  270. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/BoxContract/data/BoxContract.clear.teal +0 -0
  271. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Contains/__init__.py +0 -0
  272. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Contains/contract.py +0 -0
  273. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Contains/data/MyContract.approval.teal +0 -0
  274. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Contains/data/MyContract.clear.teal +0 -0
  275. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/__init__.py +0 -0
  276. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/contract.py +0 -0
  277. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal +0 -0
  278. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppCall.arc32.json +0 -0
  279. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal +0 -0
  280. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +0 -0
  281. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc32.json +0 -0
  282. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal +0 -0
  283. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CreatedAppAsset/other.py +0 -0
  284. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/__init__.py +0 -0
  285. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/contract.py +0 -0
  286. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +0 -0
  287. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc32.json +0 -0
  288. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +0 -0
  289. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/__init__.py +0 -0
  290. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/contract.py +0 -0
  291. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.approval.teal +0 -0
  292. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.clear.teal +0 -0
  293. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/VerifierContract.approval.teal +0 -0
  294. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/data/VerifierContract.clear.teal +0 -0
  295. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/DynamicITxnGroup/verifier.py +0 -0
  296. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/__init__.py +0 -0
  297. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/contract.py +0 -0
  298. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +0 -0
  299. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc32.json +0 -0
  300. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +0 -0
  301. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/__init__.py +0 -0
  302. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/contract.py +0 -0
  303. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +0 -0
  304. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc32.json +0 -0
  305. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +0 -0
  306. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/PrimitiveOps/__init__.py +0 -0
  307. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc32.json +0 -0
  308. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +0 -0
  309. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/__init__.py +0 -0
  310. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/Contract.approval.teal +0 -0
  311. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/Contract.arc32.json +0 -0
  312. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/Contract.clear.teal +0 -0
  313. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/StateMutations.arc32.json +0 -0
  314. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateMutations/data/StateMutations.clear.teal +0 -0
  315. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/__init__.py +0 -0
  316. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/GlobalMapContract.clear.teal +0 -0
  317. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/GlobalStateContract.arc32.json +0 -0
  318. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +0 -0
  319. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/ITxnOpsContract.arc32.json +0 -0
  320. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/LocalStateContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +0 -0
  321. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/LocalMapContract.clear.teal +0 -0
  322. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/LocalStateContract.arc32.json +0 -0
  323. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +0 -0
  324. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGet.approval.teal +0 -0
  325. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGet.arc32.json +0 -0
  326. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGet.clear.teal +0 -0
  327. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +0 -0
  328. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +0 -0
  329. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc32.json +0 -0
  330. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +0 -0
  331. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc32.json +0 -0
  332. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +0 -0
  333. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalContract.arc32.json +0 -0
  334. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +0 -0
  335. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc32.json +0 -0
  336. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +0 -0
  337. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAppParamsContract.arc32.json +0 -0
  338. /algorand_python_testing-1.2.0b4/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +0 -0
  339. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc32.json +0 -0
  340. /algorand_python_testing-1.2.0b4/tests/artifacts/Tuples/data/TuplesContract.clear.teal → /algorand_python_testing-1.2.0b6/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +0 -0
  341. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc32.json +0 -0
  342. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Tuples/__init__.py +0 -0
  343. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Tuples/contract.py +0 -0
  344. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Tuples/data/TuplesContract.approval.teal +0 -0
  345. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/Tuples/data/TuplesContract.arc32.json +0 -0
  346. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/artifacts/__init__.py +0 -0
  347. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/avm12/__init__.py +0 -0
  348. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/avm12/conftest.py +0 -0
  349. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/avm12/test_avm12.py +0 -0
  350. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/common.py +0 -0
  351. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/conftest.py +0 -0
  352. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/contexts/__init__.py +0 -0
  353. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/dynamic_itxn_group/__init__.py +0 -0
  354. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/dynamic_itxn_group/test_dynamic_itxn_group.py +0 -0
  355. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/__init__.py +0 -0
  356. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_asset.py +0 -0
  357. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_box.py +0 -0
  358. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_box_map.py +0 -0
  359. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_box_ref.py +0 -0
  360. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_uenumerate.py +0 -0
  361. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/models/test_urange.py +0 -0
  362. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/__init__.py +0 -0
  363. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/conftest.py +0 -0
  364. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/test_biguint.py +0 -0
  365. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/test_bytes.py +0 -0
  366. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/test_fixed_bytes.py +0 -0
  367. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/test_string.py +0 -0
  368. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/primitives/test_uint64.py +0 -0
  369. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/state/__init__.py +0 -0
  370. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/state/conftest.py +0 -0
  371. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/state/test_global_state.py +0 -0
  372. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/state/test_local_state.py +0 -0
  373. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/state/test_mutations.py +0 -0
  374. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/test_array.py +0 -0
  375. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/test_context.py +0 -0
  376. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/test_miscellaneous_op.py +0 -0
  377. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/util.py +0 -0
  378. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/utilities/__init__.py +0 -0
  379. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/utilities/conftest.py +0 -0
  380. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/utilities/test_size_of.py +0 -0
  381. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/value_generators/__init__.py +0 -0
  382. {algorand_python_testing-1.2.0b4 → algorand_python_testing-1.2.0b6}/tests/value_generators/test_avm.py +0 -0
@@ -1,4 +1,28 @@
1
1
  # CHANGELOG
2
+ ## v1.2.0-beta.6 (2026-04-07)
3
+
4
+ ### Features
5
+
6
+ * add arc65 support: loggedErr() and loggedAssert() functions, to log a formatted error string before failing ([`5ac27a5`](https://github.com/algorandfoundation/algorand-python-testing/commit/5ac27a5f96d075224c47dc7c8b6ceba65db0e5e3))
7
+
8
+ ## v1.2.0-beta.5 (2026-04-01)
9
+
10
+ ### Features
11
+
12
+ * add LocalMap ([`447cd47`](https://github.com/algorandfoundation/algorand-python-testing/commit/447cd479a24b8a1fc0c91b51a97b222ba1ea27f8))
13
+
14
+ * add GlobalMap ([`8d75a3b`](https://github.com/algorandfoundation/algorand-python-testing/commit/8d75a3b65a083b6f1484de44a660a58c8abfd2ef))
15
+
16
+ ### Bug fixes
17
+
18
+ * do not count GlobalMap and LocalMap in stateTotals ([`d7da98a`](https://github.com/algorandfoundation/algorand-python-testing/commit/d7da98a5802e7a6f172c63a8fad5c7bec292b9bc))
19
+
20
+ * state totals now correctly handle direct tuple storage ([`8e7d214`](https://github.com/algorandfoundation/algorand-python-testing/commit/8e7d21481de91767c25c1311c4b4ee6363af83b9))
21
+
22
+ ### Documentation
23
+
24
+ * add GlobalMap and LocalMap to state-management guide ([`e8ca7f8`](https://github.com/algorandfoundation/algorand-python-testing/commit/e8ca7f835f66ac0ae1bc6d953d8bdd43cef7e1f5))
25
+
2
26
  ## v1.2.0-beta.4 (2026-03-16)
3
27
 
4
28
  ## v1.2.0-beta.3 (2025-12-08)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: algorand-python-testing
3
- Version: 1.2.0b4
3
+ Version: 1.2.0b6
4
4
  Summary: Algorand Python testing library
5
5
  Project-URL: Documentation, https://github.com/algorandfoundation/puya/tree/main/algopy_testing#README.md
6
6
  Project-URL: Issues, https://github.com/algorandfoundation/puya/issues
@@ -20,9 +20,11 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin
20
20
  | algopy.FixedArray | Native |
21
21
  | algopy.FixedBytes | Native |
22
22
  | algopy.Global | Emulated |
23
+ | algopy.GlobalMap | Emulated |
23
24
  | algopy.GlobalState | Emulated |
24
25
  | algopy.ImmutableArray | Native |
25
26
  | algopy.ImmutableFixedArray | Native |
27
+ | algopy.LocalMap | Emulated |
26
28
  | algopy.LocalState | Emulated |
27
29
  | algopy.LogicSig | Emulated |
28
30
  | algopy.OnCompleteAction | Native |
@@ -39,6 +41,8 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin
39
41
  | algopy.compile_logicsig | Mockable |
40
42
  | algopy.ensure_budget | Emulated |
41
43
  | algopy.log | Emulated |
44
+ | algopy.logged_assert | Emulated |
45
+ | algopy.log_err | Emulated |
42
46
  | algopy.logicsig | Emulated |
43
47
  | algopy.public | Emulated |
44
48
  | algopy.size_of | Emulated |
@@ -29,6 +29,42 @@ contract.state_a.value = algopy.UInt64(10)
29
29
  contract.state_b.value = algopy.UInt64(20)
30
30
  ```
31
31
 
32
+ ## Global Map
33
+
34
+ `GlobalMap` allows contracts to store collections of key-value pairs in global state, using a common key type and value type with an automatically derived (or explicit) key prefix.
35
+
36
+ ```{testcode}
37
+ class GlobalMapContract(algopy.ARC4Contract):
38
+ def __init__(self):
39
+ # Implicit key prefix (derived from attribute name "scores")
40
+ self.scores = algopy.GlobalMap(algopy.Bytes, algopy.arc4.UInt64)
41
+ # Explicit key prefix
42
+ self.labels = algopy.GlobalMap(algopy.Bytes, algopy.arc4.String, key_prefix="my_labels")
43
+
44
+ # In your test
45
+ contract = GlobalMapContract()
46
+
47
+ # Set and get values
48
+ contract.scores[algopy.Bytes(b"item_a")] = algopy.arc4.UInt64(100)
49
+ assert contract.scores[algopy.Bytes(b"item_a")] == algopy.arc4.UInt64(100)
50
+
51
+ # Check existence
52
+ assert algopy.Bytes(b"item_a") in contract.scores
53
+ assert algopy.Bytes(b"item_b") not in contract.scores
54
+
55
+ # Get with default
56
+ result = contract.scores.get(algopy.Bytes(b"item_b"), default=algopy.arc4.UInt64(0))
57
+ assert result == algopy.arc4.UInt64(0)
58
+
59
+ # Maybe (returns value and existence flag)
60
+ value, exists = contract.scores.maybe(algopy.Bytes(b"item_a"))
61
+ assert exists
62
+
63
+ # Delete
64
+ del contract.scores[algopy.Bytes(b"item_a")]
65
+ assert algopy.Bytes(b"item_a") not in contract.scores
66
+ ```
67
+
32
68
  ## Local State
33
69
 
34
70
  Local state is defined similarly to global state, but accessed using account addresses as keys.
@@ -44,6 +80,47 @@ account = context.any.account()
44
80
  contract.local_state_a[account] = algopy.UInt64(10)
45
81
  ```
46
82
 
83
+ ## Local Map
84
+
85
+ `LocalMap` is similar to `GlobalMap` but stores per-account state. Values are accessed using an `(account, key)` tuple.
86
+
87
+ ```{testcode}
88
+ class LocalMapContract(algopy.ARC4Contract):
89
+ def __init__(self):
90
+ self.balances = algopy.LocalMap(algopy.Bytes, algopy.arc4.UInt64)
91
+
92
+ # In your test
93
+ contract = LocalMapContract()
94
+ account = context.any.account()
95
+
96
+ # Set and get values using (account, key) tuple
97
+ contract.balances[account, algopy.Bytes(b"item_a")] = algopy.arc4.UInt64(500)
98
+ assert contract.balances[account, algopy.Bytes(b"item_a")] == algopy.arc4.UInt64(500)
99
+
100
+ # Check existence
101
+ assert (account, algopy.Bytes(b"item_a")) in contract.balances
102
+ assert (account, algopy.Bytes(b"item_b")) not in contract.balances
103
+
104
+ # Get with default
105
+ result = contract.balances.get(account, algopy.Bytes(b"item_b"), default=algopy.arc4.UInt64(0))
106
+ assert result == algopy.arc4.UInt64(0)
107
+
108
+ # Maybe
109
+ value, exists = contract.balances.maybe(account, algopy.Bytes(b"item_a"))
110
+ assert exists
111
+
112
+ # Delete
113
+ del contract.balances[account, algopy.Bytes(b"item_a")]
114
+ assert (account, algopy.Bytes(b"item_a")) not in contract.balances
115
+
116
+ # Different accounts have independent state
117
+ account2 = context.any.account()
118
+ contract.balances[account, algopy.Bytes(b"item_a")] = algopy.arc4.UInt64(100)
119
+ contract.balances[account2, algopy.Bytes(b"item_a")] = algopy.arc4.UInt64(200)
120
+ assert contract.balances[account, algopy.Bytes(b"item_a")] == algopy.arc4.UInt64(100)
121
+ assert contract.balances[account2, algopy.Bytes(b"item_a")] == algopy.arc4.UInt64(200)
122
+ ```
123
+
47
124
  ## Boxes
48
125
 
49
126
  The framework supports various Box abstractions available in `algorand-python`.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "algorand-python-testing"
7
- version = "1.2.0-beta.4"
7
+ version = "1.2.0-beta.6"
8
8
  description = 'Algorand Python testing library'
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -21,7 +21,7 @@ from _algopy_testing.models import (
21
21
  urange,
22
22
  )
23
23
  from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64
24
- from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalState, LocalState
24
+ from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalMap, GlobalState, LocalMap, LocalState
25
25
  from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator
26
26
  from _algopy_testing.value_generators.avm import AVMValueGenerator
27
27
  from _algopy_testing.value_generators.txn import TxnValueGenerator
@@ -44,10 +44,12 @@ __all__ = [
44
44
  "Bytes",
45
45
  "Contract",
46
46
  "FixedBytes",
47
+ "GlobalMap",
47
48
  "GlobalState",
48
49
  "ITxnGroupLoader",
49
50
  "ITxnLoader",
50
51
  "LedgerContext",
52
+ "LocalMap",
51
53
  "LocalState",
52
54
  "LogicSig",
53
55
  "OnCompleteAction",
@@ -37,16 +37,16 @@ class _ContractMeta(type):
37
37
  _scratch_slots: typing.Any
38
38
  _state_totals: StateTotals | None
39
39
  _avm_version: int
40
-
41
- def __init__(cls, *args: typing.Any, **kwargs: typing.Any) -> None:
42
- super().__init__(*args, **kwargs)
43
- cls.global_state_types = dict[str, type]()
40
+ _global_state_types: dict[str, type]
44
41
 
45
42
  def __call__(cls, *args: typing.Any, **kwargs: dict[str, typing.Any]) -> object:
43
+ # cls is both _ContractMeta and a (sub)class of Contract, but mypy can't
44
+ # handle intersection types (and assumes that cls is just _ContractMeta)
45
+ assert issubclass(cls, Contract)
46
46
  context = lazy_context.value
47
47
  app_ref = context.any.application() # new reference to get a unique app_id
48
48
  app_id = app_ref.id.value
49
- instance: Contract = cls.__new__(cls, *args, **kwargs) # type: ignore[arg-type]
49
+ instance = cls.__new__(cls, *args, **kwargs)
50
50
  instance.__app_id__ = app_id
51
51
  app_data = lazy_context.get_app_data(app_id)
52
52
  app_data.contract = instance
@@ -54,6 +54,9 @@ class _ContractMeta(type):
54
54
 
55
55
  fields = get_active_txn_fields(app_ref)
56
56
  txn = context.any.txn.application_call(**fields)
57
+ # the below is the key reason for this being a metaclass, rather than overriding
58
+ # the __new__ method in Contract itself: we get to control the calling of __init__,
59
+ # and place it inside the following context manager
57
60
  with context.txn._maybe_implicit_txn_group([txn]) as active_group:
58
61
  if active_group.active_app_id != app_id:
59
62
  raise ValueError(
@@ -64,10 +67,9 @@ class _ContractMeta(type):
64
67
  app_id,
65
68
  creator=creator,
66
69
  )
67
- instance.__init__(*args, **kwargs) # type: ignore[misc]
70
+ cls.__init__(instance, *args, **kwargs)
68
71
  app_data.is_creating = _has_create_methods(cls)
69
72
 
70
- assert isinstance(instance, Contract)
71
73
  cls_state_totals = cls._state_totals or StateTotals()
72
74
  state_totals = _get_state_totals(instance, cls_state_totals)
73
75
  context.ledger.update_app(
@@ -96,6 +98,7 @@ class Contract(metaclass=_ContractMeta):
96
98
  state_totals: StateTotals | None = None,
97
99
  avm_version: int = 11,
98
100
  ):
101
+ cls._global_state_types = dict[str, type]() # ensure each subclass gets its own
99
102
  cls._name = name or cls.__name__
100
103
  cls._scratch_slots = scratch_slots
101
104
  cls._state_totals = state_totals
@@ -115,7 +118,7 @@ class Contract(metaclass=_ContractMeta):
115
118
 
116
119
  def create_txn_group(*args: typing.Any, **kwargs: dict[str, typing.Any]) -> typing.Any:
117
120
  context = lazy_context.value
118
- app = context.ledger.get_app(_get_self_or_active_app_id(self))
121
+ app = context.ledger.get_app(self.__app_id__)
119
122
  txn_fields = get_active_txn_fields(app)
120
123
  txns = [context.any.txn.application_call(**txn_fields)]
121
124
  with context.txn._maybe_implicit_txn_group(txns):
@@ -138,14 +141,11 @@ class Contract(metaclass=_ContractMeta):
138
141
  return set_is_creating
139
142
 
140
143
  cls = type(self)
141
- assert isinstance(cls, _ContractMeta)
142
144
  try:
143
- unproxied_global_state_type = cls.global_state_types[name]
145
+ unproxied_global_state_type = cls._global_state_types[name]
144
146
  except KeyError:
145
147
  return attr
146
- value = lazy_context.ledger.get_global_state(
147
- _get_self_or_active_app_id(self), name.encode("utf8")
148
- )
148
+ value = lazy_context.ledger.get_global_state(self.__app_id__, name.encode("utf8"))
149
149
 
150
150
  value = deserialize(unproxied_global_state_type, value)
151
151
  return set_attr_on_mutate(self, name, value)
@@ -153,34 +153,37 @@ class Contract(metaclass=_ContractMeta):
153
153
  def __setattr__(self, name: str, value: typing.Any) -> None:
154
154
  name_bytes = _algopy_testing.String(name).bytes
155
155
  match value:
156
- case (_algopy_testing.Box() | _algopy_testing.BoxRef()) as box if not box._key:
157
- box._key = name_bytes
156
+ case (_algopy_testing.Box() | _algopy_testing.BoxRef()) as box:
157
+ if not box._key:
158
+ box._key = name_bytes
159
+ case _algopy_testing.BoxMap() as box_map:
160
+ if box_map._key_prefix is None:
161
+ box_map._key_prefix = name_bytes
158
162
  case _algopy_testing.GlobalState() as state:
159
- state.app_id = _get_self_or_active_app_id(self)
163
+ state.app_id = self.__app_id__
160
164
  if not state._key:
161
165
  state.set_key(name_bytes)
162
166
  case _algopy_testing.LocalState() as state:
163
- state.app_id = _get_self_or_active_app_id(self)
167
+ state.app_id = self.__app_id__
164
168
  if not state._key:
165
169
  state._key = name_bytes
166
- case _algopy_testing.BoxMap() as box_map if box_map._key_prefix is None:
167
- box_map._key_prefix = name_bytes
168
- case Bytes() | UInt64() | BytesBacked() | Serializable() | UInt64Backed() | bool():
169
- app_id = _get_self_or_active_app_id(self)
170
+ case _algopy_testing.GlobalMap() | _algopy_testing.LocalMap() as state_map:
171
+ state_map.app_id = self.__app_id__
172
+ if state_map._key_prefix is None:
173
+ state_map._key_prefix = name_bytes
174
+ case _ if _is_data_type(value):
175
+ app_id = self.__app_id__
170
176
  lazy_context.ledger.set_global_state(app_id, name_bytes, serialize(value))
171
177
  cls = type(self)
172
- assert isinstance(cls, _ContractMeta)
173
- cls.global_state_types[name] = type(value)
178
+ cls._global_state_types[name] = type(value)
174
179
 
175
180
  super().__setattr__(name, value)
176
181
 
177
182
 
178
- def _get_self_or_active_app_id(contract: Contract) -> int:
179
- try:
180
- return contract.__app_id__
181
- # during construction app_id is not available, get from context instead
182
- except AttributeError:
183
- return lazy_context.active_group.active_app_id
183
+ def _is_data_type(value: object) -> bool:
184
+ return isinstance(
185
+ value, Bytes | UInt64 | BytesBacked | Serializable | UInt64Backed | bool | tuple
186
+ )
184
187
 
185
188
 
186
189
  class ARC4Contract(Contract):
@@ -196,17 +199,15 @@ class ARC4Contract(Contract):
196
199
 
197
200
 
198
201
  def _get_state_totals(contract: Contract, cls_state_totals: StateTotals) -> _StateTotals:
199
- from _algopy_testing.primitives import UInt64
200
- from _algopy_testing.protocols import UInt64Backed
201
-
202
202
  global_bytes = global_uints = local_bytes = local_uints = 0
203
- for type_ in get_global_states(contract).values():
204
- if isinstance(type_, type) and issubclass(type_, UInt64 | UInt64Backed | bool):
203
+ state_types = get_state_types(contract)
204
+ for type_ in state_types.global_types:
205
+ if _is_uint_state(type_):
205
206
  global_uints += 1
206
207
  else:
207
208
  global_bytes += 1
208
- for type_ in get_local_states(contract).values():
209
- if isinstance(type_, type) and issubclass(type_, UInt64 | UInt64Backed | bool):
209
+ for type_ in state_types.local_types:
210
+ if _is_uint_state(type_):
210
211
  local_uints += 1
211
212
  else:
212
213
  local_bytes += 1
@@ -228,7 +229,21 @@ def _get_state_totals(contract: Contract, cls_state_totals: StateTotals) -> _Sta
228
229
  )
229
230
 
230
231
 
231
- def _has_create_methods(contract_cls: _ContractMeta) -> bool:
232
+ def _is_uint_state(type_: type) -> bool:
233
+ from _algopy_testing.primitives import UInt64
234
+ from _algopy_testing.protocols import UInt64Backed
235
+
236
+ # check to make sure it's actually a type first, otherwise issubclass will
237
+ # fail on Python 3.13
238
+ if not isinstance(type_, type):
239
+ # this should only occur for tuples, bit of a hole in the type-system
240
+ assert typing.get_origin(type_) is tuple
241
+ return False
242
+ else:
243
+ return issubclass(type_, UInt64 | UInt64Backed | bool)
244
+
245
+
246
+ def _has_create_methods(contract_cls: type[Contract]) -> bool:
232
247
  for method in vars(contract_cls).values():
233
248
  if callable(method) and (arc4_meta := maybe_arc4_metadata(method)) and arc4_meta.is_create:
234
249
  return True
@@ -236,30 +251,20 @@ def _has_create_methods(contract_cls: _ContractMeta) -> bool:
236
251
  return False
237
252
 
238
253
 
239
- def get_local_states(contract: Contract) -> dict[bytes, type]:
240
- local_states = {
241
- attribute._key.value: attribute.type_
242
- for _, attribute in vars(contract).items()
243
- if isinstance(attribute, _algopy_testing.LocalState)
244
- }
245
-
246
- return local_states
247
-
248
-
249
- def get_global_states(contract: Contract) -> dict[bytes, type]:
250
- global_states = {}
251
- for key, attribute in vars(contract).items():
252
- if isinstance(
253
- attribute,
254
- _algopy_testing.LocalState
255
- | _algopy_testing.Box
256
- | _algopy_testing.BoxMap
257
- | _algopy_testing.BoxRef,
258
- ) or callable(attribute):
259
- continue
260
- if isinstance(attribute, _algopy_testing.GlobalState):
261
- global_states[attribute.key.value] = attribute.type_
262
- elif isinstance(attribute, UInt64Backed | BytesBacked | UInt64 | Bytes | bool):
263
- global_states[key.encode()] = type(attribute)
264
-
265
- return global_states
254
+ @dataclass
255
+ class _StateTypes:
256
+ local_types: list[type]
257
+ global_types: list[type]
258
+
259
+
260
+ def get_state_types(contract: Contract) -> _StateTypes:
261
+ result = _StateTypes(local_types=[], global_types=[])
262
+ for attribute in contract.__dict__.values():
263
+ match attribute:
264
+ case _algopy_testing.LocalState(type_=value_type):
265
+ result.local_types.append(value_type)
266
+ case _algopy_testing.GlobalState(type_=value_type):
267
+ result.global_types.append(value_type)
268
+ case _ if _is_data_type(attribute):
269
+ result.global_types.append(type(attribute))
270
+ return result
@@ -10,6 +10,7 @@ from _algopy_testing.enums import TransactionType
10
10
  from _algopy_testing.models import Account, Application, Asset
11
11
  from _algopy_testing.primitives.bytes import Bytes
12
12
  from _algopy_testing.primitives.uint64 import UInt64
13
+ from _algopy_testing.state.utils import get_account
13
14
  from _algopy_testing.utils import (
14
15
  raise_mocked_function_error,
15
16
  resolve_app_index,
@@ -30,13 +31,6 @@ def _get_app(app: algopy.Application | algopy.UInt64 | int) -> Application:
30
31
  return lazy_context.ledger.get_app(resolve_app_index(app))
31
32
 
32
33
 
33
- def _get_account(acc: algopy.Account | algopy.UInt64 | int) -> Account:
34
- if isinstance(acc, Account):
35
- return acc
36
- txn = lazy_context.active_group.active_txn
37
- return txn.accounts(acc)
38
-
39
-
40
34
  def _get_asset(asset: algopy.Asset | algopy.UInt64 | int) -> Asset:
41
35
  if isinstance(asset, Asset):
42
36
  return asset
@@ -88,12 +82,12 @@ def gaid(a: algopy.UInt64 | int, /) -> algopy.UInt64:
88
82
 
89
83
 
90
84
  def balance(a: algopy.Account | algopy.UInt64 | int, /) -> algopy.UInt64:
91
- account = _get_account(a)
85
+ account = get_account(a)
92
86
  return account.balance
93
87
 
94
88
 
95
89
  def min_balance(a: algopy.Account | algopy.UInt64 | int, /) -> algopy.UInt64:
96
- account = _get_account(a)
90
+ account = get_account(a)
97
91
  return account.min_balance
98
92
 
99
93
 
@@ -104,7 +98,7 @@ def exit(_a: UInt64 | int, /) -> typing.Never: # noqa: A001
104
98
  def app_opted_in(
105
99
  a: algopy.Account | algopy.UInt64 | int, b: algopy.Application | algopy.UInt64 | int, /
106
100
  ) -> bool:
107
- account = _get_account(a)
101
+ account = get_account(a)
108
102
  app = _get_app(b)
109
103
 
110
104
  return account.is_opted_in(app)
@@ -113,100 +107,100 @@ def app_opted_in(
113
107
  class AcctParamsGet:
114
108
  @staticmethod
115
109
  def acct_auth_addr(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.Account, bool]:
116
- account = _get_account(a)
110
+ account = get_account(a)
117
111
  return account.auth_address, account.balance != 0
118
112
 
119
113
  @staticmethod
120
114
  def acct_balance(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
121
- account = _get_account(a)
115
+ account = get_account(a)
122
116
  return account.balance, account.balance != 0
123
117
 
124
118
  @staticmethod
125
119
  def acct_min_balance(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
126
- account = _get_account(a)
120
+ account = get_account(a)
127
121
  return account.min_balance, account.balance != 0
128
122
 
129
123
  @staticmethod
130
124
  def acct_auth_address(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
131
- account = _get_account(a)
125
+ account = get_account(a)
132
126
  return account.auth_address, account.balance != 0
133
127
 
134
128
  @staticmethod
135
129
  def acct_total_num_uint(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
136
- account = _get_account(a)
130
+ account = get_account(a)
137
131
  return account.total_num_uint, account.balance != 0
138
132
 
139
133
  @staticmethod
140
134
  def acct_total_num_byte_slice(
141
135
  a: algopy.Account | algopy.UInt64 | int,
142
136
  ) -> tuple[algopy.UInt64, bool]:
143
- account = _get_account(a)
137
+ account = get_account(a)
144
138
  return account.total_num_byte_slice, account.balance != 0
145
139
 
146
140
  @staticmethod
147
141
  def acct_total_extra_app_pages(
148
142
  a: algopy.Account | algopy.UInt64 | int,
149
143
  ) -> tuple[algopy.UInt64, bool]:
150
- account = _get_account(a)
144
+ account = get_account(a)
151
145
  return account.total_extra_app_pages, account.balance != 0
152
146
 
153
147
  @staticmethod
154
148
  def acct_total_apps_created(
155
149
  a: algopy.Account | algopy.UInt64 | int,
156
150
  ) -> tuple[algopy.UInt64, bool]:
157
- account = _get_account(a)
151
+ account = get_account(a)
158
152
  return account.total_apps_created, account.balance != 0
159
153
 
160
154
  @staticmethod
161
155
  def acct_total_apps_opted_in(
162
156
  a: algopy.Account | algopy.UInt64 | int,
163
157
  ) -> tuple[algopy.UInt64, bool]:
164
- account = _get_account(a)
158
+ account = get_account(a)
165
159
  return account.total_apps_opted_in, account.balance != 0
166
160
 
167
161
  @staticmethod
168
162
  def acct_total_assets_created(
169
163
  a: algopy.Account | algopy.UInt64 | int,
170
164
  ) -> tuple[algopy.UInt64, bool]:
171
- account = _get_account(a)
165
+ account = get_account(a)
172
166
  return account.total_assets_created, account.balance != 0
173
167
 
174
168
  @staticmethod
175
169
  def acct_total_assets(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
176
- account = _get_account(a)
170
+ account = get_account(a)
177
171
  return account.total_assets, account.balance != 0
178
172
 
179
173
  @staticmethod
180
174
  def acct_total_boxes(a: algopy.Account | algopy.UInt64 | int) -> tuple[algopy.UInt64, bool]:
181
- account = _get_account(a)
175
+ account = get_account(a)
182
176
  return account.total_boxes, account.balance != 0
183
177
 
184
178
  @staticmethod
185
179
  def acct_total_box_bytes(
186
180
  a: algopy.Account | algopy.UInt64 | int,
187
181
  ) -> tuple[algopy.UInt64, bool]:
188
- account = _get_account(a)
182
+ account = get_account(a)
189
183
  return account.total_box_bytes, account.balance != 0
190
184
 
191
185
  @staticmethod
192
186
  def acct_incentive_eligible(
193
187
  a: algopy.Account | algopy.UInt64 | int,
194
188
  ) -> tuple[bool, bool]:
195
- account = _get_account(a)
189
+ account = get_account(a)
196
190
  return account.incentive_eligible, account.balance != 0
197
191
 
198
192
  @staticmethod
199
193
  def acct_last_heartbeat(
200
194
  a: algopy.Account | algopy.UInt64 | int,
201
195
  ) -> tuple[algopy.UInt64, bool]:
202
- account = _get_account(a)
196
+ account = get_account(a)
203
197
  return account.last_heartbeat, account.balance != 0
204
198
 
205
199
  @staticmethod
206
200
  def acct_last_proposed(
207
201
  a: algopy.Account | algopy.UInt64 | int,
208
202
  ) -> tuple[algopy.UInt64, bool]:
209
- account = _get_account(a)
203
+ account = get_account(a)
210
204
  return account.last_proposed, account.balance != 0
211
205
 
212
206
 
@@ -316,7 +310,7 @@ class _AssetHoldingGet:
316
310
  field: str,
317
311
  ) -> tuple[typing.Any, bool]:
318
312
  # Resolve account
319
- account = _get_account(account_or_index)
313
+ account = get_account(account_or_index)
320
314
  try:
321
315
  asset = _get_asset(asset_or_index)
322
316
  except ValueError:
@@ -427,7 +421,7 @@ class _AppLocal:
427
421
  c: algopy.Bytes | bytes,
428
422
  /,
429
423
  ) -> tuple[algopy.Bytes | algopy.UInt64, bool]:
430
- account = _get_account(a)
424
+ account = get_account(a)
431
425
  app = _get_app(b)
432
426
  key = _get_bytes(c)
433
427
  try:
@@ -444,7 +438,7 @@ class _AppLocal:
444
438
  get_ex_uint64 = get_ex_bytes
445
439
 
446
440
  def delete(self, a: algopy.Account | algopy.UInt64 | int, b: algopy.Bytes | bytes, /) -> None:
447
- account = _get_account(a)
441
+ account = get_account(a)
448
442
  key = _get_bytes(b)
449
443
  lazy_context.ledger.set_local_state(lazy_context.active_app_id, account, key, None)
450
444
 
@@ -455,7 +449,7 @@ class _AppLocal:
455
449
  c: algopy.Bytes | algopy.UInt64 | bytes | int,
456
450
  /,
457
451
  ) -> None:
458
- account = _get_account(a)
452
+ account = get_account(a)
459
453
  key = _get_bytes(b)
460
454
  value = c.value if isinstance(c, Bytes | UInt64) else c
461
455
  lazy_context.ledger.set_local_state(lazy_context.active_app_id, account, key, value)
@@ -0,0 +1,7 @@
1
+ from _algopy_testing.state.box import Box, BoxMap, BoxRef
2
+ from _algopy_testing.state.global_map import GlobalMap
3
+ from _algopy_testing.state.global_state import GlobalState
4
+ from _algopy_testing.state.local_map import LocalMap
5
+ from _algopy_testing.state.local_state import LocalState
6
+
7
+ __all__ = ["Box", "BoxMap", "BoxRef", "GlobalMap", "GlobalState", "LocalMap", "LocalState"]