Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stop rejecting contract instantiation if account holds funds #738

Closed
wants to merge 5 commits into from

Conversation

wojtek-coreum
Copy link
Collaborator

@wojtek-coreum wojtek-coreum commented Dec 7, 2023

Description

Reviewers checklist:

  • Try to write more meaningful comments with clear actions to be taken.
  • Nit-picking should be unblocking. Focus on core issues.

Authors checklist

  • Provide a concise and meaningful description
  • Review the code yourself first, before making the PR.
  • Annotate your PR in places that require explanation.
  • Think and try to split the PR to smaller PR if it is big.

This change is Reviewable

@wojtek-coreum wojtek-coreum requested a review from a team as a code owner December 7, 2023 14:53
@wojtek-coreum wojtek-coreum requested review from dzmitryhil, miladz68 and ysv and removed request for a team December 7, 2023 14:53
Copy link
Collaborator Author

@wojtek-coreum wojtek-coreum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: 0 of 2 files reviewed, 1 unresolved discussion (waiting on @dzmitryhil, @miladz68, and @ysv)


integration-tests/modules/wasm_test.go line 2343 at r1 (raw file):

	})
	requireT.NoError(err)
	requireT.Equal("/cosmos.vesting.v1beta1.DelayedVestingAccount", accountRes.Account.TypeUrl)

I correctly remembered that there is a reason for treating vesting accounts differently. this test fails:

Error Trace:	/home/wojciech/coreum/integration-tests/modules/wasm_test.go:2343
        	Error:      	Not equal: 
        	            	expected: "/cosmos.vesting.v1beta1.DelayedVestingAccount"
        	            	actual  : "/cosmos.auth.v1beta1.BaseAccount"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1 +1 @@
        	            	-/cosmos.vesting.v1beta1.DelayedVestingAccount
        	            	+/cosmos.auth.v1beta1.BaseAccount
        	Test:       	TestVestingToWASMContract
--- FAIL: TestVestingToWASMContract (4.27s)

Copy link
Collaborator Author

@wojtek-coreum wojtek-coreum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: 0 of 3 files reviewed, all discussions resolved (waiting on @dzmitryhil, @miladz68, and @ysv)


integration-tests/modules/wasm_test.go line 2343 at r1 (raw file):

Previously, wojtek-coreum (Wojtek) wrote…

I correctly remembered that there is a reason for treating vesting accounts differently. this test fails:

Error Trace:	/home/wojciech/coreum/integration-tests/modules/wasm_test.go:2343
        	Error:      	Not equal: 
        	            	expected: "/cosmos.vesting.v1beta1.DelayedVestingAccount"
        	            	actual  : "/cosmos.auth.v1beta1.BaseAccount"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1 +1 @@
        	            	-/cosmos.vesting.v1beta1.DelayedVestingAccount
        	            	+/cosmos.auth.v1beta1.BaseAccount
        	Test:       	TestVestingToWASMContract
--- FAIL: TestVestingToWASMContract (4.27s)

Okay, I found a way to overcome this

Copy link
Contributor

@ysv ysv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 1 of 2 files at r1, 2 of 2 files at r2, all commit messages.
Reviewable status: all files reviewed, 8 unresolved discussions (waiting on @dzmitryhil, @miladz68, and @wojtek-coreum)


integration-tests/modules/wasm_test.go line 2152 at r2 (raw file):

	requireT.NoError(err)

	contract, err := chain.Wasm.PredictWASMContractAddress(

is it safe to run this test in parallel with other ?
Because if we instantiate contract in a different test we might have wrong prediction ?


integration-tests/modules/wasm_test.go line 2165 at r2 (raw file):

		FromAddress: admin.String(),
		ToAddress:   contract.String(),
		Amount:      sdk.NewCoins(amount),

I suggest to send different amounts to different addresses
this will make test less error prone


integration-tests/modules/wasm_test.go line 2185 at r2 (raw file):

		},
	)
	requireT.NoError(err)

I think we should assert that our predicted smart contract address is equal to actuall
Otherwise there is no reason to continue tests

requireT.Equal(contractAddr1, contract)

same applies to another places


integration-tests/modules/wasm_test.go line 2185 at r2 (raw file):

		},
	)
	requireT.NoError(err)

shouldn't we check if balance is equal to some value after instantiation ?


integration-tests/modules/wasm_test.go line 2407 at r2 (raw file):

	})
	requireT.NoError(err)
	requireT.Equal("/cosmos.vesting.v1beta1.DelayedVestingAccount", accountRes.Account.TypeUrl)

is there a different acc type for contract ? or they are just auth.BaseAccount ?


