Search in sources :

Example 1 with Id

use of com.hedera.services.store.models.Id in project hedera-services by hashgraph.

the class TypedTokenStoreTest method savesTokenAsExpected.

/* --- Token saving --- */
@Test
void savesTokenAsExpected() {
    // setup:
    final var mintedSerialNo = 33L;
    final var wipedSerialNo = 33L;
    final var mintedSerialNo2 = 44;
    final var burnedSerialNo = 44;
    final var nftMeta = "abcdefgh".getBytes();
    final var treasuryId = new EntityId(0, 0, treasuryAccountNum);
    final var tokenEntityId = new EntityId(0, 0, tokenNum);
    final var creationTime = new RichInstant(1_234_567L, 8);
    final var modelTreasuryId = new Id(0, 0, treasuryAccountNum);
    final var mintedToken = new UniqueToken(tokenId, mintedSerialNo, creationTime, Id.DEFAULT, nftMeta);
    final var wipedToken = new UniqueToken(tokenId, wipedSerialNo, creationTime, modelTreasuryId, nftMeta);
    final var mintedToken2 = new UniqueToken(tokenId, mintedSerialNo2, creationTime, Id.DEFAULT, nftMeta);
    final var burnedToken = new UniqueToken(tokenId, burnedSerialNo, creationTime, modelTreasuryId, nftMeta);
    // and:
    final var expectedReplacementToken = new MerkleToken(expiry, tokenSupply * 2, 0, symbol, name, freezeDefault, true, new EntityId(0, 0, autoRenewAccountNum));
    expectedReplacementToken.setAutoRenewAccount(treasuryId);
    expectedReplacementToken.setSupplyKey(supplyKey);
    expectedReplacementToken.setFreezeKey(freezeKey);
    expectedReplacementToken.setKycKey(kycKey);
    expectedReplacementToken.setPauseKey(pauseKey);
    expectedReplacementToken.setAccountsFrozenByDefault(!freezeDefault);
    expectedReplacementToken.setMemo(memo);
    expectedReplacementToken.setAutoRenewPeriod(autoRenewPeriod);
    // and:
    final var expectedReplacementToken2 = new MerkleToken(expiry, tokenSupply * 4, 0, symbol, name, freezeDefault, true, new EntityId(0, 0, treasuryAccountNum));
    expectedReplacementToken2.setAutoRenewAccount(treasuryId);
    expectedReplacementToken2.setSupplyKey(supplyKey);
    expectedReplacementToken2.setFreezeKey(freezeKey);
    expectedReplacementToken2.setKycKey(kycKey);
    expectedReplacementToken2.setPauseKey(pauseKey);
    expectedReplacementToken2.setAccountsFrozenByDefault(!freezeDefault);
    expectedReplacementToken2.setMemo(memo);
    expectedReplacementToken2.setAutoRenewPeriod(autoRenewPeriod);
    // and:
    final var expectedNewUniqTokenId = NftId.withDefaultShardRealm(tokenEntityId.num(), mintedSerialNo);
    final var expectedNewUniqTokenId2 = NftId.withDefaultShardRealm(tokenEntityId.num(), mintedSerialNo2);
    final var expectedNewUniqToken = new MerkleUniqueToken(MISSING_ENTITY_ID, nftMeta, creationTime);
    final var expectedPastUniqTokenId = NftId.withDefaultShardRealm(tokenEntityId.num(), wipedSerialNo);
    final var expectedPastUniqTokenId2 = NftId.withDefaultShardRealm(tokenEntityId.num(), burnedSerialNo);
    givenModifiableToken(merkleTokenId, merkleToken);
    givenToken(merkleTokenId, merkleToken);
    // when:
    var modelToken = subject.loadToken(tokenId);
    // and:
    modelToken.setTotalSupply(tokenSupply * 2);
    modelToken.setAutoRenewAccount(treasuryAccount);
    modelToken.setTreasury(autoRenewAccount);
    modelToken.setFrozenByDefault(!freezeDefault);
    modelToken.mintedUniqueTokens().add(mintedToken);
    modelToken.setIsDeleted(false);
    modelToken.setExpiry(expiry);
    modelToken.setAutoRenewPeriod(autoRenewPeriod);
    modelToken.removedUniqueTokens().add(wipedToken);
    modelToken.setAutoRenewPeriod(autoRenewPeriod);
    modelToken.setCustomFees(List.of());
    modelToken.setMemo(memo);
    // and:
    subject.commitToken(modelToken);
    // then:
    assertEquals(expectedReplacementToken, merkleToken);
    // and:
    verify(sideEffectsTracker).trackTokenChanges(modelToken);
    verify(uniqueTokens).put(expectedNewUniqTokenId, expectedNewUniqToken);
    verify(uniqueTokens).put(NftId.withDefaultShardRealm(tokenEntityId.num(), mintedSerialNo), expectedNewUniqToken);
    verify(uniqueTokens).remove(expectedPastUniqTokenId);
    // when:
    modelToken = subject.loadToken(tokenId);
    // and:
    modelToken.setTotalSupply(tokenSupply * 4);
    modelToken.setAutoRenewAccount(treasuryAccount);
    modelToken.setTreasury(treasuryAccount);
    modelToken.setFrozenByDefault(!freezeDefault);
    modelToken.mintedUniqueTokens().add(mintedToken2);
    modelToken.setIsDeleted(false);
    modelToken.setExpiry(expiry);
    modelToken.removedUniqueTokens().add(burnedToken);
    modelToken.setCustomFees(List.of());
    // and:
    subject.commitToken(modelToken);
    // then:
    assertEquals(expectedReplacementToken2, merkleToken);
    // and:
    verify(sideEffectsTracker).trackTokenChanges(modelToken);
    verify(uniqueTokens).put(expectedNewUniqTokenId2, expectedNewUniqToken);
    verify(uniqueTokens).remove(expectedPastUniqTokenId2);
}
Also used : EntityId(com.hedera.services.state.submerkle.EntityId) UniqueToken(com.hedera.services.store.models.UniqueToken) MerkleUniqueToken(com.hedera.services.state.merkle.MerkleUniqueToken) MerkleToken(com.hedera.services.state.merkle.MerkleToken) MerkleUniqueToken(com.hedera.services.state.merkle.MerkleUniqueToken) EntityId(com.hedera.services.state.submerkle.EntityId) Id(com.hedera.services.store.models.Id) NftId(com.hedera.services.store.models.NftId) RichInstant(com.hedera.services.state.submerkle.RichInstant) Test(org.junit.jupiter.api.Test)

