Skip to content

Commit

Permalink
add test case for recursive transfer via function argument
Browse files Browse the repository at this point in the history
turbolent authored and SupunS committed Jul 11, 2023
1 parent 5246348 commit fba2918
Showing 1 changed file with 108 additions and 1 deletion.
109 changes: 108 additions & 1 deletion runtime/runtime_test.go
Original file line number Diff line number Diff line change
@@ -8639,7 +8639,7 @@ func TestInvalidatedResourceUse2(t *testing.T) {
require.ErrorAs(t, err, &destroyedResourceErr)
}

func TestRuntimeInvalidRecursiveTransfer(t *testing.T) {
func TestRuntimeInvalidRecursiveTransferViaVariableDeclaration(t *testing.T) {

t.Parallel()

@@ -8752,3 +8752,110 @@ func TestRuntimeInvalidRecursiveTransfer(t *testing.T) {

require.ErrorAs(t, err, &interpreter.RecursiveTransferError{})
}

func TestRuntimeInvalidRecursiveTransferViaFunctionArgument(t *testing.T) {

t.Parallel()

runtime := newTestInterpreterRuntime()
runtime.defaultConfig.AtreeValidationEnabled = false

address := common.MustBytesToAddress([]byte{0x1})

contract := []byte(`
pub contract Test{
pub resource Holder {
pub var vaults: @[AnyResource]
init(_ vaults: @[AnyResource]) {
self.vaults <- vaults
}
destroy() {
self.vaults.append(<-self.vaults)
}
}
pub fun createHolder(_ vaults: @[AnyResource]): @Holder {
return <- create Holder(<-vaults)
}
pub resource Dummy {}
pub fun dummy(): @Dummy {
return <- create Dummy()
}
}
`)

tx := []byte(`
import Test from 0x1
transaction {
prepare(acct: AuthAccount) {
var holder <- Test.createHolder(<-[<-Test.dummy(), <-Test.dummy()])
destroy holder
}
}
`)

deploy := DeploymentTransaction("Test", contract)

var accountCode []byte
var events []cadence.Event

runtimeInterface := &testRuntimeInterface{
getCode: func(_ Location) (bytes []byte, err error) {
return accountCode, nil
},
storage: newTestLedger(nil, nil),
getSigningAccounts: func() ([]Address, error) {
return []Address{address}, nil
},
resolveLocation: singleIdentifierLocationResolver(t),
getAccountContractCode: func(_ common.AddressLocation) (code []byte, err error) {
return accountCode, nil
},
updateAccountContractCode: func(_ common.AddressLocation, code []byte) error {
accountCode = code
return nil
},
emitEvent: func(event cadence.Event) error {
events = append(events, event)
return nil
},
}

nextTransactionLocation := newTransactionLocationGenerator()

// Deploy

err := runtime.ExecuteTransaction(
Script{
Source: deploy,
},
Context{
Interface: runtimeInterface,
Location: nextTransactionLocation(),
},
)
require.NoError(t, err)

// Test

err = runtime.ExecuteTransaction(
Script{
Source: tx,
},
Context{
Interface: runtimeInterface,
Location: nextTransactionLocation(),
},
)
RequireError(t, err)

require.ErrorAs(t, err, &interpreter.RecursiveTransferError{})
}

0 comments on commit fba2918

Please sign in to comment.