use of com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS in project hedera-services by hashgraph.
the class ContractKeysHTSSuite method callForMintWithDelegateContractKey.
private HapiApiSpec callForMintWithDelegateContractKey() {
final var theAccount = "anybody";
final var mintContractByteCode = "mintContractByteCode";
final var amount = 10L;
final var fungibleToken = "fungibleToken";
final var theContract = "mintContract";
final var firstMintTxn = "firstMintTxn";
final AtomicLong fungibleNum = new AtomicLong();
return defaultHapiSpec("callForMintWithDelegateContractKey").given(newKeyNamed(MULTI_KEY), cryptoCreate(theAccount).balance(10 * ONE_HUNDRED_HBARS), cryptoCreate(TOKEN_TREASURY), fileCreate(mintContractByteCode).payingWith(theAccount), updateLargeFile(theAccount, mintContractByteCode, extractByteCode(ContractResources.ORDINARY_CALLS_CONTRACT)), tokenCreate(fungibleToken).tokenType(FUNGIBLE_COMMON).initialSupply(0).treasury(TOKEN_TREASURY).adminKey(MULTI_KEY).supplyKey(MULTI_KEY).exposingCreatedIdTo(idLit -> fungibleNum.set(asDotDelimitedLongArray(idLit)[2]))).when(sourcing(() -> contractCreate(theContract).bytecode(mintContractByteCode).payingWith(theAccount).gas(GAS_TO_OFFER))).then(withOpContext((spec, opLog) -> allRunFor(spec, newKeyNamed("delegateContractKey").shape(DELEGATE_CONTRACT_KEY_SHAPE.signedWith(sigs(ON, theContract))), tokenUpdate(fungibleToken).supplyKey("delegateContractKey"), contractCall(theContract, MINT_TOKEN_ORDINARY_CALL, asAddress(spec.registry().getTokenID(fungibleToken)), amount, new byte[] {}).via(firstMintTxn).payingWith(theAccount))), childRecordsCheck(firstMintTxn, SUCCESS, recordWith().status(SUCCESS).tokenTransfers(changingFungibleBalances().including(fungibleToken, TOKEN_TREASURY, 10)).newTotalSupply(10)), getTokenInfo(fungibleToken).hasTotalSupply(amount), getAccountBalance(TOKEN_TREASURY).hasTokenBalance(fungibleToken, amount));
}
use of com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS in project hedera-services by hashgraph.
the class ContractKeysHTSSuite method burnTokenWithFullPrefixAndPartialPrefixKeys.
private HapiApiSpec burnTokenWithFullPrefixAndPartialPrefixKeys() {
final var theAccount = "anybody";
final var burnContractByteCode = "burnContractByteCode";
final var amount = 99L;
final var fungibleToken = "fungibleToken";
final var theContract = "mintContract";
final var firstBurnTxn = "firstBurnTxn";
final var secondBurnTxn = "secondBurnTxn";
final AtomicLong fungibleNum = new AtomicLong();
return defaultHapiSpec("burnTokenWithFullPrefixAndPartialPrefixKeys").given(newKeyNamed(MULTI_KEY), cryptoCreate(theAccount).balance(10 * ONE_HUNDRED_HBARS), cryptoCreate(TOKEN_TREASURY), fileCreate(burnContractByteCode).payingWith(theAccount), updateLargeFile(theAccount, burnContractByteCode, extractByteCode(ContractResources.ORDINARY_CALLS_CONTRACT)), tokenCreate(fungibleToken).tokenType(TokenType.FUNGIBLE_COMMON).initialSupply(100).treasury(TOKEN_TREASURY).adminKey(MULTI_KEY).supplyKey(MULTI_KEY).exposingCreatedIdTo(idLit -> fungibleNum.set(asDotDelimitedLongArray(idLit)[2]))).when(sourcing(() -> contractCreate(theContract).bytecode(burnContractByteCode).payingWith(theAccount).gas(GAS_TO_OFFER))).then(withOpContext((spec, opLog) -> allRunFor(spec, contractCall(theContract, BURN_TOKEN_ORDINARY_CALL, asAddress(spec.registry().getTokenID(fungibleToken)), 1, new ArrayList<Long>()).via(firstBurnTxn).payingWith(theAccount).signedBy(MULTI_KEY).signedBy(theAccount).hasKnownStatus(SUCCESS), contractCall(theContract, BURN_TOKEN_ORDINARY_CALL, asAddress(spec.registry().getTokenID(fungibleToken)), 1, new ArrayList<Long>()).via(secondBurnTxn).payingWith(theAccount).alsoSigningWithFullPrefix(MULTI_KEY).hasKnownStatus(SUCCESS))), childRecordsCheck(firstBurnTxn, SUCCESS, recordWith().status(INVALID_SIGNATURE)), childRecordsCheck(secondBurnTxn, SUCCESS, recordWith().status(SUCCESS).newTotalSupply(99)), getTokenInfo(fungibleToken).hasTotalSupply(amount), getAccountBalance(TOKEN_TREASURY).hasTokenBalance(fungibleToken, amount));
}
use of com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS in project hedera-services by hashgraph.
the class FibonacciPlusLoadProvider method contractOpsFactory.
private Function<HapiApiSpec, OpProvider> contractOpsFactory() {
final String civilian = "civilian";
final String bytecode = "bytecode";
final SplittableRandom random = new SplittableRandom(1_234_567L);
final IntFunction<String> contractNameFn = i -> "contract" + i;
final int r = powerLawBaseReciprocal.get();
final DoubleUnaryOperator logBaseReciprocal = x -> Math.log(x) / Math.log(r);
final int numDiscreteSizes = (int) ceil(logBaseReciprocal.applyAsDouble(numContracts.get() * (r - 1)));
double scale = powerLawScale.get();
int numSlots = (int) Math.pow(scale, numDiscreteSizes - 1) * smallestNumSlots.get();
int numContractsWithThisManySlots = 1;
int nextContractNum = 0;
for (int i = 0; i < numDiscreteSizes; i++) {
log.info("Will use {} contracts with {} slots", numContractsWithThisManySlots, numSlots);
for (int j = 0; j < numContractsWithThisManySlots; j++) {
final var thisContractNum = nextContractNum++;
final var thisContract = contractNameFn.apply(thisContractNum);
contractSlots.put(thisContract, numSlots);
if (validateStorage.get()) {
final var slots = new BigInteger[numSlots];
Arrays.fill(slots, BigInteger.ZERO);
contractStorage.put(thisContract, slots);
}
}
numSlots /= scale;
numContractsWithThisManySlots *= r;
}
log.info("Will use {} contracts in total", nextContractNum);
numContracts.set(nextContractNum);
Supplier<String> randomCallChoice = () -> {
final var iter = createdSoFar.iterator();
final var n = createdSoFar.size();
if (n == 1) {
return iter.next();
}
for (int i = 0; i < random.nextInt(n - 1); i++, iter.next()) {
/* No-op */
}
return iter.next();
};
final var that = this;
return spec -> new OpProvider() {
@Override
public List<HapiSpecOperation> suggestedInitializers() {
final List<HapiSpecOperation> inits = new ArrayList<>();
inits.add(fileCreate(bytecode).path(FIBONACCI_PLUS_PATH).noLogging().payingWith(GENESIS));
inits.add(cryptoCreate(civilian).balance(100 * ONE_MILLION_HBARS).payingWith(GENESIS));
return inits;
}
@Override
public Optional<HapiSpecOperation> get() {
final var aCallNum = submittedOps.incrementAndGet();
if (aCallNum == 1) {
effStart.set(Instant.now());
}
final var choice = (createdSoFar.isEmpty() || random.nextDouble() > MIN_CALL_PROB) ? contractNameFn.apply(random.nextInt(numContracts.get())) : randomCallChoice.get();
final HapiSpecOperation op;
if (createdSoFar.contains(choice)) {
final var n = slotsPerCall.get();
final int[] targets = new int[n];
final var m = contractSlots.get(choice);
for (int i = 0; i < n; i++) {
targets[i] = random.nextInt(m);
}
final var targetsDesc = Arrays.toString(targets);
if (verbose.get()) {
log.info("Calling {} with targets {} and fibN {}", choice, targetsDesc, fibN.get());
}
op = contractCall(choice, ADD_NTH_FIB_ABI, targets, fibN.get()).noLogging().payingWith(civilian).gas(GAS_TO_OFFER).exposingGasTo((code, gas) -> {
if (verbose.get()) {
log.info("(Tried to) call {} (targets = {}, fibN = {}) with {} gas --> {}", choice, targetsDesc, fibN.get(), gas, code);
}
that.observeExposedGas(gas);
if (code == SUCCESS && validateStorage.get()) {
final var curSlots = contractStorage.get(choice);
final var newSlots = Arrays.copyOf(curSlots, m);
for (int i = 0; i < n; i++) {
final var j = targets[i];
newSlots[j] = newSlots[j].add(fibNValue.get());
}
contractStorage.put(choice, newSlots);
}
}).hasKnownStatusFrom(SUCCESS, CONTRACT_REVERT_EXECUTED, INSUFFICIENT_GAS).deferStatusResolution();
} else {
final var numSlots = contractSlots.get(choice);
op = contractCreate(choice, FIBONACCI_PLUS_CONSTRUCTOR_ABI, numSlots).bytecode(bytecode).payingWith(civilian).balance(0L).gas(GAS_TO_OFFER).exposingGasTo((code, gas) -> {
if (code == SUCCESS) {
createdSoFar.add(choice);
}
log.info("(Tried to) create {} ({} slots) with {} gas --> {}", choice, numSlots, gas, code);
that.observeExposedGas(gas);
}).noLogging().hasKnownStatusFrom(SUCCESS, INSUFFICIENT_GAS).deferStatusResolution();
}
return Optional.of(op);
}
};
}
use of com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS in project hedera-services by hashgraph.
the class SStoreOperationLoadTest method runContractCalls.
private HapiApiSpec runContractCalls() {
PerfTestLoadSettings settings = new PerfTestLoadSettings();
final AtomicInteger submittedSoFar = new AtomicInteger(0);
long setValue = 0x1234abdeL;
Supplier<HapiSpecOperation[]> callBurst = () -> new HapiSpecOperation[] { contractCall("perf", ContractResources.BIG_ARRAY_CHANGE_ARRAY_ABI, setValue).noLogging().payingWith("sender").suppressStats(true).hasKnownStatusFrom(UNKNOWN, SUCCESS).hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED).deferStatusResolution() };
return defaultHapiSpec("runContractCalls").given(withOpContext((spec, ignore) -> settings.setFrom(spec.setup().ciPropertiesMap())), logIt(ignore -> settings.toString())).when(cryptoCreate("sender").balance(initialBalance.getAsLong()).withRecharging().rechargeWindow(3).hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED), fileCreate("contractBytecode").path(ContractResources.BIG_ARRAY_BYTECODE_PATH).hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED), contractCreate("perf").bytecode("contractBytecode").hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED), getContractInfo("perf").hasExpectedInfo().logged(), // Initialize storage size
contractCall("perf", ContractResources.BIG_ARRAY_SET_SIZE_ABI, size).hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED).gas(300_000)).then(defaultLoadTest(callBurst, settings));
}
use of com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS in project hedera-services by hashgraph.
the class CryptoTransferLoadTestWithAutoAccounts method runCryptoTransfers.
protected HapiApiSpec runCryptoTransfers() {
PerfTestLoadSettings settings = new PerfTestLoadSettings();
Supplier<HapiSpecOperation[]> transferBurst = () -> {
String sender = "sender";
String receiver;
if (r.nextInt(10) < 5) {
receiver = "alias" + r.nextInt(AUTO_ACCOUNTS);
} else {
receiver = "receiver";
}
if (receiver.startsWith("alias")) {
return new HapiSpecOperation[] { cryptoTransfer(tinyBarsFromToWithAlias(sender, receiver, 1L)).logging().payingWith(sender).signedBy(GENESIS).suppressStats(true).fee(100_000_000L).hasKnownStatusFrom(SUCCESS, OK, INSUFFICIENT_PAYER_BALANCE, UNKNOWN, TRANSACTION_EXPIRED, INSUFFICIENT_ACCOUNT_BALANCE).hasRetryPrecheckFrom(BUSY, PLATFORM_TRANSACTION_NOT_CREATED).deferStatusResolution() };
}
return new HapiSpecOperation[] { cryptoTransfer(tinyBarsFromTo(sender, receiver, 1L)).noLogging().payingWith(sender).signedBy(GENESIS).suppressStats(true).fee(100_000_000L).hasKnownStatusFrom(SUCCESS, OK, INSUFFICIENT_PAYER_BALANCE, UNKNOWN, TRANSACTION_EXPIRED, INSUFFICIENT_ACCOUNT_BALANCE).hasRetryPrecheckFrom(BUSY, PLATFORM_TRANSACTION_NOT_CREATED).deferStatusResolution() };
};
return defaultHapiSpec("RunCryptoTransfersWithAutoAccounts").given(withOpContext((spec, ignore) -> settings.setFrom(spec.setup().ciPropertiesMap())), logIt(ignore -> settings.toString())).when(cryptoCreate("sender").balance(ignore -> settings.getInitialBalance()).payingWith(GENESIS).withRecharging().key(GENESIS).rechargeWindow(3).logging().hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED), cryptoCreate("receiver").payingWith(GENESIS).hasRetryPrecheckFrom(BUSY, DUPLICATE_TRANSACTION, PLATFORM_TRANSACTION_NOT_CREATED).key(GENESIS).logging(), withOpContext((spec, opLog) -> {
List<HapiSpecOperation> ops = new ArrayList<>();
for (int i = 0; i < AUTO_ACCOUNTS; i++) {
var alias = "alias" + i;
ops.add(newKeyNamed(alias));
ops.add(cryptoTransfer(tinyBarsFromToWithAlias(DEFAULT_PAYER, alias, ONE_HBAR)));
}
allRunFor(spec, ops);
})).then(defaultLoadTest(transferBurst, settings), getAccountBalance("sender").logged());
}
Aggregations