events.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::build_solidity;
  3. use borsh::BorshDeserialize;
  4. use sha2::{Digest, Sha256};
  5. #[test]
  6. fn simple_event() {
  7. #[derive(BorshDeserialize, PartialEq, Eq, Debug)]
  8. struct MyEvent {
  9. a: i32,
  10. b: i32,
  11. }
  12. let mut vm = build_solidity(
  13. r#"
  14. contract c {
  15. event myevent(int32 indexed a, int32 b);
  16. function go() public {
  17. emit myevent(1, -2);
  18. }
  19. }"#,
  20. );
  21. let data_account = vm.initialize_data_account();
  22. vm.function("new")
  23. .accounts(vec![("dataAccount", data_account)])
  24. .call();
  25. vm.function("go").call();
  26. assert_eq!(vm.events.len(), 1);
  27. assert_eq!(vm.events[0].len(), 1);
  28. let encoded = &vm.events[0][0];
  29. let discriminator = calculate_discriminator("myevent");
  30. assert_eq!(&encoded[..8], &discriminator[..]);
  31. let decoded = MyEvent::try_from_slice(&encoded[8..]).unwrap();
  32. assert_eq!(decoded.a, 1);
  33. assert_eq!(decoded.b, -2);
  34. }
  35. #[test]
  36. fn less_simple_event() {
  37. #[derive(BorshDeserialize, PartialEq, Eq, Debug)]
  38. struct S {
  39. f1: i64,
  40. f2: bool,
  41. }
  42. #[derive(BorshDeserialize, PartialEq, Eq, Debug)]
  43. struct MyOtherEvent {
  44. a: i16,
  45. b: String,
  46. c: [i128; 2],
  47. d: S,
  48. }
  49. let mut vm = build_solidity(
  50. r#"
  51. contract c {
  52. struct S {
  53. int64 f1;
  54. bool f2;
  55. }
  56. event MyOtherEvent(
  57. int16 indexed a,
  58. string indexed b,
  59. uint128[2] indexed c,
  60. S d);
  61. function go() public {
  62. emit MyOtherEvent(-102, "foobar", [55431, 7452], S({ f1: 102, f2: true}));
  63. }
  64. }"#,
  65. );
  66. let data_account = vm.initialize_data_account();
  67. vm.function("new")
  68. .accounts(vec![("dataAccount", data_account)])
  69. .call();
  70. vm.function("go").call();
  71. assert_eq!(vm.events.len(), 1);
  72. assert_eq!(vm.events[0].len(), 1);
  73. let encoded = &vm.events[0][0];
  74. let discriminator = calculate_discriminator("MyOtherEvent");
  75. assert_eq!(&encoded[..8], &discriminator[..]);
  76. let decoded = MyOtherEvent::try_from_slice(&encoded[8..]).unwrap();
  77. assert_eq!(decoded.a, -102);
  78. assert_eq!(decoded.b, "foobar");
  79. assert_eq!(decoded.c, [55431, 7452]);
  80. assert_eq!(decoded.d, S { f1: 102, f2: true });
  81. }
  82. fn calculate_discriminator(event_name: &str) -> Vec<u8> {
  83. let image = format!("event:{event_name}");
  84. let mut hasher = Sha256::new();
  85. hasher.update(image.as_bytes());
  86. let finalized = hasher.finalize();
  87. finalized[..8].to_vec()
  88. }