test_vaa_verify.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import pytest
  2. import coincurve
  3. from algosdk.future import transaction
  4. from algosdk.error import AlgodHTTPError
  5. from algosdk.logic import get_application_address
  6. from Cryptodome.Hash import keccak
  7. @pytest.fixture(scope='module')
  8. def app_id(portal_core, client, creator):
  9. return portal_core.createTestApp(client,creator)
  10. @pytest.fixture(scope='module')
  11. def signers(gen_test):
  12. return bytes.fromhex("".join(gen_test.guardianKeys))
  13. @pytest.fixture(scope='module')
  14. def signers_private_keys(gen_test):
  15. return gen_test.guardianPrivKeys
  16. @pytest.fixture(scope='module')
  17. def hash():
  18. return keccak.new(digest_bits=256).update(b"42").digest()
  19. @pytest.fixture(scope='module')
  20. def incorrect_hash():
  21. return keccak.new(digest_bits=256).update(b"error").digest()
  22. @pytest.fixture
  23. def signatures(gen_test,signers_private_keys, hash):
  24. signatures = ""
  25. for i in range(len(signers_private_keys)):
  26. signatures += gen_test.encoder("uint8", i)
  27. key = coincurve.PrivateKey(bytes.fromhex(signers_private_keys[i]))
  28. signature = key.sign_recoverable(hash, hasher=None)
  29. signatures += signature.hex()
  30. return bytes.fromhex(signatures)
  31. def tests_rejection_on_rekey(client, portal_core, creator, vaa_verify_lsig, app_id):
  32. with pytest.raises(AlgodHTTPError):
  33. doubleFee = client.suggested_params()
  34. doubleFee.flat_fee = True
  35. doubleFee.fee = 2000
  36. feePayment = transaction.PaymentTxn(
  37. sender=creator.getAddress(),
  38. receiver=creator.getAddress(),
  39. amt=0,
  40. sp=doubleFee
  41. )
  42. zeroFee = client.suggested_params()
  43. zeroFee.flat_fee = True
  44. zeroFee.fee = 0
  45. noop = transaction.ApplicationCallTxn(
  46. index=app_id,
  47. sender=vaa_verify_lsig.address(),
  48. sp=zeroFee,
  49. rekey_to=get_application_address(app_id),
  50. on_complete=transaction.OnComplete.NoOpOC
  51. )
  52. transaction.assign_group_id([feePayment, noop])
  53. signedFeePayment = feePayment.sign(creator.getPrivateKey())
  54. signedNoop = transaction.LogicSigTransaction(lsig=vaa_verify_lsig, transaction=noop)
  55. client.send_transactions([signedFeePayment, signedNoop])
  56. portal_core.waitForTransaction(client, signedNoop.get_txid())
  57. def tests_rejection_on_non_app_call(client, portal_core, creator, vaa_verify_lsig):
  58. with pytest.raises(AlgodHTTPError):
  59. doubleFee = client.suggested_params()
  60. doubleFee.flat_fee = True
  61. doubleFee.fee = 2000
  62. feePayment = transaction.PaymentTxn(
  63. sender=creator.getAddress(),
  64. receiver=creator.getAddress(),
  65. amt=0,
  66. sp=doubleFee
  67. )
  68. zeroFee = client.suggested_params()
  69. zeroFee.flat_fee = True
  70. zeroFee.fee = 0
  71. payment = transaction.PaymentTxn(
  72. sender=vaa_verify_lsig.address(),
  73. receiver=vaa_verify_lsig.address(),
  74. amt=0,
  75. sp=zeroFee,
  76. )
  77. transaction.assign_group_id([feePayment, payment])
  78. signedFeePayment = feePayment.sign(creator.getPrivateKey())
  79. signedPayment = transaction.LogicSigTransaction(lsig=vaa_verify_lsig, transaction=payment)
  80. client.send_transactions([signedFeePayment, signedPayment])
  81. portal_core.waitForTransaction(client, signedPayment.get_txid())
  82. def tests_rejection_on_zero_fee(client, portal_core, vaa_verify_lsig, app_id, signatures, hash, signers, suggested_params):
  83. with pytest.raises(AlgodHTTPError):
  84. noop = transaction.ApplicationCallTxn(
  85. index=app_id,
  86. sender=vaa_verify_lsig.address(),
  87. sp=suggested_params,
  88. on_complete=transaction.OnComplete.NoOpOC,
  89. app_args=[b"nop", signatures, signers, hash]
  90. )
  91. signedNoop = transaction.LogicSigTransaction(lsig=vaa_verify_lsig, transaction=noop)
  92. client.send_transaction(signedNoop)
  93. portal_core.waitForTransaction(client, signedNoop.get_txid())
  94. def tests_rejection_on_hash_not_signed(client, portal_core, creator, vaa_verify_lsig, app_id, signatures, incorrect_hash, signers):
  95. with pytest.raises(AlgodHTTPError):
  96. doubleFee = client.suggested_params()
  97. doubleFee.flat_fee = True
  98. doubleFee.fee = 2000
  99. feePayment = transaction.PaymentTxn(
  100. sender=creator.getAddress(),
  101. receiver=creator.getAddress(),
  102. amt=0,
  103. sp=doubleFee
  104. )
  105. zeroFee = client.suggested_params()
  106. zeroFee.flat_fee = True
  107. zeroFee.fee = 0
  108. noop = transaction.ApplicationCallTxn(
  109. index=app_id,
  110. sender=vaa_verify_lsig.address(),
  111. sp=zeroFee,
  112. on_complete=transaction.OnComplete.NoOpOC,
  113. app_args=[b"nop", signatures, signers, incorrect_hash]
  114. )
  115. transaction.assign_group_id([feePayment, noop])
  116. signedFeePayment = feePayment.sign(creator.getPrivateKey())
  117. signedNoop = transaction.LogicSigTransaction(lsig=vaa_verify_lsig, transaction=noop)
  118. client.send_transactions([signedFeePayment, signedNoop])
  119. portal_core.waitForTransaction(client, signedNoop.get_txid())
  120. def tests_success(client, portal_core, creator, vaa_verify_lsig, app_id, signatures, hash, signers):
  121. doubleFee = client.suggested_params()
  122. doubleFee.flat_fee = True
  123. doubleFee.fee = 2000
  124. feePayment = transaction.PaymentTxn(
  125. sender=creator.getAddress(),
  126. receiver=creator.getAddress(),
  127. amt=0,
  128. sp=doubleFee
  129. )
  130. zeroFee = client.suggested_params()
  131. zeroFee.flat_fee = True
  132. zeroFee.fee = 0
  133. noop = transaction.ApplicationCallTxn(
  134. index=app_id,
  135. sender=vaa_verify_lsig.address(),
  136. sp=zeroFee,
  137. on_complete=transaction.OnComplete.NoOpOC,
  138. app_args=[b"nop", signatures, signers, hash]
  139. )
  140. transaction.assign_group_id([feePayment, noop])
  141. signedFeePayment = feePayment.sign(creator.getPrivateKey())
  142. signedNoop = transaction.LogicSigTransaction(lsig=vaa_verify_lsig, transaction=noop)
  143. client.send_transactions([signedFeePayment, signedNoop])
  144. portal_core.waitForTransaction(client, signedNoop.get_txid())