Skip to content

Commit 9ce5b29

Browse files
authored
Update KAMT to update the cached root on set_root (#1667)
* test(evm): add a regression test for the recall mint failure See: - recallnet/contracts#98 - filecoin-project/ref-fvm#2116 * chore(dep): update kamt to fix `set_root`
1 parent 50c344c commit 9ce5b29

File tree

7 files changed

+114
-7
lines changed

7 files changed

+114
-7
lines changed

Cargo.lock

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ fvm_shared = "4.6.0"
135135
fvm_ipld_encoding = "0.5.2"
136136
fvm_ipld_blockstore = "0.3.0"
137137
fvm_ipld_hamt = "0.10.2"
138-
fvm_ipld_kamt = "0.4.3"
138+
fvm_ipld_kamt = "0.4.4"
139139
fvm_ipld_amt = { version = "0.7.3" }
140140
fvm_ipld_bitfield = "0.7.0"
141141

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Recall Contract
2+
3+
This directory contains compiled copies of https://github.com/recallnet taken from mainnet contracts.
4+
5+
- Proxy contract: 0xf0438cd20Fa4855997297A9C1299469CA10b58bf
6+
- Implementation contract: 0x1835374384AA51B169c0705DA26A84bB760F2B37
7+
8+
We're using these to reproduce https://github.com/recallnet/contracts/issues/98
9+
10+
These contracts are copyright 2025 the Recall Contributors, available under either the MIT or the Apache-2.0 license.

actors/evm/tests/contracts/recall_contract/implementation.hex

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
60806040526102a88038038061001481610168565b92833981016040828203126101645781516001600160a01b03811692909190838303610164576020810151906001600160401b03821161016457019281601f8501121561016457835161006e610069826101a1565b610168565b9481865260208601936020838301011161016457815f926020809301865e86010152823b15610152577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a282511561013a575f8091610122945190845af43d15610132573d91610113610069846101a1565b9283523d5f602085013e6101bc565b505b604051608d908161021b8239f35b6060916101bc565b50505034156101245763b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761018d57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161018d57601f01601f191660200190565b906101e057508051156101d157805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580610211575b6101f1575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b156101e956fe60806040525f8073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156053573d5ff35b3d5ffdfea2646970667358221220d84369ae6f98a27679b5d10b53558f46164239ede3a4126e04298270c4193fd364736f6c634300081a00330000000000000000000000001835374384aa51b169c0705da26a84bb760f2b3700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044be13f47c000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c341bb76302c76fb57d6fe6c003c4fc68e56cbe5c5a4c04bedf1522a15c7e41a000000000000000000000000000000000000000000000000000000000

integration_tests/src/tests/evm_test.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,94 @@ pub fn evm_staticcall_delegatecall_test(v: &dyn VM) {
712712
}
713713
}
714714

