Fix cash exit generation

This commit is contained in:
Ross Nicoll 2016-09-02 18:15:58 +01:00
parent 116bb7c1ba
commit d012931a4f
4 changed files with 8 additions and 3 deletions

View File

@ -452,6 +452,7 @@ class Obligation<P> : Contract {
assetStates: List<StateAndRef<Obligation.State<P>>>): PublicKey
= Clauses.ConserveAmount<P>().generateExit(tx, amountIssued, assetStates,
deriveState = { state, amount, owner -> state.copy(data = state.data.move(amount, owner)) },
generateMoveCommand = { -> Commands.Move() },
generateExitCommand = { amount -> Commands.Exit(amount) }
)

View File

@ -42,6 +42,7 @@ abstract class OnLedgerAsset<T : Any, C: CommandData, S : FungibleAsset<T>> : Co
assetStates: List<StateAndRef<S>>): PublicKey
= conserveClause.generateExit(tx, amountIssued, assetStates,
deriveState = { state, amount, owner -> deriveState(state, amount, owner) },
generateMoveCommand = { -> generateMoveCommand() },
generateExitCommand = { amount -> generateExitCommand(amount) }
)

View File

@ -52,6 +52,7 @@ abstract class AbstractConserveAmount<S : FungibleAsset<T>, C : CommandData, T :
fun generateExit(tx: TransactionBuilder, amountIssued: Amount<Issued<T>>,
assetStates: List<StateAndRef<S>>,
deriveState: (TransactionState<S>, Amount<Issued<T>>, PublicKey) -> TransactionState<S>,
generateMoveCommand: () -> CommandData,
generateExitCommand: (Amount<Issued<T>>) -> CommandData): PublicKey {
val owner = assetStates.map { it.state.data.owner }.toSet().single()
val currency = amountIssued.token.product
@ -78,6 +79,7 @@ abstract class AbstractConserveAmount<S : FungibleAsset<T>, C : CommandData, T :
for (state in gathered) tx.addInputState(state)
for (state in outputs) tx.addOutputState(state)
tx.addCommand(generateMoveCommand())
tx.addCommand(generateExitCommand(amountIssued), amountIssued.token.issuer.party.owningKey)
return amountIssued.token.issuer.party.owningKey
}

View File

@ -441,9 +441,10 @@ class CashTests {
assertEquals(WALLET[0].ref, wtx.inputs[0])
assertEquals(0, wtx.outputs.size)
val expected = Cash.Commands.Exit(Amount(10000, Issued(MEGA_CORP.ref(1), USD)))
val actual = wtx.commands.single().value
assertEquals(expected, actual)
val expectedMove = Cash.Commands.Move()
val expectedExit = Cash.Commands.Exit(Amount(10000, Issued(MEGA_CORP.ref(1), USD)))
assertEquals(listOf(expectedMove, expectedExit), wtx.commands.map { it.value })
}
/**