Example 2 with Id

use of com.hedera.services.store.models.Id in project hedera-services by hashgraph.

the class AccountStoreTest method persistenceUpdatesTokens.

@Test
void persistenceUpdatesTokens() {
    setupWithAccount(miscMerkleId, miscMerkleAccount);
    setupWithMutableAccount(miscMerkleId, miscMerkleAccount);
    // and:
    final var aThirdToken = new Token(new Id(0, 0, 888));
    // and:
    final var expectedReplacement = MerkleAccountFactory.newAccount().balance(balance).assocTokens(firstAssocTokenId, secondAssocTokenId, aThirdToken.getId()).expirationTime(expiry).maxAutomaticAssociations(maxAutoAssociations).alreadyUsedAutomaticAssociations(alreadyUsedAutoAssociations).proxy(proxy.asGrpcAccount()).get();
    // given:
    final var model = subject.loadAccount(miscId);
    // when:
    model.associateWith(List.of(aThirdToken), Integer.MAX_VALUE, false);
    // and:
    subject.commitAccount(model);
    // then:
    assertEquals(expectedReplacement, miscMerkleAccount);
    // verify(accounts, never()).replace(miscMerkleId, expectedReplacement);
    // and:
    assertNotSame(miscMerkleAccount.tokens().getIds(), model.getAssociatedTokens());
}
Also used : Token(com.hedera.services.store.models.Token) Id(com.hedera.services.store.models.Id) Test(org.junit.jupiter.api.Test)

Example 3 with Id

use of com.hedera.services.store.models.Id in project hedera-services by hashgraph.

the class CallEvmTxProcessorTest method givenValidMock.

private void givenValidMock() {
    given(worldState.updater()).willReturn(updater);
    given(worldState.updater().updater()).willReturn(updater);
    given(globalDynamicProperties.fundingAccount()).willReturn(new Id(0, 0, 1010).asGrpcAccount());
    var evmAccount = mock(EvmAccount.class);
    given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, false)).willReturn(Gas.ZERO);
    given(updater.getOrCreateSenderAccount(sender.getId().asEvmAddress())).willReturn(evmAccount);
    given(worldState.updater()).willReturn(updater);
    given(codeCache.getIfPresent(any())).willReturn(new Code());
    given(gasCalculator.getSelfDestructRefundAmount()).willReturn(Gas.ZERO);
    given(gasCalculator.getMaxRefundQuotient()).willReturn(2L);
    var senderMutableAccount = mock(MutableAccount.class);
    given(senderMutableAccount.decrementBalance(any())).willReturn(Wei.of(1234L));
    given(senderMutableAccount.incrementBalance(any())).willReturn(Wei.of(1500L));
    given(evmAccount.getMutable()).willReturn(senderMutableAccount);
    given(updater.getSenderAccount(any())).willReturn(evmAccount);
    given(updater.getSenderAccount(any()).getMutable()).willReturn(senderMutableAccount);
    given(updater.getOrCreate(any())).willReturn(evmAccount);
    given(updater.getOrCreate(any()).getMutable()).willReturn(senderMutableAccount);
    given(updater.getSbhRefund()).willReturn(Gas.ZERO);
}
Also used : Id(com.hedera.services.store.models.Id) Code(org.hyperledger.besu.evm.Code)

