algorand-python-testing 1.1.0__tar.gz → 1.2.0b1__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 (374) hide show
  1. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/CHANGELOG.md +6 -0
  2. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/PKG-INFO +1 -1
  3. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/coverage.md +2 -1
  4. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/avm-types.md +16 -0
  5. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/pyproject.toml +1 -1
  6. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/__init__.py +2 -1
  7. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/arc4.py +3 -1
  8. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/__init__.py +2 -0
  9. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/bytes.py +7 -8
  10. algorand_python_testing-1.2.0b1/src/_algopy_testing/primitives/fixed_bytes.py +336 -0
  11. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/serialize.py +10 -0
  12. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/utils.py +2 -5
  13. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utils.py +2 -0
  14. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/avm.py +15 -0
  15. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/__init__.py +2 -0
  16. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_arc4_method_signature.py +9 -3
  17. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/Contract.approval.teal +7 -7
  18. algorand_python_testing-1.2.0b1/tests/artifacts/AVM12/data/Contract.arc56.json +119 -0
  19. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/Contract.clear.teal +1 -1
  20. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.approval.teal +3 -5
  21. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.arc56.json +6 -18
  22. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.clear.teal +1 -1
  23. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.approval.teal +3 -5
  24. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.arc56.json +6 -18
  25. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.clear.teal +1 -1
  26. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/contract.py +5 -2
  27. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +96 -84
  28. algorand_python_testing-1.2.0b1/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +496 -0
  29. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +1 -1
  30. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +3 -5
  31. algorand_python_testing-1.2.0b1/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +88 -0
  32. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +1 -1
  33. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +13 -15
  34. algorand_python_testing-1.2.0b1/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +1575 -0
  35. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +1 -1
  36. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.approval.teal +186 -178
  37. algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/Contract.arc56.json +367 -0
  38. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.clear.teal +1 -1
  39. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal +48 -82
  40. algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +131 -0
  41. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal +1 -1
  42. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +106 -108
  43. algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +828 -0
  44. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal +1 -1
  45. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +15 -21
  46. algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +322 -0
  47. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal +1 -1
  48. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.approval.teal +49 -47
  49. algorand_python_testing-1.2.0b1/tests/artifacts/BoxContract/data/BoxContract.arc56.json +768 -0
  50. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.clear.teal +1 -1
  51. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/data/MyContract.approval.teal +1 -1
  52. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/data/MyContract.clear.teal +1 -1
  53. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal +3 -5
  54. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json +6 -19
  55. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal +1 -1
  56. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +10 -5
  57. algorand_python_testing-1.2.0b1/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +169 -0
  58. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal +1 -1
  59. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +7 -9
  60. algorand_python_testing-1.2.0b1/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +437 -0
  61. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +1 -1
  62. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +5 -5
  63. algorand_python_testing-1.2.0b1/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +99 -0
  64. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +1 -1
  65. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +2 -4
  66. algorand_python_testing-1.2.0b1/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +999 -0
  67. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +1 -1
  68. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/contract.py +3 -2
  69. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +11 -8
  70. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +10 -19
  71. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +1 -1
  72. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.approval.teal +2 -4
  73. algorand_python_testing-1.2.0b1/tests/artifacts/StateMutations/data/StateMutations.arc56.json +258 -0
  74. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.clear.teal +1 -1
  75. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +1 -3
  76. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +20 -32
  77. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +1 -1
  78. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +3 -3
  79. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +83 -0
  80. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +1 -1
  81. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +2 -4
  82. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +565 -0
  83. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +1 -1
  84. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +2 -4
  85. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +466 -0
  86. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +1 -1
  87. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +1 -3
  88. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +241 -0
  89. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +1 -1
  90. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +2 -4
  91. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +97 -0
  92. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +1 -1
  93. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +4 -6
  94. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +310 -0
  95. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +1 -1
  96. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +5 -7
  97. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +6 -19
  98. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +1 -1
  99. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +1 -3
  100. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +285 -0
  101. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +1 -1
  102. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +4 -6
  103. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json +6 -19
  104. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +1 -1
  105. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +2 -4
  106. algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +354 -0
  107. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +1 -1
  108. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.approval.teal +2 -4
  109. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.arc56.json +6 -19
  110. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.clear.teal +1 -1
  111. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box.py +15 -1
  112. algorand_python_testing-1.2.0b1/tests/primitives/test_fixed_bytes.py +695 -0
  113. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/test_log.py +5 -3
  114. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/test_size_of.py +4 -2
  115. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/value_generators/test_avm.py +15 -2
  116. algorand_python_testing-1.1.0/tests/artifacts/AVM12/data/Contract.arc56.json +0 -131
  117. algorand_python_testing-1.1.0/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +0 -498
  118. algorand_python_testing-1.1.0/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +0 -101
  119. algorand_python_testing-1.1.0/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +0 -1587
  120. algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/Contract.arc56.json +0 -379
  121. algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +0 -144
  122. algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +0 -840
  123. algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +0 -334
  124. algorand_python_testing-1.1.0/tests/artifacts/BoxContract/data/BoxContract.arc56.json +0 -780
  125. algorand_python_testing-1.1.0/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +0 -181
  126. algorand_python_testing-1.1.0/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +0 -450
  127. algorand_python_testing-1.1.0/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +0 -111
  128. algorand_python_testing-1.1.0/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +0 -1012
  129. algorand_python_testing-1.1.0/tests/artifacts/StateMutations/data/StateMutations.arc56.json +0 -276
  130. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +0 -96
  131. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +0 -583
  132. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +0 -478
  133. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +0 -254
  134. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +0 -104
  135. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +0 -329
  136. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +0 -297
  137. algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +0 -366
  138. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.coveragerc +0 -0
  139. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.editorconfig +0 -0
  140. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  141. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  142. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/dependabot.yml +0 -0
  143. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/pull_request_template.md +0 -0
  144. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/cd.yaml +0 -0
  145. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/ci.yaml +0 -0
  146. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/gh-pages.yaml +0 -0
  147. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.gitignore +0 -0
  148. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.pre-commit-config.yaml +0 -0
  149. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/extensions.json +0 -0
  150. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/launch.json +0 -0
  151. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/settings.json +0 -0
  152. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/CONTRIBUTING.md +0 -0
  153. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/LICENSE +0 -0
  154. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/README.md +0 -0
  155. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/Makefile +0 -0
  156. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/__init__.py +0 -0
  157. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/_static/custom.css +0 -0
  158. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/algopy.md +0 -0
  159. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/api.md +0 -0
  160. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/conf.py +0 -0
  161. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/examples.md +0 -0
  162. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/faq.md +0 -0
  163. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/index.md +0 -0
  164. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/make.bat +0 -0
  165. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/arc4-types.md +0 -0
  166. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/concepts.md +0 -0
  167. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/contract-testing.md +0 -0
  168. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/index.md +0 -0
  169. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/opcodes.md +0 -0
  170. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/signature-testing.md +0 -0
  171. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/state-management.md +0 -0
  172. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/subroutines.md +0 -0
  173. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/transactions.md +0 -0
  174. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/README.md +0 -0
  175. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/__init__.py +0 -0
  176. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/__init__.py +0 -0
  177. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/contract.py +0 -0
  178. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/test_contract.py +0 -0
  179. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/__init__.py +0 -0
  180. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/signature.py +0 -0
  181. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/test_signature.py +0 -0
  182. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/__init__.py +0 -0
  183. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/contract.py +0 -0
  184. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/test_contract.py +0 -0
  185. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/__init__.py +0 -0
  186. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/contract.py +0 -0
  187. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/test_contract.py +0 -0
  188. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/__init__.py +0 -0
  189. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/contract.py +0 -0
  190. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/test_contract.py +0 -0
  191. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/__init__.py +0 -0
  192. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/contract.py +0 -0
  193. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/test_contract.py +0 -0
  194. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/__init__.py +0 -0
  195. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/contract.py +0 -0
  196. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/test_contract.py +0 -0
  197. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/__init__.py +0 -0
  198. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/check_stubs_cov.py +0 -0
  199. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/refresh_test_artifacts.py +0 -0
  200. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/validate_examples.py +0 -0
  201. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/arc4.py +0 -0
  202. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/compiled.py +0 -0
  203. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/constants.py +0 -0
  204. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context.py +0 -0
  205. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/__init__.py +0 -0
  206. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/context_storage.py +0 -0
  207. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/ledger_context.py +0 -0
  208. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/txn_context.py +0 -0
  209. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/__init__.py +0 -0
  210. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/subroutine.py +0 -0
  211. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/enums.py +0 -0
  212. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/gtxn.py +0 -0
  213. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/itxn.py +0 -0
  214. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/itxn_loader.py +0 -0
  215. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/__init__.py +0 -0
  216. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/account.py +0 -0
  217. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/application.py +0 -0
  218. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/asset.py +0 -0
  219. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/contract.py +0 -0
  220. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/logicsig.py +0 -0
  221. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/template_variable.py +0 -0
  222. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/txn_fields.py +0 -0
  223. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/unsigned_builtins.py +0 -0
  224. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/mutable.py +0 -0
  225. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/__init__.py +0 -0
  226. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/block.py +0 -0
  227. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/constants.py +0 -0
  228. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/crypto.py +0 -0
  229. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/global_values.py +0 -0
  230. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/itxn.py +0 -0
  231. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/misc.py +0 -0
  232. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/pure.py +0 -0
  233. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/txn.py +0 -0
  234. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/array.py +0 -0
  235. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/biguint.py +0 -0
  236. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/string.py +0 -0
  237. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/uint64.py +0 -0
  238. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/protocols.py +0 -0
  239. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/py.typed +0 -0
  240. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/__init__.py +0 -0
  241. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/box.py +0 -0
  242. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/global_state.py +0 -0
  243. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/local_state.py +0 -0
  244. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/__init__.py +0 -0
  245. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/budget.py +0 -0
  246. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/log.py +0 -0
  247. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/size_of.py +0 -0
  248. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/__init__.py +0 -0
  249. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/arc4.py +0 -0
  250. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/txn.py +0 -0
  251. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/arc4.py +0 -0
  252. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/gtxn.py +0 -0
  253. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/itxn.py +0 -0
  254. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/op.py +0 -0
  255. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/py.typed +0 -0
  256. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy_testing/__init__.py +0 -0
  257. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy_testing/py.typed +0 -0
  258. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/.macros.j2 +0 -0
  259. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/.release_notes.md.j2 +0 -0
  260. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/CHANGELOG.md.j2 +0 -0
  261. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/__init__.py +0 -0
  262. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/__init__.py +0 -0
  263. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/conftest.py +0 -0
  264. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_abi_call.py +0 -0
  265. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_address.py +0 -0
  266. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_bool.py +0 -0
  267. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_dynamic_array.py +0 -0
  268. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_dynamic_bytes.py +0 -0
  269. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_emit.py +0 -0
  270. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_static_array.py +0 -0
  271. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_string.py +0 -0
  272. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_struct.py +0 -0
  273. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_tuple.py +0 -0
  274. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_ufixednxm.py +0 -0
  275. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_uintn.py +0 -0
  276. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/__init__.py +0 -0
  277. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/contract.py +0 -0
  278. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/__init__.py +0 -0
  279. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc32.json +0 -0
  280. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/__init__.py +0 -0
  281. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/contract.py +0 -0
  282. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc32.json +0 -0
  283. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/__init__.py +0 -0
  284. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/contract.py +0 -0
  285. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc32.json +0 -0
  286. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/__init__.py +0 -0
  287. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.arc32.json +0 -0
  288. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.arc32.json +0 -0
  289. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal +0 -0
  290. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json +0 -0
  291. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal +0 -0
  292. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.arc32.json +0 -0
  293. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/immutable.py +0 -0
  294. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/static_size.py +0 -0
  295. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/uint64.py +0 -0
  296. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/__init__.py +0 -0
  297. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/contract.py +0 -0
  298. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.arc32.json +0 -0
  299. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/__init__.py +0 -0
  300. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/contract.py +0 -0
  301. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/__init__.py +0 -0
  302. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/contract.py +0 -0
  303. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.arc32.json +0 -0
  304. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc32.json +0 -0
  305. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/other.py +0 -0
  306. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/__init__.py +0 -0
  307. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/contract.py +0 -0
  308. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc32.json +0 -0
  309. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/__init__.py +0 -0
  310. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/contract.py +0 -0
  311. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc32.json +0 -0
  312. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/__init__.py +0 -0
  313. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/contract.py +0 -0
  314. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc32.json +0 -0
  315. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/__init__.py +0 -0
  316. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc32.json +0 -0
  317. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/__init__.py +0 -0
  318. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.approval.teal +0 -0
  319. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.arc32.json +0 -0
  320. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.clear.teal +0 -0
  321. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.arc32.json +0 -0
  322. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/statemutations.py +0 -0
  323. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/__init__.py +0 -0
  324. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/contract.py +0 -0
  325. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.arc32.json +0 -0
  326. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.arc32.json +0 -0
  327. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.arc32.json +0 -0
  328. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.approval.teal +0 -0
  329. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.arc32.json +0 -0
  330. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.clear.teal +0 -0
  331. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +0 -0
  332. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc32.json +0 -0
  333. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc32.json +0 -0
  334. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.arc32.json +0 -0
  335. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc32.json +0 -0
  336. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.arc32.json +0 -0
  337. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc32.json +0 -0
  338. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc32.json +0 -0
  339. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/__init__.py +0 -0
  340. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/contract.py +0 -0
  341. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.arc32.json +0 -0
  342. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/__init__.py +0 -0
  343. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/__init__.py +0 -0
  344. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/conftest.py +0 -0
  345. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/test_avm12.py +0 -0
  346. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/common.py +0 -0
  347. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/conftest.py +0 -0
  348. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/contexts/__init__.py +0 -0
  349. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/__init__.py +0 -0
  350. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_asset.py +0 -0
  351. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box_map.py +0 -0
  352. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box_ref.py +0 -0
  353. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_contract.py +0 -0
  354. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_uenumerate.py +0 -0
  355. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_urange.py +0 -0
  356. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/__init__.py +0 -0
  357. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/conftest.py +0 -0
  358. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_biguint.py +0 -0
  359. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_bytes.py +0 -0
  360. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_string.py +0 -0
  361. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_uint64.py +0 -0
  362. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/__init__.py +0 -0
  363. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/conftest.py +0 -0
  364. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_global_state.py +0 -0
  365. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_local_state.py +0 -0
  366. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_mutations.py +0 -0
  367. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_array.py +0 -0
  368. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_context.py +0 -0
  369. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_miscellaneous_op.py +0 -0
  370. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_op.py +0 -0
  371. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/util.py +0 -0
  372. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/__init__.py +0 -0
  373. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/conftest.py +0 -0
  374. {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/value_generators/__init__.py +0 -0
@@ -1,4 +1,10 @@
1
1
  # CHANGELOG
2
+ ## v1.2.0-beta.1 (2025-12-05)
3
+
4
+ ### Features
5
+
6
+ * add fixed size variant of bytes as a separate `FixedBytes` type ([`9a2ab8e`](https://github.com/algorandfoundation/algorand-python-testing/commit/9a2ab8e3f94e9e7a2a416a94a54cf51b57599089))
7
+
2
8
  ## v1.1.0 (2025-10-20)
3
9
 
4
10
  ## v1.1.0-beta.1 (2025-10-20)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: algorand-python-testing
3
- Version: 1.1.0
3
+ Version: 1.2.0b1
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
@@ -3,7 +3,7 @@
3
3
  See which `algorand-python` stubs are implemented by the `algorand-python-testing` library. See the [Concepts](testing-guide/concepts.md#types-of-algopy-stub-implementations) section for more details on the implementation categories. Refer to the [`algorand-python` stubs API](api.md) for the full list of stubs for which the `algorand-python-testing` library provides implementations referenced in the table below.
4
4
 
5
5
  | Name | Implementation type |
6
- |---------------------------------------------|---------------------|
6
+ | ------------------------------------------- | ------------------- |
7
7
  | algopy.Account | Emulated |
8
8
  | algopy.Application | Emulated |
9
9
  | algopy.Asset | Emulated |
@@ -18,6 +18,7 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin
18
18
  | algopy.CompiledLogicSig | Mockable |
19
19
  | algopy.Contract | Emulated |
20
20
  | algopy.FixedArray | Native |
21
+ | algopy.FixedBytes | Native |
21
22
  | algopy.Global | Emulated |
22
23
  | algopy.GlobalState | Emulated |
23
24
  | algopy.ImmutableArray | Native |
@@ -50,6 +50,22 @@ random_bytes = context.any.bytes()
50
50
  random_bytes = context.any.bytes(length=32)
51
51
  ```
52
52
 
53
+ ## FixedBytes
54
+
55
+ ```{testcode}
56
+ import typing
57
+
58
+ # Direct instantiation
59
+ bytes_value = algopy.FixedBytes[typing.Literal[16]](b"Hello, Algorand!")
60
+
61
+
62
+ # Instantiate test context
63
+ ...
64
+
65
+ # Generate random byte sequences of length 32
66
+ random_bytes = context.any.fixed_bytes(algopy.FixedBytes[typing.Literal[32]])
67
+ ```
68
+
53
69
  ## String
54
70
 
55
71
  ```{testcode}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "algorand-python-testing"
7
- version = "1.1.0"
7
+ version = "1.2.0-beta.1"
8
8
  description = 'Algorand Python testing library'
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -19,7 +19,7 @@ from _algopy_testing.models import (
19
19
  uenumerate,
20
20
  urange,
21
21
  )
22
- from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64
22
+ from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64
23
23
  from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalState, LocalState
24
24
  from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator
25
25
  from _algopy_testing.value_generators.avm import AVMValueGenerator
@@ -39,6 +39,7 @@ __all__ = [
39
39
  "BoxRef",
40
40
  "Bytes",
41
41
  "Contract",
42
+ "FixedBytes",
42
43
  "GlobalState",
43
44
  "ITxnGroupLoader",
44
45
  "ITxnLoader",
@@ -12,7 +12,7 @@ import _algopy_testing
12
12
  from _algopy_testing.constants import ALWAYS_APPROVE_TEAL_PROGRAM, ARC4_RETURN_PREFIX
13
13
  from _algopy_testing.context_helpers import lazy_context
14
14
  from _algopy_testing.enums import OnCompleteAction
15
- from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64
15
+ from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64
16
16
 
17
17
  _P = typing.ParamSpec("_P")
18
18
  _R = typing.TypeVar("_R")
@@ -418,6 +418,8 @@ def _type_to_arc4( # noqa: PLR0912 PLR0911
418
418
  return "uint512"
419
419
  if issubclass(annotation, Bytes):
420
420
  return "byte[]"
421
+ if issubclass(annotation, FixedBytes):
422
+ return f"byte[{annotation._length}]"
421
423
  if issubclass(annotation, bool):
422
424
  return "bool"
423
425
  raise TypeError(f"type not a valid ARC4 type: {annotation}")
@@ -9,6 +9,7 @@ from _algopy_testing.primitives.array import (
9
9
  )
10
10
  from _algopy_testing.primitives.biguint import BigUInt
11
11
  from _algopy_testing.primitives.bytes import Bytes
12
+ from _algopy_testing.primitives.fixed_bytes import FixedBytes
12
13
  from _algopy_testing.primitives.string import String
13
14
  from _algopy_testing.primitives.uint64 import UInt64
14
15
 
@@ -17,6 +18,7 @@ __all__ = [
17
18
  "BigUInt",
18
19
  "Bytes",
19
20
  "FixedArray",
21
+ "FixedBytes",
20
22
  "ImmutableArray",
21
23
  "ImmutableFixedArray",
22
24
  "ReferenceArray",
@@ -7,6 +7,8 @@ from typing import TYPE_CHECKING
7
7
  if TYPE_CHECKING:
8
8
  from collections.abc import Iterator
9
9
 
10
+ from _algopy_testing.primitives.fixed_bytes import FixedBytes
11
+
10
12
 
11
13
  from itertools import zip_longest
12
14
 
@@ -27,7 +29,7 @@ class Bytes:
27
29
  check_type(value, bytes)
28
30
  self.value = as_bytes(value)
29
31
 
30
- def __contains__(self, item: Bytes | bytes) -> bool:
32
+ def __contains__(self, item: Bytes | FixedBytes | bytes) -> bool: # type: ignore[type-arg]
31
33
  item_bytes = as_bytes(item)
32
34
  return item_bytes in self.value
33
35
 
@@ -43,11 +45,8 @@ class Bytes:
43
45
  def __add__(self, other: Bytes | bytes) -> Bytes:
44
46
  """Concatenate Bytes with another Bytes or bytes literal e.g. `Bytes(b"Hello ")
45
47
  + b"World"`."""
46
- if isinstance(other, Bytes):
47
- return _checked_result(self.value + other.value, "+")
48
- else:
49
- result = self.value + as_bytes(other)
50
- return _checked_result(result, "+")
48
+ result = self.value + as_bytes(other)
49
+ return _checked_result(result, "+")
51
50
 
52
51
  def __radd__(self, other: bytes) -> Bytes:
53
52
  """Concatenate Bytes with another Bytes or bytes literal e.g. `b"Hello " +
@@ -70,7 +69,7 @@ class Bytes:
70
69
  self, index: UInt64 | int | slice
71
70
  ) -> Bytes: # maps to substring/substring3 if slice, extract/extract3 otherwise?
72
71
  """Returns a Bytes containing a single byte if indexed with UInt64 or int
73
- otherwise the substring o bytes described by the slice."""
72
+ otherwise the substring of bytes described by the slice."""
74
73
  if isinstance(index, slice):
75
74
  return Bytes(self.value[index])
76
75
  else:
@@ -181,7 +180,7 @@ def _checked_result(result: bytes, op: str) -> Bytes:
181
180
  """Ensures `result` is a valid Bytes value.
182
181
 
183
182
  Raises:
184
- ArithmeticError: If `result` of `op` is out of bounds
183
+ OverflowError: If `result` of `op` is out of bounds
185
184
  """
186
185
  if len(result) > MAX_BYTES_SIZE:
187
186
  raise OverflowError(f"{op} overflows")
@@ -0,0 +1,336 @@
1
+ from __future__ import annotations
2
+
3
+ import base64
4
+ import operator
5
+ import types
6
+ import typing
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from collections.abc import Callable, Iterator
10
+
11
+ from itertools import zip_longest
12
+
13
+ from _algopy_testing.constants import MAX_BYTES_SIZE
14
+ from _algopy_testing.primitives.bytes import Bytes
15
+ from _algopy_testing.primitives.uint64 import UInt64
16
+ from _algopy_testing.protocols import BytesBacked
17
+ from _algopy_testing.utils import (
18
+ as_bytes,
19
+ get_int_literal_from_type_generic,
20
+ get_type_generic_from_int_literal,
21
+ )
22
+
23
+ _TBytesLength = typing.TypeVar("_TBytesLength", bound=int)
24
+ _TBytesLength_Arg = typing.TypeVar("_TBytesLength_Arg", bound=int)
25
+
26
+
27
+ def _get_or_create_class_from_type(cls: type, length_t: type) -> type:
28
+ _length = get_int_literal_from_type_generic(length_t)
29
+ return _get_or_create_class(cls, _length, length_t)
30
+
31
+
32
+ def _get_or_create_class_from_int(cls: type, length: int) -> type:
33
+ length_t = get_type_generic_from_int_literal(length)
34
+ return _get_or_create_class(cls, length, length_t)
35
+
36
+
37
+ def _get_or_create_class(cls: type, length: int, length_t: type) -> type:
38
+ """Get or create a type that is parametrized with element_t and length."""
39
+ cache = getattr(cls, "__concrete__", {})
40
+ if c := cache.get(length_t, None):
41
+ assert isinstance(c, type)
42
+ return c
43
+
44
+ cls_name = f"{cls.__name__}[{length}]"
45
+
46
+ cache[length_t] = t = types.new_class(
47
+ cls_name,
48
+ bases=(cls,),
49
+ exec_body=lambda ns: ns.update(
50
+ _length=length,
51
+ ),
52
+ )
53
+ return t
54
+
55
+
56
+ class _FixedBytesMeta(type):
57
+ __concrete__: typing.ClassVar[dict[type, type]] = {}
58
+
59
+ def __getitem__(cls, length_t: type) -> type:
60
+ if length_t == typing.Any:
61
+ return cls
62
+
63
+ return _get_or_create_class_from_type(cls, length_t)
64
+
65
+
66
+ class FixedBytes(
67
+ BytesBacked,
68
+ typing.Generic[_TBytesLength],
69
+ metaclass=_FixedBytesMeta,
70
+ ):
71
+ """A statically-sized byte sequence, where the length is known at compile time.
72
+
73
+ Unlike `Bytes`, `FixedBytes` has a fixed length specified via a type parameter.
74
+
75
+ Example:
76
+ FixedBytes[typing.Literal[32]] # A 32-byte fixed-size bytes value
77
+ """
78
+
79
+ value: bytes # underlying 'bytes' value representing the FixedBytes
80
+ _length: int
81
+
82
+ def __init__(self, value: Bytes | bytes | None = None, /):
83
+ if value is None:
84
+ self.value = b"\x00" * self._length
85
+ return
86
+
87
+ self.value = as_bytes(value)
88
+ if not hasattr(self, "_length"):
89
+ self._length = len(self.value)
90
+
91
+ if len(self.value) != self._length:
92
+ raise ValueError(f"expected value of length {self._length}, not {len(self.value)}")
93
+
94
+ def __repr__(self) -> str:
95
+ return repr(self.value)
96
+
97
+ def __str__(self) -> str:
98
+ return str(self.value)
99
+
100
+ def __bool__(self) -> bool:
101
+ return bool(self._length)
102
+
103
+ def __len__(self) -> int:
104
+ return self._length
105
+
106
+ def __eq__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: # type: ignore[override]
107
+ """FixedBytes can be compared using the `==` operator with another FixedBytes,
108
+ Bytes or bytes."""
109
+
110
+ if isinstance(other, FixedBytes) and other.length != self.length:
111
+ return False
112
+
113
+ try:
114
+ other_bytes = as_bytes(other)
115
+ except TypeError:
116
+ return NotImplemented
117
+
118
+ return self.value == other_bytes
119
+
120
+ def __hash__(self) -> int:
121
+ return hash(self.value)
122
+
123
+ def __add__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes:
124
+ """Concatenate FixedBytes with another Bytes or bytes literal e.g.
125
+ `FixedBytes[typing.Literal[5]](b"Hello ") + b"World"`."""
126
+ result = self.value + as_bytes(other)
127
+ return _checked_result(result, "+")
128
+
129
+ def __radd__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes:
130
+ """Concatenate FixedBytes with another Bytes or bytes literal e.g. `b"Hello " +
131
+ FixedBytes[typing.Literal[5]](b"World")`."""
132
+ result = as_bytes(other) + self.value
133
+ return _checked_result(result, "+")
134
+
135
+ def __iadd__(self, _other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
136
+ raise TypeError("FixedBytes does not support in-place addition")
137
+
138
+ @property
139
+ def length(self) -> UInt64:
140
+ """Returns the specified length of the FixedBytes."""
141
+ return UInt64(self._length)
142
+
143
+ def __getitem__(self, index: UInt64 | int | slice) -> Bytes:
144
+ """Returns a Bytes containing a single byte if indexed with UInt64 or int
145
+ otherwise the substring of bytes described by the slice."""
146
+ value = self.value[: self.length]
147
+ if isinstance(index, slice):
148
+ return Bytes(value[index])
149
+ else:
150
+ int_index = index.value if isinstance(index, UInt64) else index
151
+ int_index = self.length.value + int_index if int_index < 0 else int_index
152
+ if (int_index >= self.length) or (int_index < 0):
153
+ raise ValueError("FixedBytes index out of range")
154
+ # my_bytes[0:1] => b'j' whereas my_bytes[0] => 106
155
+ return Bytes(value[slice(int_index, int_index + 1)])
156
+
157
+ def __iter__(self) -> Iterator[Bytes]:
158
+ """FixedBytes can be iterated, yielding each consecutive byte."""
159
+ return _FixedBytesIter(self, 1)
160
+
161
+ def __reversed__(self) -> Iterator[Bytes]:
162
+ """FixedBytes can be iterated in reverse, yield each preceding byte starting at
163
+ the end."""
164
+ return _FixedBytesIter(self, -1)
165
+
166
+ @typing.overload
167
+ def __and__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
168
+ @typing.overload
169
+ def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
170
+ def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
171
+ """Compute the bitwise AND of the FixedBytes with another FixedBytes, Bytes, or
172
+ bytes.
173
+
174
+ Returns FixedBytes if other has the same length, otherwise returns Bytes.
175
+ """
176
+ return self._operate_bitwise(other, operator.and_)
177
+
178
+ def __rand__(self, other: bytes) -> Bytes:
179
+ return self & other
180
+
181
+ def __iand__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
182
+ other_bytes = as_bytes(other)
183
+ other_fixed_bytes = self.__class__(other_bytes)
184
+ result = self._operate_bitwise(other_fixed_bytes, operator.and_)
185
+ assert isinstance(result, self.__class__)
186
+ return result
187
+
188
+ @typing.overload
189
+ def __or__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
190
+ @typing.overload
191
+ def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
192
+ def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
193
+ return self._operate_bitwise(other, operator.or_)
194
+
195
+ def __ror__(self, other: bytes) -> Bytes:
196
+ return self | other
197
+
198
+ def __ior__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
199
+ other_bytes = as_bytes(other)
200
+ other_fixed_bytes = self.__class__(other_bytes)
201
+ result = self._operate_bitwise(other_fixed_bytes, operator.or_)
202
+ assert isinstance(result, self.__class__)
203
+ return result
204
+
205
+ @typing.overload
206
+ def __xor__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
207
+ @typing.overload
208
+ def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
209
+ def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
210
+ return self._operate_bitwise(other, operator.xor)
211
+
212
+ def __rxor__(self, other: bytes) -> Bytes:
213
+ return self ^ other
214
+
215
+ def __ixor__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
216
+ other_bytes = as_bytes(other)
217
+ other_fixed_bytes = self.__class__(other_bytes)
218
+ result = self._operate_bitwise(other_fixed_bytes, operator.xor)
219
+ assert isinstance(result, self.__class__)
220
+ return result
221
+
222
+ def __invert__(self) -> typing.Self:
223
+ """Compute the bitwise inversion of the FixedBytes.
224
+
225
+ Returns:
226
+ FixedBytes: The result of the bitwise inversion operation.
227
+ """
228
+ return self.__class__.from_bytes(bytes(~x + 256 for x in self.value))
229
+
230
+ def _operate_bitwise(
231
+ self,
232
+ other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes,
233
+ op: Callable[[int, int], int],
234
+ ) -> typing.Self | Bytes:
235
+ maybe_bytes = as_bytes(other)
236
+ # pad the shorter of self.value and other bytes with leading zero
237
+ # by reversing them as zip_longest fills at the end
238
+
239
+ result = bytes(
240
+ reversed(
241
+ bytes(
242
+ op(a[0], a[1])
243
+ for a in zip_longest(reversed(self.value), reversed(maybe_bytes), fillvalue=0)
244
+ )
245
+ )
246
+ )
247
+ if isinstance(other, FixedBytes) and len(other.value) == len(self.value):
248
+ return self.__class__.from_bytes(result)
249
+ return Bytes(result)
250
+
251
+ def __contains__(self, item: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool:
252
+ item_bytes = as_bytes(item)
253
+ return item_bytes in self.value
254
+
255
+ @classmethod
256
+ def from_base32(cls, value: str) -> typing.Self:
257
+ """Creates FixedBytes from a base32 encoded string e.g.
258
+ `FixedBytes.from_base32("74======")`"""
259
+ bytes_value = base64.b32decode(value)
260
+ c = cls._ensure_class_with_length(bytes_value)
261
+ return c(bytes_value)
262
+
263
+ @classmethod
264
+ def from_base64(cls, value: str) -> typing.Self:
265
+ """Creates FixedBytes from a base64 encoded string e.g.
266
+ `FixedBytes.from_base64("RkY=")`"""
267
+ bytes_value = base64.b64decode(value)
268
+ c = cls._ensure_class_with_length(bytes_value)
269
+ return c(bytes_value)
270
+
271
+ @classmethod
272
+ def from_hex(cls, value: str) -> typing.Self:
273
+ """Creates FixedBytes from a hex/octal encoded string e.g.
274
+ `FixedBytes.from_hex("FF")`"""
275
+ bytes_value = base64.b16decode(value)
276
+ c = cls._ensure_class_with_length(bytes_value)
277
+ return c(bytes_value)
278
+
279
+ @classmethod
280
+ def from_bytes(cls, value: Bytes | bytes) -> typing.Self:
281
+ """Construct an instance from the underlying bytes (no validation)"""
282
+ bytes_value = value.value if isinstance(value, Bytes) else value
283
+ c = cls._ensure_class_with_length(bytes_value)
284
+ result = c()
285
+ result.value = bytes_value
286
+ return result
287
+
288
+ @classmethod
289
+ def _ensure_class_with_length(cls, bytes_value: bytes) -> type[typing.Self]:
290
+ """Returns the appropriate class for the given bytes value.
291
+
292
+ If cls has a fixed _length, returns cls. Otherwise, returns or creates a
293
+ specialized class with the length set to match bytes_value.
294
+ """
295
+ return (
296
+ _get_or_create_class_from_int(cls, len(bytes_value))
297
+ if not hasattr(cls, "_length")
298
+ else cls
299
+ )
300
+
301
+ @property
302
+ def bytes(self) -> Bytes:
303
+ """Get the underlying Bytes."""
304
+ return Bytes(self.value)
305
+
306
+
307
+ class _FixedBytesIter(typing.Generic[_TBytesLength]):
308
+ value: FixedBytes[_TBytesLength]
309
+
310
+ def __init__(self, sequence: FixedBytes[_TBytesLength], step: int = 1):
311
+ self.value = sequence
312
+ self.current = 0 if step > 0 else len(sequence) - 1
313
+ self.step = step
314
+ self.myend = len(sequence) - 1 if step > 0 else 0
315
+
316
+ def __iter__(self) -> typing.Self:
317
+ return self
318
+
319
+ def __next__(self) -> Bytes:
320
+ # if current is one step over the end
321
+ if self.current == self.myend + self.step:
322
+ raise StopIteration
323
+
324
+ self.current += self.step
325
+ return self.value[self.current - self.step]
326
+
327
+
328
+ def _checked_result(result: bytes, op: str) -> Bytes:
329
+ """Ensures `result` is a valid Bytes value.
330
+
331
+ Raises:
332
+ OverflowError: If `result` of `op` is out of bounds
333
+ """
334
+ if len(result) > MAX_BYTES_SIZE:
335
+ raise OverflowError(f"{op} overflows")
336
+ return Bytes(result)
@@ -4,6 +4,7 @@ import inspect
4
4
  import typing
5
5
  from collections.abc import Callable, Sequence
6
6
 
7
+ from _algopy_testing.primitives.fixed_bytes import FixedBytes
7
8
  from _algopy_testing.primitives.uint64 import UInt64
8
9
  from _algopy_testing.utils import get_type_generic_from_int_literal
9
10
 
@@ -62,6 +63,15 @@ def get_native_to_arc4_serializer( # noqa: PLR0911
62
63
  native_to_arc4=lambda n: arc4.UInt64(n.int_),
63
64
  arc4_to_native=lambda a: typ.from_int(a.native),
64
65
  )
66
+ if issubclass(typ, FixedBytes):
67
+ length_type = get_type_generic_from_int_literal(typ._length)
68
+ arc4_static_bytes = arc4.StaticArray[arc4.Byte, length_type] # type: ignore[valid-type]
69
+ return _Serializer(
70
+ arc4_type=arc4_static_bytes,
71
+ native_to_arc4=lambda n: arc4_static_bytes(*[arc4.Byte.from_bytes(e) for e in n]),
72
+ arc4_to_native=lambda a: typ(a.bytes),
73
+ )
74
+
65
75
  if typing.NamedTuple in getattr(typ, "__orig_bases__", []):
66
76
  tuple_fields = tuple(inspect.get_annotations(typ).values())
67
77
  if any(isinstance(f, str) for f in tuple_fields):
@@ -42,11 +42,7 @@ def deserialize(typ: type[_TValue], value: SerializableValue) -> _TValue:
42
42
  if isinstance(value, bytes):
43
43
  raise TypeError("expected int, received bytes")
44
44
  return typ.from_int(value) # type: ignore[return-value]
45
- elif issubclass(typ, BytesBacked):
46
- if isinstance(value, int):
47
- raise TypeError("expected bytes, received int")
48
- return typ.from_bytes(Bytes(value)) # type: ignore[return-value]
49
- elif issubclass(typ, Serializable):
45
+ elif issubclass(typ, BytesBacked | Serializable):
50
46
  if isinstance(value, int):
51
47
  raise TypeError("expected bytes, received int")
52
48
  return typ.from_bytes(value) # type: ignore[return-value]
@@ -70,6 +66,7 @@ def cast_from_bytes(typ: type[_TValue], value: bytes) -> _TValue:
70
66
  serialized = as_int64(serialized)
71
67
  else:
72
68
  serialized = value
69
+
73
70
  return deserialize(typ, serialized)
74
71
 
75
72
 
@@ -103,6 +103,8 @@ def as_bytes(value: object, *, max_size: int = MAX_BYTES_SIZE) -> bytes:
103
103
  pass
104
104
  case _algopy_testing.Bytes(value=bytes_value):
105
105
  pass
106
+ case _algopy_testing.FixedBytes(value=bytes_value):
107
+ pass
106
108
  case _:
107
109
  raise TypeError(f"value must be a bytes or Bytes type, not {type(value).__name__!r}")
108
110
  if len(bytes_value) > max_size:
@@ -23,6 +23,8 @@ from _algopy_testing.utils import generate_random_int
23
23
  if typing.TYPE_CHECKING:
24
24
  import algopy
25
25
 
26
+ _TBytesLength = typing.TypeVar("_TBytesLength", bound=int)
27
+
26
28
 
27
29
  class AVMValueGenerator:
28
30
  """Factory for generating test data for AVM abstractions (uint64, bytes, string,
@@ -198,6 +200,19 @@ class AVMValueGenerator:
198
200
  length = length or MAX_BYTES_SIZE
199
201
  return _algopy_testing.Bytes(secrets.token_bytes(length))
200
202
 
203
+ def fixed_bytes(
204
+ self, fixed_bytes_type: type[algopy.FixedBytes[_TBytesLength]]
205
+ ) -> algopy.FixedBytes[_TBytesLength]:
206
+ """Generate a random fixed byte sequence of a specified length.
207
+
208
+ :param fixed_bytes_type: The FixedBytes type with length parameter (e.g.,
209
+ FixedBytes[typing.Literal[10]]).
210
+ :returns: The randomly generated fixed byte sequence.
211
+ """
212
+ # Extract the length from the type parameter
213
+ length = fixed_bytes_type._length
214
+ return fixed_bytes_type(secrets.token_bytes(length))
215
+
201
216
 
202
217
  def _get_app_id(app: algopy.Application | algopy.UInt64 | int) -> int:
203
218
  from _algopy_testing.models import Application
@@ -19,6 +19,7 @@ from _algopy_testing.primitives import (
19
19
  BigUInt,
20
20
  Bytes,
21
21
  FixedArray,
22
+ FixedBytes,
22
23
  ImmutableArray,
23
24
  ImmutableFixedArray,
24
25
  ReferenceArray,
@@ -49,6 +50,7 @@ __all__ = [
49
50
  "CompiledLogicSig",
50
51
  "Contract",
51
52
  "FixedArray",
53
+ "FixedBytes",
52
54
  "Global",
53
55
  "GlobalState",
54
56
  "ImmutableArray",
@@ -1,3 +1,4 @@
1
+ import typing
1
2
  from collections.abc import Generator
2
3
  from pathlib import Path
3
4
 
@@ -70,17 +71,22 @@ def test_app_args_is_correct_with_simple_args(
70
71
  # act
71
72
 
72
73
  # ensure same execution in AVM runs without errors
73
- get_avm_result("sink", value="hello", arr=[1, 2])
74
+ get_avm_result("sink", value="hello", arr=[1, 2], fixed_bytes=b"test")
74
75
  # then run inside emulator
75
- contract.sink(arc4.String("hello"), UInt8Array(arc4.UInt8(1), arc4.UInt8(2)))
76
+ contract.sink(
77
+ arc4.String("hello"),
78
+ UInt8Array(arc4.UInt8(1), arc4.UInt8(2)),
79
+ algopy.FixedBytes[typing.Literal[4]](b"test"),
80
+ )
76
81
 
77
82
  # assert
78
83
  txn = context.txn.last_active
79
84
  app_args = [txn.app_args(i) for i in range(int(txn.num_app_args))]
80
85
  assert app_args == [
81
- algosdk.abi.Method.from_signature("sink(string,uint8[])void").get_selector(),
86
+ algosdk.abi.Method.from_signature("sink(string,uint8[],byte[4])void").get_selector(),
82
87
  b"\x00\x05hello",
83
88
  b"\x00\x02\x01\x02",
89
+ b"test",
84
90
  ]
85
91
  assert app_args[0] == arc4.arc4_signature(SignaturesContract.sink)
86
92