account_serialization.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::borsh_encoding::BorshToken;
  3. use crate::{account_new, build_solidity, AccountMeta, AccountState, Pubkey};
  4. #[test]
  5. fn deserialize_duplicate_account() {
  6. let mut vm = build_solidity(
  7. r#"
  8. contract Testing {
  9. function check_deserialization(address my_address) public view {
  10. assert(tx.accounts[1].key == tx.accounts[2].key);
  11. assert(tx.accounts[1].is_signer == tx.accounts[2].is_signer);
  12. assert(tx.accounts[1].is_writable == tx.accounts[2].is_writable);
  13. assert(my_address == tx.program_id);
  14. }
  15. }
  16. "#,
  17. );
  18. let data_account = vm.initialize_data_account();
  19. vm.function("new")
  20. .accounts(vec![("dataAccount", data_account)])
  21. .call();
  22. let random_key = account_new();
  23. vm.account_data.insert(
  24. random_key,
  25. AccountState {
  26. data: vec![],
  27. owner: None,
  28. lamports: 0,
  29. },
  30. );
  31. let other_key = account_new();
  32. vm.account_data.insert(
  33. other_key,
  34. AccountState {
  35. data: vec![],
  36. owner: None,
  37. lamports: 0,
  38. },
  39. );
  40. let program_id = vm.stack[0].id;
  41. vm.function("check_deserialization")
  42. .arguments(&[BorshToken::Address(program_id)])
  43. .accounts(vec![("dataAccount", data_account)])
  44. .remaining_accounts(&[
  45. AccountMeta {
  46. pubkey: Pubkey(random_key),
  47. is_signer: true,
  48. is_writable: false,
  49. },
  50. AccountMeta {
  51. pubkey: Pubkey(random_key),
  52. is_signer: true,
  53. is_writable: false,
  54. },
  55. ])
  56. .call();
  57. }
  58. #[test]
  59. fn more_than_10_accounts() {
  60. let mut vm = build_solidity(
  61. r#"
  62. contract Testing {
  63. function check_deserialization(address my_address) public view {
  64. // This assertion ensure the padding is correctly added when
  65. // deserializing accounts
  66. assert(my_address == tx.program_id);
  67. }
  68. }
  69. "#,
  70. );
  71. let data_account = vm.initialize_data_account();
  72. vm.function("new")
  73. .accounts(vec![("dataAccount", data_account)])
  74. .call();
  75. let mut metas: Vec<AccountMeta> = Vec::new();
  76. for i in 0..11 {
  77. let account = account_new();
  78. metas.push(AccountMeta {
  79. pubkey: Pubkey(account),
  80. is_writable: i % 2 == 0,
  81. is_signer: i % 2 == 1,
  82. });
  83. vm.account_data.insert(
  84. account,
  85. AccountState {
  86. data: vec![],
  87. owner: None,
  88. lamports: 0,
  89. },
  90. );
  91. }
  92. metas.push(metas[3].clone());
  93. let account = account_new();
  94. metas.push(AccountMeta {
  95. pubkey: Pubkey(account),
  96. is_signer: false,
  97. is_writable: false,
  98. });
  99. vm.account_data.insert(
  100. account,
  101. AccountState {
  102. data: vec![],
  103. owner: None,
  104. lamports: 0,
  105. },
  106. );
  107. let program_id = vm.stack[0].id;
  108. vm.function("check_deserialization")
  109. .arguments(&[BorshToken::Address(program_id)])
  110. .accounts(vec![("dataAccount", data_account)])
  111. .remaining_accounts(&metas)
  112. .call();
  113. }