Skip to content

Commit 0c25672

Browse files
authored
Merge branch 'main' into fix/1781-restore-token-balance-assertions
2 parents c5f63c8 + bedae22 commit 0c25672

3 files changed

Lines changed: 161 additions & 0 deletions

File tree

sdk/contract_create_transaction_unit_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,3 +421,33 @@ func TestUnitContractCreateBytesHooks(t *testing.T) {
421421
require.NoError(t, err)
422422
require.Equal(t, *hook, contractCreateTx.GetHooks()[0])
423423
}
424+
425+
// HIP-904
426+
func TestUnitContractCreateTransactionUnlimitedMaxAutoAssociations(t *testing.T) {
427+
t.Parallel()
428+
429+
transaction, err := NewContractCreateTransaction().
430+
SetTransactionID(TransactionIDGenerate(AccountID{Account: 324})).
431+
SetNodeAccountIDs([]AccountID{{Account: 10}}).
432+
SetBytecodeFileID(FileID{File: 7}).
433+
SetGas(500).
434+
SetMaxAutomaticTokenAssociations(-1).
435+
Freeze()
436+
require.NoError(t, err)
437+
438+
require.Equal(t, int32(-1), transaction.GetMaxAutomaticTokenAssociations())
439+
440+
proto := transaction.build().GetContractCreateInstance()
441+
require.Equal(t, int32(-1), proto.MaxAutomaticTokenAssociations)
442+
}
443+
444+
func TestUnitContractCreateFlowUnlimitedMaxAutoAssociations(t *testing.T) {
445+
t.Parallel()
446+
447+
flow := NewContractCreateFlow().
448+
SetMaxAutomaticTokenAssociations(-1)
449+
require.Equal(t, int32(-1), flow.GetMaxAutomaticTokenAssociations())
450+
451+
contractCreateTx := flow._CreateContractCreateTransaction(FileID{File: 7})
452+
require.Equal(t, int32(-1), contractCreateTx.GetMaxAutomaticTokenAssociations())
453+
}

sdk/contract_update_transaction_unit_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,22 @@ func TestUnitContractUpdateTransactionBytesHooks(t *testing.T) {
412412
require.Equal(t, *hook, contractUpdateTx.GetHooksToCreate()[0])
413413
require.Equal(t, []int64{1}, contractUpdateTx.GetHooksToDelete())
414414
}
415+
416+
// HIP-904
417+
func TestUnitContractUpdateTransactionUnlimitedMaxAutoAssociations(t *testing.T) {
418+
t.Parallel()
419+
420+
transaction, err := NewContractUpdateTransaction().
421+
SetTransactionID(TransactionIDGenerate(AccountID{Account: 324})).
422+
SetNodeAccountIDs([]AccountID{{Account: 10}}).
423+
SetContractID(ContractID{Contract: 7}).
424+
SetMaxAutomaticTokenAssociations(-1).
425+
Freeze()
426+
require.NoError(t, err)
427+
428+
require.Equal(t, int32(-1), transaction.GetMaxAutomaticTokenAssociations())
429+
430+
proto := transaction.build().GetContractUpdateInstance()
431+
require.NotNil(t, proto.MaxAutomaticTokenAssociations)
432+
require.Equal(t, int32(-1), proto.MaxAutomaticTokenAssociations.GetValue())
433+
}