Example 4 with Id

use of com.hedera.services.store.models.Id in project hedera-services by hashgraph.

the class CallLocalEvmTxProcessorTest method givenValidMock.

private void givenValidMock() {
    given(worldState.updater()).willReturn(updater);
    given(worldState.updater().updater()).willReturn(updater);
    given(globalDynamicProperties.fundingAccount()).willReturn(new Id(0, 0, 1010).asGrpcAccount());
    var evmAccount = mock(EvmAccount.class);
    given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, false)).willReturn(Gas.ZERO);
    given(updater.getOrCreateSenderAccount(sender.getId().asEvmAddress())).willReturn(evmAccount);
    given(updater.getOrCreateSenderAccount(sender.getId().asEvmAddress()).getMutable()).willReturn(mock(MutableAccount.class));
    given(worldState.updater()).willReturn(updater);
    given(codeCache.getIfPresent(any())).willReturn(new Code());
    var senderMutableAccount = mock(MutableAccount.class);
    given(senderMutableAccount.decrementBalance(any())).willReturn(Wei.of(1234L));
    given(senderMutableAccount.incrementBalance(any())).willReturn(Wei.of(1500L));
    given(gasCalculator.getSelfDestructRefundAmount()).willReturn(Gas.ZERO);
    given(gasCalculator.getMaxRefundQuotient()).willReturn(2L);
    given(updater.getSenderAccount(any())).willReturn(evmAccount);
    given(updater.getSenderAccount(any()).getMutable()).willReturn(senderMutableAccount);
    given(updater.getOrCreate(any())).willReturn(evmAccount);
    given(updater.getOrCreate(any()).getMutable()).willReturn(senderMutableAccount);
    given(updater.getSbhRefund()).willReturn(Gas.ZERO);
}
Also used : MutableAccount(org.hyperledger.besu.evm.account.MutableAccount) Id(com.hedera.services.store.models.Id) Code(org.hyperledger.besu.evm.Code)

Example 5 with Id

use of com.hedera.services.store.models.Id in project hedera-services by hashgraph.

the class TransactionProcessingResultTest method assertCorrectDataOnSuccessfulTransaction.

