use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class OpcodeIntegTest method testOpcodesActors.
// ============================= test CALL, CALLCODE, DELEGATECALL =============================
@Test
public void testOpcodesActors() throws Exception {
RepositoryCache repo = blockchain.getRepository().startTracking();
AionAddress callerContract = deployContract(repo, "Caller", "Opcodes.sol", BigInteger.ZERO);
AionAddress calleeContract = deployContract(repo, "Callee", "Opcodes.sol", BigInteger.ZERO);
System.err.println("Deployer: " + deployer);
System.err.println("Caller: " + callerContract);
System.err.println("Callee: " + calleeContract);
long nrg = 1_000_000;
long nrgPrice = 1;
BigInteger nonce = BigInteger.TWO;
byte[] input = ByteUtil.merge(Hex.decode("fc68521a"), calleeContract.toByteArray());
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), callerContract, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
assertEquals("", summary.getReceipt().getError());
assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
// We examine the logs to determine the expected state. We expect to see
// owner-caller-origin-data as follows for each opcode:
//
// CALL --> CALLEE-CALLER-DEPLOYER-ZERO
// CALLCODE --> CALLER-CALLER-DEPLOYER-ZERO
// DELEGATECALL --> CALLER-DEPLOYER-DEPLOYER-ZERO
List<Log> logs = summary.getReceipt().getLogInfoList();
assertEquals(3, logs.size());
verifyLogData(logs.get(0).copyOfData(), calleeContract, callerContract, deployer);
verifyLogData(logs.get(1).copyOfData(), callerContract, callerContract, deployer);
verifyLogData(logs.get(2).copyOfData(), callerContract, deployer, deployer);
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class OpcodeIntegTest method testDelegateCallActors.
@Test
public void testDelegateCallActors() throws Exception {
RepositoryCache repo = blockchain.getRepository().startTracking();
AionAddress D = deployContract(repo, "D", "D.sol", BigInteger.ZERO);
AionAddress E = deployContract(repo, "E", "D.sol", BigInteger.ZERO);
BigInteger n = new BigInteger("23786523");
// Deployer calls contract D which performs DELEGATECALL to call contract E.
long nrg = 1_000_000;
long nrgPrice = 1;
BigInteger value = new BigInteger("4364463");
BigInteger nonce = BigInteger.TWO;
byte[] input = // use DELEGATECALL on E.
ByteUtil.merge(Hex.decode("32817e1d"), E.toByteArray());
// pass in 'n' also.
input = ByteUtil.merge(input, new DataWord(n).getData());
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, value.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
assertEquals(deployer, tx.getSenderAddress());
assertEquals(D, tx.getDestinationAddress());
BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
assertEquals("", summary.getReceipt().getError());
assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
// We expect there to be one internal transaction and it should look like deployer sent to
// D.
List<InternalTransaction> internalTxs = summary.getInternalTransactions();
assertEquals(1, internalTxs.size());
assertEquals(deployer, internalTxs.get(0).sender);
assertEquals(D, internalTxs.get(0).destination);
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class OpcodeIntegTest method deployContract.
// <-------------------------------------------------------------------------------------------->
/**
* Deploys the contract named contractName in the file named contractFilename with value value.
*/
private AionAddress deployContract(RepositoryCache repo, String contractName, String contractFilename, BigInteger value) throws Exception {
byte[] deployCode = ContractUtils.getContractDeployer(contractFilename, contractName);
long nrg = 1_000_000;
long nrgPrice = 1;
BigInteger nonce = repo.getNonce(deployer);
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), null, value.toByteArray(), deployCode, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
AionAddress contract = deployContract(repo, tx, contractName, contractFilename, value, nrg, nrgPrice, nonce);
deployerBalance = repo.getBalance(deployer);
return contract;
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class OpcodeIntegTest method testRevertAtBottomLevel.
@Test
public void testRevertAtBottomLevel() throws Exception {
RepositoryCache repo = blockchain.getRepository().startTracking();
AionAddress D = deployContract(repo, "F", "F.sol", BigInteger.ZERO);
long nrg = 1_000_000;
long nrgPrice = 1;
BigInteger nonce = BigInteger.ONE;
byte[] input = ByteUtil.merge(Hex.decode("8256cff3"), new DataWord(5).getData());
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
assertEquals("", summary.getReceipt().getError());
assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
// Check that the logs from our internal transactions are as we expect.
List<Log> logs = summary.getReceipt().getLogInfoList();
assertEquals(8, logs.size());
assertArrayEquals(new DataWord(0).getData(), logs.get(0).copyOfData());
assertArrayEquals(new DataWord(5).getData(), logs.get(1).copyOfData());
assertArrayEquals(new DataWord(4).getData(), logs.get(2).copyOfData());
assertArrayEquals(new DataWord(3).getData(), logs.get(3).copyOfData());
assertArrayEquals(new DataWord(2).getData(), logs.get(4).copyOfData());
assertArrayEquals(new DataWord(2).getData(), logs.get(5).copyOfData());
assertArrayEquals(new DataWord(2).getData(), logs.get(6).copyOfData());
assertArrayEquals(new DataWord(2).getData(), logs.get(7).copyOfData());
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class OpcodeIntegTest method testCallcodeValueTransfer.
@Test
public void testCallcodeValueTransfer() throws Exception {
RepositoryCache repo = blockchain.getRepository().startTracking();
AionAddress D = deployContract(repo, "D", "D.sol", BigInteger.ZERO);
AionAddress E = deployContract(repo, "E", "D.sol", BigInteger.ZERO);
BigInteger balanceDeployer = repo.getBalance(deployer);
BigInteger balanceD = repo.getBalance(D);
BigInteger balanceE = repo.getBalance(E);
// Deployer calls contract D which performs CALLCODE to call contract E.
long nrg = 1_000_000;
long nrgPrice = 1;
BigInteger value = new BigInteger("2387653");
BigInteger nonce = BigInteger.TWO;
byte[] input = // use CALLCODE on E.
ByteUtil.merge(Hex.decode("5cce9fc2"), E.toByteArray());
// pass in 'n' also.
input = ByteUtil.merge(input, new DataWord(0).getData());
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, value.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
assertEquals(deployer, tx.getSenderAddress());
assertEquals(D, tx.getDestinationAddress());
BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
assertEquals("", summary.getReceipt().getError());
assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
// We expect that deployer paid the txCost and sent value. We expect that D received value.
// We expect E had no value change.
BigInteger txCost = BigInteger.valueOf(summary.getNrgUsed().longValue() * nrgPrice);
assertEquals(balanceDeployer.subtract(value).subtract(txCost), repo.getBalance(deployer));
assertEquals(balanceD.add(value), repo.getBalance(D));
assertEquals(balanceE, repo.getBalance(E));
}
Aggregations