accessor.rs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::{build_solidity, BorshToken};
  3. use num_bigint::BigInt;
  4. use num_traits::One;
  5. #[test]
  6. fn types() {
  7. let mut vm = build_solidity(
  8. r#"
  9. contract foo {
  10. int64 public f1 = 102;
  11. }"#,
  12. );
  13. let data_account = vm.initialize_data_account();
  14. vm.function("new")
  15. .accounts(vec![("dataAccount", data_account)])
  16. .call();
  17. let returns = vm
  18. .function("f1")
  19. .accounts(vec![("dataAccount", data_account)])
  20. .call()
  21. .unwrap();
  22. assert_eq!(
  23. returns,
  24. BorshToken::Int {
  25. width: 64,
  26. value: BigInt::from(102u8),
  27. }
  28. );
  29. let mut vm = build_solidity(
  30. r#"
  31. contract foo {
  32. int64[4] public f1 = [1,3,5,7];
  33. }"#,
  34. );
  35. let data_account = vm.initialize_data_account();
  36. vm.function("new")
  37. .accounts(vec![("dataAccount", data_account)])
  38. .call();
  39. let returns = vm
  40. .function("f1")
  41. .arguments(&[BorshToken::Uint {
  42. width: 256,
  43. value: BigInt::from(2u8),
  44. }])
  45. .accounts(vec![("dataAccount", data_account)])
  46. .call()
  47. .unwrap();
  48. assert_eq!(
  49. returns,
  50. BorshToken::Int {
  51. width: 64,
  52. value: BigInt::from(5u8)
  53. }
  54. );
  55. let mut vm = build_solidity(
  56. r#"
  57. contract foo {
  58. int64[4][2] public f1;
  59. constructor() {
  60. f1[1][0] = 4;
  61. f1[1][1] = 3;
  62. f1[1][2] = 2;
  63. f1[1][3] = 1;
  64. }
  65. }"#,
  66. );
  67. let data_account = vm.initialize_data_account();
  68. vm.function("new")
  69. .accounts(vec![("dataAccount", data_account)])
  70. .call();
  71. let returns = vm
  72. .function("f1")
  73. .arguments(&[
  74. BorshToken::Uint {
  75. width: 256,
  76. value: BigInt::one(),
  77. },
  78. BorshToken::Uint {
  79. width: 256,
  80. value: BigInt::from(2u8),
  81. },
  82. ])
  83. .accounts(vec![("dataAccount", data_account)])
  84. .call()
  85. .unwrap();
  86. assert_eq!(
  87. returns,
  88. BorshToken::Int {
  89. width: 64,
  90. value: BigInt::from(2u8),
  91. }
  92. );
  93. let mut vm = build_solidity(
  94. r#"
  95. contract foo {
  96. mapping(int64 => uint64) public f1;
  97. constructor() {
  98. f1[2000] = 1;
  99. f1[4000] = 2;
  100. }
  101. }"#,
  102. );
  103. let data_account = vm.initialize_data_account();
  104. vm.function("new")
  105. .accounts(vec![("dataAccount", data_account)])
  106. .call();
  107. let returns = vm
  108. .function("f1")
  109. .arguments(&[BorshToken::Int {
  110. width: 64,
  111. value: BigInt::from(4000u16),
  112. }])
  113. .accounts(vec![("dataAccount", data_account)])
  114. .call()
  115. .unwrap();
  116. assert_eq!(
  117. returns,
  118. BorshToken::Uint {
  119. width: 64,
  120. value: BigInt::from(2u8)
  121. }
  122. );
  123. }
  124. #[test]
  125. fn interfaces() {
  126. let mut vm = build_solidity(
  127. r#"
  128. contract foo is bar {
  129. bytes2 public f1 = "ab";
  130. }
  131. interface bar {
  132. function f1() external returns (bytes2);
  133. }
  134. "#,
  135. );
  136. let data_account = vm.initialize_data_account();
  137. vm.function("new")
  138. .accounts(vec![("dataAccount", data_account)])
  139. .call();
  140. let returns = vm
  141. .function("f1")
  142. .accounts(vec![("dataAccount", data_account)])
  143. .call()
  144. .unwrap();
  145. assert_eq!(returns, BorshToken::uint8_fixed_array(b"ab".to_vec()));
  146. }
  147. #[test]
  148. fn constant() {
  149. let mut vm = build_solidity(
  150. r#"
  151. contract x {
  152. bytes32 public constant z = keccak256("hey man");
  153. }"#,
  154. );
  155. let data_account = vm.initialize_data_account();
  156. vm.function("new")
  157. .accounts(vec![("dataAccount", data_account)])
  158. .call();
  159. let returns = vm
  160. .function("z")
  161. .accounts(vec![("dataAccount", data_account)])
  162. .call()
  163. .unwrap();
  164. assert_eq!(
  165. returns,
  166. BorshToken::uint8_fixed_array(vec![
  167. 0, 91, 121, 69, 17, 39, 209, 87, 169, 94, 81, 10, 68, 17, 183, 52, 82, 28, 128, 159,
  168. 31, 73, 168, 235, 90, 61, 46, 198, 102, 241, 168, 79
  169. ])
  170. );
  171. let mut vm = build_solidity(
  172. r#"
  173. contract x {
  174. bytes32 public constant z = sha256("hey man");
  175. }"#,
  176. );
  177. let data_account = vm.initialize_data_account();
  178. vm.function("new")
  179. .accounts(vec![("dataAccount", data_account)])
  180. .call();
  181. let returns = vm
  182. .function("z")
  183. .accounts(vec![("dataAccount", data_account)])
  184. .call()
  185. .unwrap();
  186. assert_eq!(
  187. returns,
  188. BorshToken::uint8_fixed_array(vec![
  189. 190, 212, 99, 127, 110, 196, 102, 135, 47, 156, 116, 193, 201, 43, 100, 230, 152, 184,
  190. 58, 103, 63, 106, 217, 142, 143, 211, 220, 125, 255, 210, 48, 89
  191. ])
  192. );
  193. let mut vm = build_solidity(
  194. r#"
  195. contract x {
  196. bytes20 public constant z = ripemd160("hey man");
  197. }"#,
  198. );
  199. let data_account = vm.initialize_data_account();
  200. vm.function("new")
  201. .accounts(vec![("dataAccount", data_account)])
  202. .call();
  203. let returns = vm
  204. .function("z")
  205. .accounts(vec![("dataAccount", data_account)])
  206. .call()
  207. .unwrap();
  208. assert_eq!(
  209. returns,
  210. BorshToken::uint8_fixed_array(vec![
  211. 255, 206, 178, 91, 165, 156, 178, 193, 7, 94, 233, 48, 117, 76, 48, 215, 255, 45, 61,
  212. 225
  213. ])
  214. );
  215. }
  216. #[test]
  217. fn struct_accessor() {
  218. let mut vm = build_solidity(
  219. r#"
  220. contract C {
  221. struct E {
  222. bytes4 b4;
  223. }
  224. struct S {
  225. int64 f1;
  226. bool f2;
  227. E f3;
  228. }
  229. S public a = S({f1: -63, f2: false, f3: E("nuff")});
  230. S[100] public s;
  231. mapping(int => S) public m;
  232. E public constant e = E("cons");
  233. constructor() {
  234. s[99] = S({f1: 65535, f2: true, f3: E("naff")});
  235. m[1023413412] = S({f1: 414243, f2: true, f3: E("niff")});
  236. }
  237. function f() public view {
  238. (int64 a1, bool b, E memory c) = this.a();
  239. require(a1 == -63 && !b && c.b4 == "nuff", "a");
  240. (a1, b, c) = this.s(99);
  241. require(a1 == 65535 && b && c.b4 == "naff", "b");
  242. (a1, b, c) = this.m(1023413412);
  243. require(a1 == 414243 && b && c.b4 == "niff", "c");
  244. c.b4 = this.e();
  245. require(a1 == 414243 && b && c.b4 == "cons", "E");
  246. }
  247. }"#,
  248. );
  249. let data_account = vm.initialize_data_account();
  250. vm.function("new")
  251. .accounts(vec![("dataAccount", data_account)])
  252. .call();
  253. vm.function("f")
  254. .accounts(vec![
  255. ("dataAccount", data_account),
  256. ("systemProgram", [0; 32]),
  257. ])
  258. .call();
  259. }