integration-tests/modules/wasm_test.go line 2407 at r2 (raw file):
are we sure it is auth.BaseAccount ?

wasm code:

type AccountPruner interface {  
// CleanupExistingAccount handles the cleanup process for balances and data of the given account. The persisted account// type is already reset to base account at this stage.  
// The method returns true when the account address can be reused. Unsupported account types are rejected by returning false  
CleanupExistingAccount(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error)  
}

type is already reset to base account at this stage


integration-tests/modules/wasm_test.go line 2434 at r2 (raw file):

		admin,
		contractAddr,
		moduleswasm.BankSendExecuteWithdrawRequest(amount, recipient),

so funds are fully vested after 30s ?

But another thing I wanted to check is that funds are not vested before vesting period passes. Even though the contract is instantiated

Vector of attack.

  1. airdrop creates vesting accounts
  2. you provide contract address as receiver
  3. once received you instantiate contract
  4. funds are unlocked

x/wasm/types/prunner.go line 14 at r2 (raw file):

// CleanupExistingAccount informs wasm module to reject smart contract instantiation if account exists.
func (ap AccountPruner) CleanupExistingAccount(_ sdk.Context, _ authtypes.AccountI) (bool, error) {
	return true, nil

did we find the reason why they burn vesting accounts ?
I think there was a purpose for this

Copy link
Contributor

@dzmitryhil dzmitryhil left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: all files reviewed, 9 unresolved discussions (waiting on @miladz68 and @wojtek-coreum)


app/app.go line 596 at r2 (raw file):

			&authtypes.BaseAccount{},
			&vestingtypes.ContinuousVestingAccount{},
			&vestingtypes.DelayedVestingAccount{},

What about periodic?

Copy link
Collaborator Author

@wojtek-coreum wojtek-coreum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: all files reviewed, 9 unresolved discussions (waiting on @dzmitryhil, @miladz68, and @ysv)


app/app.go line 596 at r2 (raw file):

Previously, dzmitryhil (Dzmitry Hil) wrote…

What about periodic?

Added, but without test because this account might only be created in genesis


integration-tests/modules/wasm_test.go line 2152 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

is it safe to run this test in parallel with other ?
Because if we instantiate contract in a different test we might have wrong prediction ?

It is safe because it uses Instantiate2 - there is no global counter


integration-tests/modules/wasm_test.go line 2165 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

I suggest to send different amounts to different addresses
this will make test less error prone

Done.


integration-tests/modules/wasm_test.go line 2185 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

I think we should assert that our predicted smart contract address is equal to actuall
Otherwise there is no reason to continue tests

requireT.Equal(contractAddr1, contract)

same applies to another places

Done.


integration-tests/modules/wasm_test.go line 2185 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

shouldn't we check if balance is equal to some value after instantiation ?

Done.


integration-tests/modules/wasm_test.go line 2407 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

is there a different acc type for contract ? or they are just auth.BaseAccount ?

BaseAccount


integration-tests/modules/wasm_test.go line 2407 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

are we sure it is auth.BaseAccount ?

wasm code:

type AccountPruner interface {  
// CleanupExistingAccount handles the cleanup process for balances and data of the given account. The persisted account// type is already reset to base account at this stage.  
// The method returns true when the account address can be reused. Unsupported account types are rejected by returning false  
CleanupExistingAccount(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error)  
}

type is already reset to base account at this stage

yes, it is. Added check fr this.


integration-tests/modules/wasm_test.go line 2434 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

so funds are fully vested after 30s ?

But another thing I wanted to check is that funds are not vested before vesting period passes. Even though the contract is instantiated

Vector of attack.

  1. airdrop creates vesting accounts
  2. you provide contract address as receiver
  3. once received you instantiate contract
  4. funds are unlocked

Added check for this, all is as expected

Copy link
Collaborator Author

@wojtek-coreum wojtek-coreum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: 1 of 3 files reviewed, 9 unresolved discussions (waiting on @dzmitryhil, @miladz68, and @ysv)


x/wasm/types/prunner.go line 14 at r2 (raw file):

Previously, ysv (Yaroslav Savchuk) wrote…

did we find the reason why they burn vesting accounts ?
I think there was a purpose for this

Original burning was introduced here: CosmWasm/wasmd#996
and thn reimplemented here: CosmWasm/wasmd#1003

The only sentence explaining motivation is this:

We had long internal discussions which account types should go into the accept and prune lists and came up with some defaults that support many use cases and are still safe to use.

@ysv
Copy link
Contributor

ysv commented Dec 11, 2023

Closed in #740

@ysv ysv closed this Dec 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants