use of org.aion.precompiled.PrecompiledTransactionResult in project aion by aionnetwork.
the class TotalCurrencyContractTest method TestSubtractTotalAmount.
@Test
public void TestSubtractTotalAmount() {
System.out.println("Running TestSubtractTotalAmount.");
// First give some positive balance to take away.
byte[] input = constructUpdateInput((byte) 0x0, (byte) 0x0);
tcc.execute(input, COST);
tcc.execute(input, COST);
tcc.execute(input, COST);
// Remove the balance.
input = constructUpdateInput((byte) 0x0, (byte) 0x1);
tcc.execute(input, COST);
PrecompiledTransactionResult res = tcc.execute(new byte[] { (byte) 0x0 }, COST);
assertTrue(res.getStatus().isSuccess());
assertEquals(AMT.multiply(BigInteger.valueOf(2)), new BigInteger(res.getReturnData()));
tcc.execute(input, COST);
tcc.execute(input, COST);
res = tcc.execute(new byte[] { (byte) 0x0 }, COST);
assertTrue(res.getStatus().isSuccess());
assertEquals(BigInteger.ZERO, new BigInteger(res.getReturnData()));
}
use of org.aion.precompiled.PrecompiledTransactionResult in project aion by aionnetwork.
the class TotalCurrencyContractTest method TestGetTotalAmountEmptyPayload.
@Test
public void TestGetTotalAmountEmptyPayload() {
System.out.println("Running TestGetTotalAmountEmptyPayload.");
// zero size input
byte[] payload = new byte[0];
PrecompiledTransactionResult res = tcc.execute(payload, COST);
System.out.println("Contract result: " + res.toString());
assertTrue(res.getStatus().isFailed());
}
use of org.aion.precompiled.PrecompiledTransactionResult in project aion by aionnetwork.
the class TotalCurrencyContractTest method TestUpdateTotalIncorrectSig.
@Test
public void TestUpdateTotalIncorrectSig() {
System.out.println("Running TestUpdateTotalIncorrectSig.");
byte[] input = constructUpdateInput((byte) 0x0, (byte) 0x0);
// flip a bit
input[30] = (byte) ~input[30];
PrecompiledTransactionResult res = tcc.execute(input, COST);
assertEquals("FAILURE", res.getStatus().causeOfError);
assertEquals(0L, res.getEnergyRemaining());
}
use of org.aion.precompiled.PrecompiledTransactionResult in project aion by aionnetwork.
the class TokenBridgeContractTest method testMemberCount.
@Test
public void testMemberCount() {
// override defaults
this.contract = new TokenBridgeContract(context(OWNER_ADDR, CONTRACT_ADDR), ExternalStateForTests.usingRepository(this.repository), OWNER_ADDR, CONTRACT_ADDR);
this.connector = this.contract.getConnector();
ListFVM encodingList = new ListFVM();
for (byte[] k : members) {
encodingList.add(new AddressFVM(k));
}
byte[] payload = new AbiEncoder(BridgeFuncSig.SIG_RING_INITIALIZE.getSignature(), encodingList).encodeBytes();
PrecompiledTransactionResult result = this.contract.execute(payload, DEFAULT_NRG);
assertEquals(result.getStatus(), TransactionStatus.successful());
// try before
byte[] callPayload = new AbiEncoder(BridgeFuncSig.PURE_MEMBER_COUNT.getSignature(), encodingList).encodeBytes();
PrecompiledTransactionResult transferResult = this.contract.execute(callPayload, DEFAULT_NRG);
assertTrue(transferResult.getStatus().isSuccess());
assertThat(transferResult.getReturnData()).isEqualTo(new DataWord(new BigInteger("5")).getData());
// explicitly set the member count to 10
this.connector.setMemberCount(10);
// try after
byte[] callPayload2 = new AbiEncoder(BridgeFuncSig.PURE_MEMBER_COUNT.getSignature(), encodingList).encodeBytes();
PrecompiledTransactionResult transferResult2 = this.contract.execute(callPayload2, DEFAULT_NRG);
assertTrue(transferResult2.getStatus().isSuccess());
assertThat(transferResult2.getReturnData()).isEqualTo(new DataWord(new BigInteger("10")).getData());
}
use of org.aion.precompiled.PrecompiledTransactionResult in project aion by aionnetwork.
the class TokenBridgeContractTest method testTransferNotRelayer.
@Test
public void testTransferNotRelayer() {
// override defaults
PrecompiledTransactionContext initializationContext = context(OWNER_ADDR, CONTRACT_ADDR);
this.contract = new TokenBridgeContract(initializationContext, ExternalStateForTests.usingRepository(this.repository), OWNER_ADDR, CONTRACT_ADDR);
this.connector = this.contract.getConnector();
ListFVM encodingList = new ListFVM();
for (byte[] k : members) {
encodingList.add(new AddressFVM(k));
}
byte[] payload = new AbiEncoder(BridgeFuncSig.SIG_RING_INITIALIZE.getSignature(), encodingList).encodeBytes();
PrecompiledTransactionResult result = this.contract.execute(payload, DEFAULT_NRG);
assertEquals(result.getStatus(), TransactionStatus.successful());
// set relayer
byte[] callPayload = new AbiEncoder(BridgeFuncSig.SIG_SET_RELAYER.getSignature(), new AddressFVM(members[0])).encodeBytes();
PrecompiledTransactionResult transferResult = this.contract.execute(callPayload, DEFAULT_NRG);
assertTrue(transferResult.getStatus().isSuccess());
// override defaults
this.repository.addBalance(CONTRACT_ADDR, BigInteger.TEN);
// we create a new token bridge contract here because we
// need to change the execution context
PrecompiledTransactionContext submitBundleContext = context(new AionAddress(members[0]), CONTRACT_ADDR);
this.contract = new TokenBridgeContract(submitBundleContext, ExternalStateForTests.usingRepository(this.repository), OWNER_ADDR, CONTRACT_ADDR);
this.connector = this.contract.getConnector();
// assemble the payload
byte[] blockHash = capabilities.blake2b("blockHash".getBytes());
BridgeTransfer[] transfers = new BridgeTransfer[10];
for (int i = 0; i < 10; i++) {
// generate a unique sourceTransactionHash for each transfer
byte[] sourceTransactionHash = capabilities.blake2b(Integer.toString(i).getBytes());
transfers[i] = BridgeTransfer.getInstance(BigInteger.ONE, capabilities.computeA0Address(capabilities.blake2b(Integer.toHexString(i).getBytes())), sourceTransactionHash);
}
byte[] payloadHash = BridgeUtilities.computeBundleHash(blockHash, transfers);
// ATB-4, do one assert here to check that transactionHash is not set
assertThat(this.contract.execute(ByteUtil.merge(BridgeFuncSig.PURE_ACTION_MAP.getBytes(), payloadHash), 21000L).getReturnData()).isEqualTo(ByteUtil.EMPTY_WORD);
byte[][] signatures = new byte[members.length][];
int i = 0;
for (byte[] k : members) {
signatures[i] = capabilities.sign(k, payloadHash);
i++;
}
ListFVM sourceTransactionList = new ListFVM();
ListFVM addressList = new ListFVM();
ListFVM uintList = new ListFVM();
for (BridgeTransfer b : transfers) {
sourceTransactionList.add(new AddressFVM(b.getSourceTransactionHash()));
addressList.add(new AddressFVM(b.getRecipient()));
uintList.add(new Uint128FVM(PrecompiledUtilities.pad(b.getTransferValue().toByteArray(), 16)));
}
ListFVM sigChunk1 = new ListFVM();
ListFVM sigChunk2 = new ListFVM();
ListFVM sigChunk3 = new ListFVM();
for (byte[] sig : signatures) {
sigChunk1.add(new AddressFVM(Arrays.copyOfRange(sig, 0, 32)));
sigChunk2.add(new AddressFVM(Arrays.copyOfRange(sig, 32, 64)));
sigChunk3.add(new AddressFVM(Arrays.copyOfRange(sig, 64, 96)));
}
// we create a new token bridge contract here because we
// need to change the execution context
PrecompiledTransactionContext incorrectRelaySubmitBundleContext = context(AddressUtils.ZERO_ADDRESS, CONTRACT_ADDR);
this.contract = new TokenBridgeContract(incorrectRelaySubmitBundleContext, ExternalStateForTests.usingRepository(this.repository), OWNER_ADDR, CONTRACT_ADDR);
this.connector = this.contract.getConnector();
callPayload = new AbiEncoder(BridgeFuncSig.SIG_SUBMIT_BUNDLE.getSignature(), new AddressFVM(blockHash), sourceTransactionList, addressList, uintList, sigChunk1, sigChunk2, sigChunk3).encodeBytes();
transferResult = this.contract.execute(callPayload, DEFAULT_NRG);
assertEquals("FAILURE", transferResult.getStatus().causeOfError);
}
Aggregations