use of com.hedera.mirror.common.domain.contract.Contract in project hedera-mirror-node by hashgraph.
the class EntityRecordItemListenerContractTest method contractUpdateAllWithMemoToNew.
@Test
void contractUpdateAllWithMemoToNew() {
Transaction transaction = contractUpdateAllTransaction(false);
TransactionBody transactionBody = getTransactionBody(transaction);
TransactionRecord record = getContractTransactionRecord(transactionBody, ContractTransactionType.UPDATE);
ContractUpdateTransactionBody contractUpdateTransactionBody = transactionBody.getContractUpdateInstance();
parseRecordItemAndCommit(new RecordItem(transaction, record));
assertAll(() -> assertEquals(1, transactionRepository.count()), () -> assertEntities(EntityId.of(CONTRACT_ID)), () -> assertEquals(0, contractResultRepository.count()), () -> assertEquals(3, cryptoTransferRepository.count()), () -> assertTransactionAndRecord(transactionBody, record), () -> assertContractEntity(contractUpdateTransactionBody, record.getConsensusTimestamp()).returns(null, Contract::getCreatedTimestamp).returns(null, // FileId is ignored on updates by HAPI
Contract::getFileId));
}
use of com.hedera.mirror.common.domain.contract.Contract in project hedera-mirror-node by hashgraph.
the class EntityRecordItemListenerContractTest method contractCreateWithEvmAddress.
@Test
void contractCreateWithEvmAddress() {
// no child tx, creates a single contract with evm address set
byte[] evmAddress = domainBuilder.evmAddress();
RecordItem recordItem = recordItemBuilder.contractCreate(CONTRACT_ID).transactionBody(t -> t.setDeclineReward(false).setStakedNodeId(1L)).record(r -> r.setContractCreateResult(r.getContractCreateResultBuilder().clearCreatedContractIDs().addCreatedContractIDs(CONTRACT_ID).setEvmAddress(BytesValue.of(DomainUtils.fromBytes(evmAddress))))).hapiVersion(RecordFile.HAPI_VERSION_0_23_0).build();
var record = recordItem.getRecord();
var transactionBody = recordItem.getTransactionBody().getContractCreateInstance();
parseRecordItemAndCommit(recordItem);
assertAll(() -> assertEquals(1, transactionRepository.count()), () -> assertEquals(1, contractRepository.count()), () -> assertEquals(0, entityRepository.count()), () -> assertEquals(1, contractResultRepository.count()), () -> assertEquals(3, cryptoTransferRepository.count()), () -> assertContractEntity(recordItem), () -> assertThat(contractResultRepository.findAll()).hasSize(1), () -> assertContractCreateResult(transactionBody, record));
}
use of com.hedera.mirror.common.domain.contract.Contract in project hedera-mirror-node by hashgraph.
the class EntityRecordItemListenerContractTest method contractDeleteToExisting.
@ParameterizedTest
@CsvSource({ "PLAIN, false", "PARSABLE_EVM,true", "CREATE2_EVM,false" })
void contractDeleteToExisting(ContractIdType contractIdType, boolean permanentRemoval) {
SetupResult setupResult = setupContract(CONTRACT_ID, contractIdType, true, true);
Transaction transaction = contractDeleteTransaction(setupResult.protoContractId, permanentRemoval);
TransactionBody transactionBody = getTransactionBody(transaction);
TransactionRecord record = getContractTransactionRecord(transactionBody, ContractTransactionType.DELETE);
RecordItem recordItem = new RecordItem(transaction, record);
parseRecordItemAndCommit(recordItem);
Contract dbContractEntity = getTransactionEntity(record.getConsensusTimestamp());
assertAll(() -> assertEquals(1, transactionRepository.count()), () -> assertEquals(0, contractResultRepository.count()), () -> assertEquals(3, cryptoTransferRepository.count()), () -> assertEntities(setupResult.contract.toEntityId()), () -> assertTransactionAndRecord(transactionBody, record), () -> assertThat(dbContractEntity).isNotNull().returns(true, Contract::getDeleted).returns(EntityId.of(PAYER), Contract::getObtainerId).returns(permanentRemoval, Contract::getPermanentRemoval).returns(Range.atLeast(recordItem.getConsensusTimestamp()), Contract::getTimestampRange).usingRecursiveComparison().ignoringFields("deleted", "obtainerId", "permanentRemoval", "timestampRange").isEqualTo(setupResult.contract));
}
use of com.hedera.mirror.common.domain.contract.Contract in project hedera-mirror-node by hashgraph.
the class EntityRecordItemListenerContractTest method assertContractEntity.
private ObjectAssert<Contract> assertContractEntity(ContractUpdateTransactionBody expected, Timestamp consensusTimestamp) {
Contract contract = getTransactionEntity(consensusTimestamp);
long updatedTimestamp = DomainUtils.timeStampInNanos(consensusTimestamp);
var adminKey = expected.getAdminKey().toByteArray();
var expectedMaxAutomaticTokenAssociations = expected.hasMaxAutomaticTokenAssociations() ? expected.getMaxAutomaticTokenAssociations().getValue() : null;
var contractAssert = assertThat(contract).isNotNull().returns(expected.getAutoRenewPeriod().getSeconds(), Contract::getAutoRenewPeriod).returns(false, Contract::getDeleted).returns(DomainUtils.timeStampInNanos(expected.getExpirationTime()), Contract::getExpirationTimestamp).returns(adminKey, Contract::getKey).returns(expectedMaxAutomaticTokenAssociations, Contract::getMaxAutomaticTokenAssociations).returns(getMemoFromContractUpdateTransactionBody(expected), Contract::getMemo).returns(updatedTimestamp, Contract::getTimestampLower).returns(null, Contract::getObtainerId).returns(EntityId.of(expected.getProxyAccountID()), Contract::getProxyAccountId).returns(DomainUtils.getPublicKey(adminKey), Contract::getPublicKey).returns(EntityType.CONTRACT, Contract::getType).returns(expected.getDeclineReward().getValue(), Contract::isDeclineReward);
if (expected.getStakedIdCase() == STAKEDID_NOT_SET) {
return contractAssert;
}
if (expected.hasStakedAccountId()) {
long expectedAccountId = AccountIdConverter.INSTANCE.convertToDatabaseColumn(EntityId.of(expected.getStakedAccountId()));
contractAssert.returns(expectedAccountId, Contract::getStakedAccountId).returns(null, Contract::getStakedNodeId).returns(-1L, Contract::getStakePeriodStart);
} else {
contractAssert.returns(expected.getStakedNodeId(), Contract::getStakedNodeId).returns(null, Contract::getStakedAccountId).returns(Utility.getEpochDay(DomainUtils.timestampInNanosMax(consensusTimestamp)), Contract::getStakePeriodStart);
}
return contractAssert;
}
use of com.hedera.mirror.common.domain.contract.Contract in project hedera-mirror-node by hashgraph.
the class EntityRecordItemListenerContractTest method contractCallToExistingWithPaidStakingRewards.
@Test
void contractCallToExistingWithPaidStakingRewards() {
// given
var setupResult = setupContract(CONTRACT_ID, ContractIdType.PLAIN, true, false);
// 19137 days since epoch
var timestamp = 1653506322000111222L;
var stakePeriodStart = 19137L;
// now call
var transaction = contractCallTransaction(setupResult.protoContractId);
var transactionBody = getTransactionBody(transaction);
var record = getContractTransactionRecord(transactionBody, ContractTransactionType.CALL);
var contractCallTransactionBody = transactionBody.getContractCall();
var amount = contractCallTransactionBody.getAmount();
var contractAccountId = AccountID.newBuilder().setAccountNum(CONTRACT_ID.getContractNum()).build();
var contractAmount = AccountAmount.newBuilder().setAccountID(contractAccountId).setAmount(// with 15 reward payout
amount + 15L);
var stakingRewardAmount = AccountAmount.newBuilder().setAccountID(RecordItemBuilder.STAKING_REWARD_ACCOUNT).setAmount(-15L);
var transferList = record.getTransferList().toBuilder().addAccountAmounts(contractAmount).addAccountAmounts(stakingRewardAmount);
var paidRewardTransfer = AccountAmount.newBuilder().setAccountID(contractAccountId).setAmount(15L);
record = record.toBuilder().setConsensusTimestamp(TestUtils.toTimestamp(timestamp)).setTransferList(transferList).addPaidStakingRewards(paidRewardTransfer).build();
var recordItem = new RecordItem(transaction, record);
// when
parseRecordItemAndCommit(recordItem);
// then
var contract = setupResult.contract;
contract.setStakePeriodStart(stakePeriodStart);
Contract newContract = EntityId.of(CREATED_CONTRACT_ID).toEntity();
newContract.setCreatedTimestamp(timestamp);
newContract.setDeleted(false);
newContract.setMaxAutomaticTokenAssociations(0);
newContract.setMemo("");
newContract.setStakedAccountId(-1L);
newContract.setStakedNodeId(-1L);
newContract.setStakePeriodStart(-1L);
newContract.setTimestampLower(timestamp);
assertAll(() -> assertEquals(0, entityRepository.count()), () -> assertEquals(1, transactionRepository.count()), () -> assertEquals(1, contractResultRepository.count()), () -> assertEquals(5, cryptoTransferRepository.count()), () -> assertTransactionAndRecord(transactionBody, recordItem.getRecord()), () -> assertContractCallResult(contractCallTransactionBody, recordItem.getRecord()), () -> assertThat(contractRepository.findAll()).containsExactlyInAnyOrder(contract, newContract));
}
Aggregations