715+
#[allow(non_snake_case)]
716+
#[vm_test]
717+
pub fn evm_constructor_delegatecall_regression_test(v: &dyn VM) {
718+
const IMP_INITCODE: &str =
719+
include_str!("../../../actors/evm/tests/contracts/recall_contract/implementation.hex");
720+
const PROXY_INITCODE: &str =
721+
include_str!("../../../actors/evm/tests/contracts/recall_contract/proxy.hex");
722+
723+
// Create accounts for deployment
724+
let deployer = create_accounts(v, 1, &TokenAmount::from_whole(10_000))[0];
725+
726+
// 1. Deploy the implementation contract
727+
let imp_bytecode = hex::decode(IMP_INITCODE).unwrap();
728+
let imp_deploy_result = v
729+
.execute_message(
730+
&deployer,
731+
&EAM_ACTOR_ADDR,
732+
&TokenAmount::zero(),
733+
fil_actor_eam::Method::CreateExternal as u64,
734+
Some(serialize_ok(&fil_actor_eam::CreateExternalParams(imp_bytecode))),
735+
)
736+
.unwrap();
737+
738+
assert!(
739+
imp_deploy_result.code.is_success(),
740+
"Failed to deploy implementation contract: {}",
741+
imp_deploy_result.message
742+
);
743+
744+
let imp_return: fil_actor_eam::CreateExternalReturn = imp_deploy_result
745+
.ret
746+
.unwrap()
747+
.deserialize()
748+
.expect("Failed to decode implementation deployment results");
749+
750+
// Make sure we deployed an EVM actor
751+
assert_eq!(&v.actor(&Address::new_id(imp_return.actor_id)).unwrap().code, &*EVM_ACTOR_CODE_ID);
752+
753+
// 2. Deploy the proxy contract with implementation address in constructor, replacing the
754+
// mainnet implementation address.
755+
let proxy_initcode_fixed = PROXY_INITCODE.replace(
756+
"1835374384aa51b169c0705da26a84bb760f2b37",
757+
&hex::encode(imp_return.eth_address.0),
758+
);
759+
let proxy_initcode = hex::decode(proxy_initcode_fixed).unwrap();
760+
761+
let proxy_deploy_result = v
762+
.execute_message(
763+
&deployer,
764+
&EAM_ACTOR_ADDR,
765+
&TokenAmount::zero(),
766+
fil_actor_eam::Method::CreateExternal as u64,
767+
Some(serialize_ok(&fil_actor_eam::CreateExternalParams(proxy_initcode))),
768+
)
769+
.unwrap();
770+
771+
assert!(
772+
proxy_deploy_result.code.is_success(),
773+
"Failed to deploy proxy contract: {}",
774+
proxy_deploy_result.message
775+
);
776+
777+
let proxy_return: fil_actor_eam::CreateExternalReturn = proxy_deploy_result
778+
.ret
779+
.unwrap()
780+
.deserialize()
781+
.expect("Failed to decode proxy deployment results");
782+
783+
let proxy_robust_addr = proxy_return.robust_address.unwrap();
784+
785+
// Try to mint:
786+
const PARAMS: &str = "40c10f1900000000000000000000000090f79bf6eb2c4f870365e785982e1f101e93b9060000000000000000000000000000000000000000000000008ac7230489e80000";
787+
let params = hex::decode(PARAMS).unwrap();
788+
789+
let mint_result = v
790+
.execute_message(
791+
&deployer,
792+
&proxy_robust_addr,
793+
&TokenAmount::zero(),
794+
fil_actor_evm::Method::InvokeContract as u64,
795+
Some(serialize_ok(&ContractParams(params))),
796+
)
797+
.unwrap();
798+
799+
assert!(mint_result.code.is_success(), "Failed to mint: {}", mint_result.message);
800+
}
801+
802+
#[allow(non_snake_case)]
715803
#[vm_test]
716804
pub fn evm_init_revert_data_test(v: &dyn VM) {
717805
let account = create_accounts(v, 1, &TokenAmount::from_whole(10_000))[0];

test_vm/tests/suite/evm_test.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use fil_actors_integration_tests::tests::{
2-
evm_call_test, evm_create_test, evm_delegatecall_test, evm_empty_initcode_test,
3-
evm_eth_create_external_test, evm_init_revert_data_test, evm_staticcall_delegatecall_test,
4-
evm_staticcall_test, evm_transient_nested_test, evm_transient_reentry_test,
2+
evm_call_test, evm_constructor_delegatecall_regression_test, evm_create_test,
3+
evm_delegatecall_test, evm_empty_initcode_test, evm_eth_create_external_test,
4+
evm_init_revert_data_test, evm_staticcall_delegatecall_test, evm_staticcall_test,
5+
evm_transient_nested_test, evm_transient_reentry_test,
56
};
67
use fil_actors_runtime::test_blockstores::MemoryBlockstore;
78
use test_vm::TestVM;
@@ -54,6 +55,13 @@ fn evm_staticcall_delegatecall() {
5455
evm_staticcall_delegatecall_test(&v);
5556
}
5657

58+
#[test]
59+
fn evm_constructor_delegatecall_regression() {
60+
let store = MemoryBlockstore::new();
61+
let v = TestVM::new_with_singletons(store);
62+
evm_constructor_delegatecall_regression_test(&v);
63+
}
64+
5765
#[test]
5866
fn evm_init_revert_data() {
5967
let store = MemoryBlockstore::new();

0 commit comments

Comments
 (0)