@Test
void assertCorrectDataOnSuccessfulTransaction() {
    var firstContract = new Account(new Id(0, 0, 1003));
    var secondContract = new Account(new Id(0, 0, 1004));
    var listOfCreatedContracts = List.of(firstContract.getId().asGrpcContract(), secondContract.getId().asGrpcContract());
    var log = new Log(logger.getId().asEvmAddress(), Bytes.fromHexString("0x0102"), List.of(logTopic, logTopic, logTopic, logTopic));
    final var logList = List.of(log);
    final var firstContractChanges = new TreeMap<Bytes, Pair<Bytes, Bytes>>(BytesComparator.INSTANCE);
    firstContractChanges.put(UInt256.valueOf(1L), new ImmutablePair<>(UInt256.valueOf(1L), null));
    final var secondContractChanges = new TreeMap<Bytes, Pair<Bytes, Bytes>>(BytesComparator.INSTANCE);
    secondContractChanges.put(UInt256.valueOf(1L), new ImmutablePair<>(UInt256.valueOf(1L), UInt256.valueOf(2L)));
    secondContractChanges.put(UInt256.valueOf(2L), new ImmutablePair<>(UInt256.valueOf(55L), UInt256.valueOf(255L)));
    final Map<Address, Map<Bytes, Pair<Bytes, Bytes>>> contractStateChanges = new TreeMap<>(BytesComparator.INSTANCE);
    contractStateChanges.put(firstContract.getId().asEvmAddress(), firstContractChanges);
    contractStateChanges.put(secondContract.getId().asEvmAddress(), secondContractChanges);
    final var expect = ContractFunctionResult.newBuilder().setGasUsed(GAS_USAGE).setBloom(ByteString.copyFrom(LogsBloomFilter.builder().insertLogs(logList).build().toArray()));
    expect.setContractCallResult(ByteString.copyFrom(Bytes.EMPTY.toArray()));
    expect.setContractID(EntityIdUtils.contractIdFromEvmAddress(recipient.getId().asEvmAddress().toArray()));
    expect.addAllCreatedContractIDs(listOfCreatedContracts);
    final var firstContractChangesRpc = ContractStateChange.newBuilder().setContractID(firstContract.getId().asGrpcContract()).addStorageChanges(StorageChange.newBuilder().setSlot(ByteString.copyFrom(UInt256.valueOf(1L).trimLeadingZeros().toArrayUnsafe())).setValueRead(ByteString.copyFrom(UInt256.valueOf(1L).trimLeadingZeros().toArrayUnsafe())).build()).build();
    final var secondContractChangesRpc = ContractStateChange.newBuilder().setContractID(secondContract.getId().asGrpcContract()).addStorageChanges(StorageChange.newBuilder().setSlot(ByteString.copyFrom(UInt256.valueOf(1L).trimLeadingZeros().toArrayUnsafe())).setValueRead(ByteString.copyFrom(UInt256.valueOf(1L).trimLeadingZeros().toArrayUnsafe())).setValueWritten(BytesValue.newBuilder().setValue(ByteString.copyFrom(UInt256.valueOf(2L).trimLeadingZeros().toArrayUnsafe()))).build()).addStorageChanges(StorageChange.newBuilder().setSlot(ByteString.copyFrom(UInt256.valueOf(2L).trimLeadingZeros().toArrayUnsafe())).setValueRead(ByteString.copyFrom(UInt256.valueOf(55L).trimLeadingZeros().toArrayUnsafe())).setValueWritten(BytesValue.newBuilder().setValue(ByteString.copyFrom(UInt256.valueOf(255L).trimLeadingZeros().toArrayUnsafe()))).build()).build();
    expect.addAllStateChanges(List.of(firstContractChangesRpc, secondContractChangesRpc));
    var result = TransactionProcessingResult.successful(logList, GAS_USAGE, GAS_REFUND, 1234L, Bytes.EMPTY, recipient.getId().asEvmAddress(), contractStateChanges);
    result.setCreatedContracts(listOfCreatedContracts);
    assertEquals(expect.getGasUsed(), result.getGasUsed());
    final var resultAsGrpc = result.toGrpc();
    assertEquals(GAS_REFUND, result.getSbhRefund());
    assertEquals(Optional.empty(), result.getHaltReason());
    assertEquals(expect.getBloom(), resultAsGrpc.getBloom());
    assertEquals(expect.getContractID(), resultAsGrpc.getContractID());
    assertEquals(ByteString.EMPTY, resultAsGrpc.getContractCallResult());
    assertEquals(listOfCreatedContracts, resultAsGrpc.getCreatedContractIDsList());
}
Also used : Account(com.hedera.services.store.models.Account) Bytes(org.apache.tuweni.bytes.Bytes) Address(org.hyperledger.besu.datatypes.Address) Log(org.hyperledger.besu.evm.log.Log) Id(com.hedera.services.store.models.Id) TreeMap(java.util.TreeMap) Map(java.util.Map) TreeMap(java.util.TreeMap) Test(org.junit.jupiter.api.Test)

Aggregations

Id (com.hedera.services.store.models.Id)17 Test (org.junit.jupiter.api.Test)13 NftId (com.hedera.services.store.models.NftId)3 FcTokenAllowanceId (com.hedera.services.state.submerkle.FcTokenAllowanceId)2 Account (com.hedera.services.store.models.Account)2 Token (com.hedera.services.store.models.Token)2 AccountID (com.hederahashgraph.api.proto.java.AccountID)2 TransactionBody (com.hederahashgraph.api.proto.java.TransactionBody)2 Code (org.hyperledger.besu.evm.Code)2 ByteString (com.google.protobuf.ByteString)1 MerkleToken (com.hedera.services.state.merkle.MerkleToken)1 MerkleUniqueToken (com.hedera.services.state.merkle.MerkleUniqueToken)1 EntityId (com.hedera.services.state.submerkle.EntityId)1 RichInstant (com.hedera.services.state.submerkle.RichInstant)1 TokenRelationship (com.hedera.services.store.models.TokenRelationship)1 UniqueToken (com.hedera.services.store.models.UniqueToken)1 EntityNumPair.fromNftId (com.hedera.services.utils.EntityNumPair.fromNftId)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 Bytes (org.apache.tuweni.bytes.Bytes)1