@@ -75,35 +75,45 @@ const MAX_UINT64 = ethers.BigNumber.from("18446744073709551615") // 2^64 - 1
7575 */
7676
7777/**
78- * Creates a Smock fake for TokenStaking contract with mocked authorization data.
79- * Used in Pre-Upgrade and Upgrade Flow tests to simulate stake authorization
80- * without using deprecated TokenStaking.stake() and increaseAuthorization() methods.
78+ * Sets up real TokenStaking authorization for a staking provider using actual
79+ * contract calls instead of smock.fake. This avoids a known smock issue where
80+ * smock.fake({address: existingAddress}) corrupts EVM storage in a way that
81+ * evm_revert cannot restore, breaking subsequent test suites.
8182 *
82- * TIP-092 Context: Real TokenStaking contract has no write methods for test setup,
83- * so we mock the read methods (authorizedStake, rolesOf) to return expected values.
84- *
85- * @param stakingAddress - Address of the deployed TokenStaking contract to fake
86- * @param minimumAuthorization - Amount to return from authorizedStake() calls
87- * @param stakingProvider - Address to return as owner/authorizer in rolesOf()
88- * @param beneficiary - Address to return as beneficiary in rolesOf()
89- * @returns Configured FakeContract<TokenStaking>
83+ * @param t - T token contract for minting
84+ * @param staking - TokenStaking contract
85+ * @param walletRegistry - WalletRegistry contract (application to authorize)
86+ * @param deployer - Deployer signer (can mint tokens)
87+ * @param stakingProvider - Staking provider signer
88+ * @param beneficiary - Beneficiary signer
89+ * @param amount - Amount to stake and authorize
9090 */
91- async function createTokenStakingFake (
92- stakingAddress : string ,
93- minimumAuthorization : any ,
91+ async function setupRealStaking (
92+ t : T ,
93+ staking : TokenStaking ,
94+ walletRegistry : WalletRegistry ,
95+ deployer : SignerWithAddress ,
9496 stakingProvider : SignerWithAddress ,
95- beneficiary : SignerWithAddress
96- ) : Promise < FakeContract < TokenStaking > > {
97- const stakingFake = await smock . fake < TokenStaking > ( "TokenStaking" , {
98- address : stakingAddress ,
99- } )
100- stakingFake . authorizedStake . returns ( minimumAuthorization )
101- stakingFake . rolesOf . returns ( [
102- stakingProvider . address ,
103- beneficiary . address ,
104- stakingProvider . address ,
105- ] )
106- return stakingFake
97+ beneficiary : SignerWithAddress ,
98+ amount : any
99+ ) : Promise < void > {
100+ await t . connect ( deployer ) . mint ( stakingProvider . address , amount )
101+ await t . connect ( stakingProvider ) . approve ( staking . address , amount )
102+ await staking
103+ . connect ( stakingProvider )
104+ . stake (
105+ stakingProvider . address ,
106+ beneficiary . address ,
107+ stakingProvider . address ,
108+ amount
109+ )
110+ await staking
111+ . connect ( stakingProvider )
112+ . increaseAuthorization (
113+ stakingProvider . address ,
114+ walletRegistry . address ,
115+ amount
116+ )
107117}
108118
109119/**
@@ -3729,11 +3739,16 @@ describe("WalletRegistry - Migration Scenario Tests (TIP-092)", () => {
37293739 const stakedAmount = to1e18 ( 1000000 ) // 1M T
37303740
37313741 before ( "load test fixture" , async ( ) => {
3732- await createSnapshot ( )
3733-
3734- // Deploy fixture in default TokenStaking mode
3742+ // Deploy fixture BEFORE taking snapshot. The order matters because
3743+ // deployments.fixture() caches an internal EVM snapshot. If we took
3744+ // our snapshot first (lower ID), restoreSnapshot() would call
3745+ // evm_revert(lowerID) which invalidates ALL snapshots with higher IDs
3746+ // — including the deploy cache. This would break deployments.fixture()
3747+ // for all subsequent test suites (e.g., Slashing, WalletCreation).
37353748 await deployments . fixture ( )
37363749
3750+ await createSnapshot ( )
3751+
37373752 t = await helpers . contracts . getContract ( "T" )
37383753 walletRegistry = await helpers . contracts . getContract ( "WalletRegistry" )
37393754 sortitionPool = await helpers . contracts . getContract ( "EcdsaSortitionPool" )
@@ -3770,31 +3785,24 @@ describe("WalletRegistry - Migration Scenario Tests (TIP-092)", () => {
37703785 * Coverage: Tests the false branch of ternary operator in _currentAuthorizationSource()
37713786 */
37723787 describe ( "Pre-Upgrade Mode (TokenStaking Authorization)" , ( ) => {
3773- let stakingFake : FakeContract < TokenStaking >
3774-
37753788 before ( async ( ) => {
37763789 await createSnapshot ( )
37773790
3778- // Setup: Mock TokenStaking authorization using Smock fake
3779- stakingFake = await createTokenStakingFake (
3780- staking . address ,
3781- minimumAuthorization ,
3791+ // Setup: Use real TokenStaking for authorization (avoids smock.fake
3792+ // storage corruption that breaks evm_revert for subsequent tests)
3793+ await setupRealStaking (
3794+ t ,
3795+ staking ,
3796+ walletRegistry ,
3797+ deployer ,
37823798 stakingProvider ,
3783- beneficiary
3799+ beneficiary ,
3800+ minimumAuthorization
37843801 )
37853802
37863803 // Setup: Deactivate chaosnet to allow operators to join sortition pool
37873804 await deactivateChaosnetMode ( sortitionPool )
37883805
3789- // Setup: Trigger authorization callback for staking provider
3790- await triggerAuthorizationCallback (
3791- walletRegistry ,
3792- staking . address ,
3793- stakingProvider . address ,
3794- ethers . BigNumber . from ( 0 ) ,
3795- minimumAuthorization
3796- )
3797-
37983806 // Setup: Register operator with authorized stake
37993807 await walletRegistry
38003808 . connect ( stakingProvider )
@@ -3979,17 +3987,19 @@ describe("WalletRegistry - Migration Scenario Tests (TIP-092)", () => {
39793987 */
39803988 describe ( "NOT MIGRATED Touchpoints" , ( ) => {
39813989 let allowlist : FakeContract < IStaking >
3982- let stakingFake : FakeContract < TokenStaking >
39833990
39843991 before ( async ( ) => {
39853992 await createSnapshot ( )
39863993
3987- // Setup: Mock TokenStaking for beneficiary lookup (NOT migrated to Allowlist)
3988- stakingFake = await createTokenStakingFake (
3989- staking . address ,
3990- minimumAuthorization ,
3994+ // Setup: Use real TokenStaking for beneficiary roles (NOT migrated to Allowlist)
3995+ await setupRealStaking (
3996+ t ,
3997+ staking ,
3998+ walletRegistry ,
3999+ deployer ,
39914000 stakingProvider ,
3992- beneficiary
4001+ beneficiary ,
4002+ minimumAuthorization
39934003 )
39944004
39954005 // Setup: Create allowlist fake and upgrade (but beneficiary still in TokenStaking)
@@ -4043,31 +4053,24 @@ describe("WalletRegistry - Migration Scenario Tests (TIP-092)", () => {
40434053 */
40444054 describe ( "Upgrade Flow" , ( ) => {
40454055 let allowlist : FakeContract < IStaking >
4046- let stakingFake : FakeContract < TokenStaking >
40474056
40484057 before ( async ( ) => {
40494058 await createSnapshot ( )
40504059
4051- // Setup: Mock TokenStaking authorization (pre-upgrade state)
4052- stakingFake = await createTokenStakingFake (
4053- staking . address ,
4054- minimumAuthorization ,
4060+ // Setup: Use real TokenStaking authorization (pre-upgrade state)
4061+ await setupRealStaking (
4062+ t ,
4063+ staking ,
4064+ walletRegistry ,
4065+ deployer ,
40554066 stakingProvider ,
4056- beneficiary
4067+ beneficiary ,
4068+ minimumAuthorization
40574069 )
40584070
40594071 // Setup: Deactivate chaosnet to allow operators to join sortition pool
40604072 await deactivateChaosnetMode ( sortitionPool )
40614073
4062- // Setup: Trigger authorization callback for staking provider (pre-upgrade)
4063- await triggerAuthorizationCallback (
4064- walletRegistry ,
4065- staking . address ,
4066- stakingProvider . address ,
4067- ethers . BigNumber . from ( 0 ) ,
4068- minimumAuthorization
4069- )
4070-
40714074 // Setup: Register operator and join pool (before upgrade)
40724075 await walletRegistry
40734076 . connect ( stakingProvider )
0 commit comments