sdk/max_auto_associations_e2e_test.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,3 +596,115 @@ func TestUnlimitedMaxAutoAssociationsFailsWithInvalid(t *testing.T) {
596596
_, err = tx.SetValidateStatus(true).GetReceipt(env.Client)
597597
require.ErrorContains(t, err, "INVALID_MAX_AUTO_ASSOCIATIONS")
598598
}
599+
600+
// HIP-904 contract tests
601+
602+
func TestUnlimitedMaxAutoAssociationsContractAllowsToTransferFungibleTokens(t *testing.T) {
603+
testContractByteCode := []byte(`608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101cb806100606000396000f3fe608060405260043610610046576000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b51461004b578063cfae321714610062575b600080fd5b34801561005757600080fd5b506100606100f2565b005b34801561006e57600080fd5b50610077610162565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b757808201518184015260208101905061009c565b50505050905090810190601f1680156100e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610160573373ffffffffffffffffffffffffffffffffffffffff16ff5b565b60606040805190810160405280600d81526020017f48656c6c6f2c20776f726c64210000000000000000000000000000000000000081525090509056fea165627a7a72305820ae96fb3af7cde9c0abfe365272441894ab717f816f07f41f07b1cbede54e256e0029`)
604+
605+
t.Parallel()
606+
env := NewIntegrationTestEnv(t)
607+
defer CloseIntegrationTestEnv(env, nil)
608+
609+
// deploy the bytecode
610+
fileCreate, err := NewFileCreateTransaction().
611+
SetKeys(env.Client.GetOperatorPublicKey()).
612+
SetContents(testContractByteCode).
613+
Execute(env.Client)
614+
require.NoError(t, err)
615+
616+
fileReceipt, err := fileCreate.SetValidateStatus(true).GetReceipt(env.Client)
617+
require.NoError(t, err)
618+
fileID := *fileReceipt.FileID
619+
620+
// create a contract with unlimited max auto associations
621+
contractCreate, err := NewContractCreateTransaction().
622+
SetAdminKey(env.Client.GetOperatorPublicKey()).
623+
SetGas(contractDeployGas).
624+
SetBytecodeFileID(fileID).
625+
SetMaxAutomaticTokenAssociations(-1).
626+
Execute(env.Client)
627+
require.NoError(t, err)
628+
629+
contractReceipt, err := contractCreate.SetValidateStatus(true).GetReceipt(env.Client)
630+
require.NoError(t, err)
631+
require.NotNil(t, contractReceipt.ContractID)
632+
contractID := *contractReceipt.ContractID
633+
634+
// the contract's own account is addressed by the same shard.realm.num
635+
contractAccountID := AccountID{Shard: contractID.Shard, Realm: contractID.Realm, Account: contractID.Contract}
636+
637+
// create token1
638+
tokenID1, err := createFungibleToken(&env)
639+
require.NoError(t, err)
640+
641+
// create token2
642+
tokenID2, err := createFungibleToken(&env)
643+
require.NoError(t, err)
644+
645+
// transfer both tokens to the contract with no explicit association
646+
tokenTransferTransaction, err := NewTransferTransaction().
647+
AddTokenTransfer(tokenID1, env.Client.GetOperatorAccountID(), -1000).
648+
AddTokenTransfer(tokenID1, contractAccountID, 1000).
649+
AddTokenTransfer(tokenID2, env.Client.GetOperatorAccountID(), -1000).
650+
AddTokenTransfer(tokenID2, contractAccountID, 1000).
651+
Execute(env.Client)
652+
require.NoError(t, err)
653+
654+
_, err = tokenTransferTransaction.SetValidateStatus(true).GetReceipt(env.Client)
655+
require.NoError(t, err)
656+
657+
// verify both balances arrived on the contract
658+
contractBalance, err := NewAccountBalanceQuery().SetContractID(contractID).Execute(env.Client)
659+
require.NoError(t, err)
660+
assert.Equal(t, uint64(1000), contractBalance.Tokens.Get(tokenID1))
661+
assert.Equal(t, uint64(1000), contractBalance.Tokens.Get(tokenID2))
662+
}
663+
664+
func TestUnlimitedMaxAutoAssociationsContractUpdate(t *testing.T) {
665+
testContractByteCode := []byte(`608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101cb806100606000396000f3fe608060405260043610610046576000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b51461004b578063cfae321714610062575b600080fd5b34801561005757600080fd5b506100606100f2565b005b34801561006e57600080fd5b50610077610162565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b757808201518184015260208101905061009c565b50505050905090810190601f1680156100e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610160573373ffffffffffffffffffffffffffffffffffffffff16ff5b565b60606040805190810160405280600d81526020017f48656c6c6f2c20776f726c64210000000000000000000000000000000000000081525090509056fea165627a7a72305820ae96fb3af7cde9c0abfe365272441894ab717f816f07f41f07b1cbede54e256e0029`)
666+
667+
t.Parallel()
668+
env := NewIntegrationTestEnv(t)
669+
defer CloseIntegrationTestEnv(env, nil)
670+
671+
// deploy the bytecode
672+
fileCreate, err := NewFileCreateTransaction().
673+
SetKeys(env.Client.GetOperatorPublicKey()).
674+
SetContents(testContractByteCode).
675+
Execute(env.Client)
676+
require.NoError(t, err)
677+
678+
fileReceipt, err := fileCreate.SetValidateStatus(true).GetReceipt(env.Client)
679+
require.NoError(t, err)
680+
fileID := *fileReceipt.FileID
681+
682+
// create a contract with a limited number of max auto associations
683+
contractCreate, err := NewContractCreateTransaction().
684+
SetAdminKey(env.Client.GetOperatorPublicKey()).
685+
SetGas(contractDeployGas).
686+
SetBytecodeFileID(fileID).
687+
SetMaxAutomaticTokenAssociations(1).
688+
Execute(env.Client)
689+
require.NoError(t, err)
690+
691+
contractReceipt, err := contractCreate.SetValidateStatus(true).GetReceipt(env.Client)
692+
require.NoError(t, err)
693+
require.NotNil(t, contractReceipt.ContractID)
694+
contractID := *contractReceipt.ContractID
695+
696+
// update the contract to unlimited max auto associations
697+
contractUpdate, err := NewContractUpdateTransaction().
698+
SetContractID(contractID).
699+
SetMaxAutomaticTokenAssociations(-1).
700+
Execute(env.Client)
701+
require.NoError(t, err)
702+
703+
_, err = contractUpdate.SetValidateStatus(true).GetReceipt(env.Client)
704+
require.NoError(t, err)
705+
706+
// verify the contract now reports unlimited (-1) max auto associations
707+
info, err := NewContractInfoQuery().SetContractID(contractID).Execute(env.Client)
708+
require.NoError(t, err)
709+
assert.Equal(t, int32(-1), info.MaxAutomaticTokenAssociations)
710+
}

0 commit comments

Comments
 (0)