cross_contract_calls.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::build_solidity;
  3. use soroban_sdk::{IntoVal, Val};
  4. #[test]
  5. fn simple_cross_contract() {
  6. let mut runtime = build_solidity(
  7. r#"contract math {
  8. function max(uint64 a, uint64 b) public returns (uint64) {
  9. if (a > b) {
  10. return a;
  11. } else {
  12. return b;
  13. }
  14. }
  15. }"#,
  16. |_| {},
  17. );
  18. let caller = runtime.deploy_contract(
  19. r#"contract mcaller {
  20. function call_max(
  21. address addr,
  22. uint64 a,
  23. uint64 b
  24. ) public returns (uint64) {
  25. bytes payload = abi.encode("max", a, b);
  26. (bool success, bytes returndata) = addr.call(payload);
  27. uint64 result = abi.decode(returndata, (uint64));
  28. return result;
  29. }
  30. }
  31. "#,
  32. );
  33. let arg: Val = 3_u64.into_val(&runtime.env);
  34. let arg2: Val = 1_u64.into_val(&runtime.env);
  35. let addr = runtime.contracts.first().unwrap();
  36. let res = runtime.invoke_contract(addr, "max", vec![arg, arg2]);
  37. println!("first res {res:?}");
  38. let expected: Val = 3_u64.into_val(&runtime.env);
  39. assert!(expected.shallow_eq(&res));
  40. let res = runtime.invoke_contract(
  41. &caller,
  42. "call_max",
  43. vec![addr.into_val(&runtime.env), arg, arg2],
  44. );
  45. println!("second res {res:?}");
  46. assert!(expected.shallow_eq(&res));
  47. }