Skip to content

Commit

Permalink
Merge pull request #502 from omisego/458-refactor-wire-tx
Browse files Browse the repository at this point in the history
WireTransaction refactor
  • Loading branch information
kevsul committed Dec 12, 2019
2 parents e3f2deb + 2243744 commit d8c01a2
Show file tree
Hide file tree
Showing 105 changed files with 1,225 additions and 658 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
pragma solidity 0.5.11;
pragma experimental ABIEncoderV2;

import "../../src/transactions/FungibleTokenOutputModel.sol";

contract FungibleTokenOutputWrapper {
using RLPReader for bytes;
using RLPReader for RLPReader.RLPItem;

function decodeOutput(bytes memory encodedOutput)
public
pure
returns (FungibleTokenOutputModel.Output memory)
{
GenericTransaction.Output memory genericOutput = GenericTransaction.decodeOutput(encodedOutput.toRlpItem());
return FungibleTokenOutputModel.decodeOutput(genericOutput);
}

function getOutput(bytes memory transaction, uint16 outputIndex)
public
pure
returns (FungibleTokenOutputModel.Output memory)
{
GenericTransaction.Transaction memory genericTx = GenericTransaction.decode(transaction);
return FungibleTokenOutputModel.getOutput(genericTx, outputIndex);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pragma solidity 0.5.11;
pragma experimental ABIEncoderV2;

import "../../src/transactions/GenericTransaction.sol";

contract GenericTransactionWrapper {

function decode(bytes memory transaction) public pure returns (GenericTransaction.Transaction memory) {
return GenericTransaction.decode(transaction);
}

function getOutput(bytes memory transaction, uint16 outputIndex) public pure returns (GenericTransaction.Output memory) {
GenericTransaction.Transaction memory genericTx = GenericTransaction.decode(transaction);
return GenericTransaction.getOutput(genericTx, outputIndex);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,19 @@ pragma experimental ABIEncoderV2;
import "../../src/transactions/PaymentTransactionModel.sol";

contract PaymentTransactionModelMock {
using RLPReader for bytes;

function decode(bytes memory _transaction) public pure returns (PaymentTransactionModel.Transaction memory) {
PaymentTransactionModel.Transaction memory transaction = PaymentTransactionModel.decode(_transaction);
return transaction;
function decode(bytes memory transaction) public pure returns (PaymentTransactionModel.Transaction memory) {
return PaymentTransactionModel.decode(transaction);
}

function getOutputOwner(uint256 outputType, address owner, address token, uint256 amount) public pure returns (address payable) {
FungibleTokenOutputModel.Output memory output = FungibleTokenOutputModel.Output({
outputType: outputType,
outputGuard: bytes20(owner),
token: token,
amount: amount
});
return PaymentTransactionModel.getOutputOwner(output);
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ pragma experimental ABIEncoderV2;
import "../interfaces/IStateTransitionVerifier.sol";
import "../payment/PaymentExitDataModel.sol";
import "../../utils/UtxoPosLib.sol";
import "../../transactions/WireTransaction.sol";
import "../../transactions/FungibleTokenOutputModel.sol";
import "../../transactions/PaymentTransactionModel.sol";
import "../../transactions/outputs/PaymentOutputModel.sol";

import "openzeppelin-solidity/contracts/math/SafeMath.sol";

Expand All @@ -33,30 +32,33 @@ contract PaymentTransactionStateTransitionVerifier {
return false;
}

WireTransaction.Output[] memory inputs = new WireTransaction.Output[](inputTxs.length);
FungibleTokenOutputModel.Output[] memory inputs = new FungibleTokenOutputModel.Output[](inputTxs.length);
for (uint i = 0; i < inputTxs.length; i++) {
uint16 outputIndex = outputIndexOfInputTxs[i];
WireTransaction.Output memory output = WireTransaction.getOutput(inputTxs[i], outputIndex);
FungibleTokenOutputModel.Output memory output = FungibleTokenOutputModel.getOutput(
GenericTransaction.decode(inputTxs[i]),
outputIndex
);
inputs[i] = output;
}

PaymentTransactionModel.Transaction memory transaction = PaymentTransactionModel.decode(txBytes);
WireTransaction.Output[] memory outputs = new WireTransaction.Output[](transaction.outputs.length);
FungibleTokenOutputModel.Output[] memory outputs = new FungibleTokenOutputModel.Output[](transaction.outputs.length);
for (uint i = 0; i < transaction.outputs.length; i++) {
outputs[i] = WireTransaction.Output(
outputs[i] = FungibleTokenOutputModel.Output(
transaction.outputs[i].outputType,
transaction.outputs[i].amount,
transaction.outputs[i].outputGuard,
transaction.outputs[i].token
transaction.outputs[i].token,
transaction.outputs[i].amount
);
}

return _isCorrectStateTransition(inputs, outputs);
}

function _isCorrectStateTransition(
WireTransaction.Output[] memory inputs,
WireTransaction.Output[] memory outputs
FungibleTokenOutputModel.Output[] memory inputs,
FungibleTokenOutputModel.Output[] memory outputs
)
private
pure
Expand All @@ -66,8 +68,8 @@ contract PaymentTransactionStateTransitionVerifier {
uint i = 0;
while (correctTransition && i < outputs.length) {
address token = outputs[i].token;
WireTransaction.Output[] memory inputsForToken = filterWithToken(inputs, token);
WireTransaction.Output[] memory outputsForToken = filterWithToken(outputs, token);
FungibleTokenOutputModel.Output[] memory inputsForToken = filterWithToken(inputs, token);
FungibleTokenOutputModel.Output[] memory outputsForToken = filterWithToken(outputs, token);

correctTransition = isCorrectSpend(inputsForToken, outputsForToken);
i += 1;
Expand All @@ -76,12 +78,12 @@ contract PaymentTransactionStateTransitionVerifier {
}

function filterWithToken(
WireTransaction.Output[] memory outputs,
FungibleTokenOutputModel.Output[] memory outputs,
address token
)
private
pure
returns (WireTransaction.Output[] memory)
returns (FungibleTokenOutputModel.Output[] memory)
{
// Required for calculating the size of the filtered array
uint256 arraySize = 0;
Expand All @@ -91,7 +93,7 @@ contract PaymentTransactionStateTransitionVerifier {
}
}

WireTransaction.Output[] memory outputsWithToken = new WireTransaction.Output[](arraySize);
FungibleTokenOutputModel.Output[] memory outputsWithToken = new FungibleTokenOutputModel.Output[](arraySize);
uint j = 0;
for (uint i = 0; i < outputs.length; ++i) {
if (outputs[i].token == token) {
Expand All @@ -104,8 +106,8 @@ contract PaymentTransactionStateTransitionVerifier {
}

function isCorrectSpend(
WireTransaction.Output[] memory inputs,
WireTransaction.Output[] memory outputs
FungibleTokenOutputModel.Output[] memory inputs,
FungibleTokenOutputModel.Output[] memory outputs
)
internal
pure
Expand All @@ -116,7 +118,7 @@ contract PaymentTransactionStateTransitionVerifier {
return amountIn >= amountOut;
}

function sumAmounts(WireTransaction.Output[] memory outputs) private pure returns (uint256) {
function sumAmounts(FungibleTokenOutputModel.Output[] memory outputs) private pure returns (uint256) {
uint256 amount = 0;
for (uint i = 0; i < outputs.length; i++) {
amount = amount.add(outputs[i].amount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import "../../../utils/SafeEthTransfer.sol";
import "../../../utils/UtxoPosLib.sol";
import "../../../framework/PlasmaFramework.sol";
import "../../../transactions/PaymentTransactionModel.sol";
import "../../../transactions/WireTransaction.sol";
import "../../../transactions/GenericTransaction.sol";

library PaymentChallengeIFEInputSpent {
using UtxoPosLib for UtxoPosLib.UtxoPos;
Expand Down Expand Up @@ -131,11 +131,11 @@ library PaymentChallengeIFEInputSpent {
}

function verifySpendingCondition(ChallengeIFEData memory data) private view {
uint256 challengingTxType = WireTransaction.getTransactionType(data.args.challengingTx);
WireTransaction.Output memory output = WireTransaction.getOutput(data.args.challengingTx, data.args.challengingTxInputIndex);
GenericTransaction.Transaction memory challengingTx = GenericTransaction.decode(data.args.challengingTx);
GenericTransaction.Output memory output = GenericTransaction.getOutput(challengingTx, data.args.challengingTxInputIndex);

ISpendingCondition condition = data.controller.spendingConditionRegistry.spendingConditions(
output.outputType, challengingTxType
output.outputType, challengingTx.txType
);
require(address(condition) != address(0), "Spending condition contract not found");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import "../../../utils/UtxoPosLib.sol";
import "../../../utils/Merkle.sol";
import "../../../framework/PlasmaFramework.sol";
import "../../../transactions/PaymentTransactionModel.sol";
import "../../../transactions/WireTransaction.sol";
import "../../../transactions/GenericTransaction.sol";

library PaymentChallengeIFENotCanonical {
using UtxoPosLib for UtxoPosLib.UtxoPos;
Expand Down Expand Up @@ -98,7 +98,10 @@ library PaymentChallengeIFENotCanonical {
require(outputId == ife.inputs[args.inFlightTxInputIndex].outputId,
"Provided inputs data does not point to the same outputId from the in-flight exit");

WireTransaction.Output memory output = WireTransaction.getOutput(args.inputTx, inputUtxoPos.outputIndex());
GenericTransaction.Output memory output = GenericTransaction.getOutput(
GenericTransaction.decode(args.inputTx),
inputUtxoPos.outputIndex()
);

ISpendingCondition condition = self.spendingConditionRegistry.spendingConditions(
output.outputType, self.supportedTxType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import "../../utils/MoreVpFinalization.sol";
import "../../../utils/Merkle.sol";
import "../../../utils/SafeEthTransfer.sol";
import "../../../utils/UtxoPosLib.sol";
import "../../../transactions/WireTransaction.sol";
import "../../../transactions/GenericTransaction.sol";
import "../../../framework/PlasmaFramework.sol";
import "../../../transactions/PaymentTransactionModel.sol";

Expand Down Expand Up @@ -111,12 +111,12 @@ library PaymentChallengeIFEOutputSpent {
view
{
UtxoPosLib.UtxoPos memory utxoPos = UtxoPosLib.UtxoPos(args.outputUtxoPos);
uint256 challengingTxType = WireTransaction.getTransactionType(args.challengingTx);
WireTransaction.Output memory output = WireTransaction.getOutput(args.challengingTx, utxoPos.outputIndex());
GenericTransaction.Transaction memory challengingTx = GenericTransaction.decode(args.challengingTx);
GenericTransaction.Output memory output = GenericTransaction.getOutput(challengingTx, utxoPos.outputIndex());

ISpendingCondition condition = controller.spendingConditionRegistry.spendingConditions(
output.outputType,
challengingTxType
challengingTx.txType
);
require(address(condition) != address(0), "Spending condition contract not found");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ import "../../../framework/Protocol.sol";
import "../../../utils/SafeEthTransfer.sol";
import "../../../utils/UtxoPosLib.sol";
import "../../../transactions/PaymentTransactionModel.sol";
import "../../../transactions/WireTransaction.sol";
import "../../../transactions/outputs/PaymentOutputModel.sol";
import "../../../transactions/GenericTransaction.sol";

library PaymentChallengeStandardExit {
using UtxoPosLib for UtxoPosLib.UtxoPos;
Expand All @@ -37,6 +36,7 @@ library PaymentChallengeStandardExit {
Controller controller;
PaymentStandardExitRouterArgs.ChallengeStandardExitArgs args;
PaymentExitDataModel.StandardExit exitData;
uint256 challengeTxType;
}

/**
Expand Down Expand Up @@ -73,10 +73,13 @@ library PaymentChallengeStandardExit {
)
public
{
GenericTransaction.Transaction memory challengeTx = GenericTransaction.decode(args.challengeTx);

ChallengeStandardExitData memory data = ChallengeStandardExitData({
controller: self,
args: args,
exitData: exitMap.exits[args.exitId]
exitData: exitMap.exits[args.exitId],
challengeTxType: challengeTx.txType
});
verifyChallengeExitExists(data);
verifyChallengeTxProtocolFinalized(data);
Expand Down Expand Up @@ -104,13 +107,12 @@ library PaymentChallengeStandardExit {
PaymentStandardExitRouterArgs.ChallengeStandardExitArgs memory args = data.args;

UtxoPosLib.UtxoPos memory utxoPos = UtxoPosLib.UtxoPos(data.exitData.utxoPos);
PaymentOutputModel.Output memory output = PaymentTransactionModel
FungibleTokenOutputModel.Output memory output = PaymentTransactionModel
.decode(args.exitingTx)
.outputs[utxoPos.outputIndex()];

uint256 challengeTxType = WireTransaction.getTransactionType(args.challengeTx);
ISpendingCondition condition = data.controller.spendingConditionRegistry.spendingConditions(
output.outputType, challengeTxType
output.outputType, data.challengeTxType
);
require(address(condition) != address(0), "Spending condition contract not found");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ import "../../utils/ExitableTimestamp.sol";
import "../../utils/ExitId.sol";
import "../../../framework/PlasmaFramework.sol";
import "../../../framework/interfaces/IExitProcessor.sol";
import "../../../transactions/outputs/PaymentOutputModel.sol";
import "../../../transactions/PaymentTransactionModel.sol";
import "../../../utils/UtxoPosLib.sol";

library PaymentPiggybackInFlightExit {
using UtxoPosLib for UtxoPosLib.UtxoPos;
using ExitableTimestamp for ExitableTimestamp.Calculator;
using PaymentInFlightExitModelUtils for PaymentExitDataModel.InFlightExit;
using PaymentOutputModel for PaymentOutputModel.Output;

struct Controller {
PlasmaFramework framework;
Expand Down

0 comments on commit d8c01a2

Please sign in to comment.