我在IOUStateTests中进行的所有测试均通过,但我编写“ pay”方法的测试除外。我写的如下。
我收到Token mismatch: USD vs GBP
错误。默认情况下,Corda是否将美元作为货币?如问题陈述中所述,“ IOUState类”的一个属性,即“付费”以磅为单位初始化。我也一样我已将其复制到类中的“付款”方法中,并将其添加到“已付款”中。但是得到上面的错误。请帮忙:)
这是使用Kotlin开发的CorDapp。
data class IOUState(val amount: Amount<Currency>,
val lender:Party,
val borrower:Party,
val paid: Amount<Currency> = POUNDS(0),
override val linearId : UniqueIdentifier = UniqueIdentifier()): LinearState {
override val participants: List<Party> get() = listOf(lender, borrower)
fun pay(amountToPay: Amount<Currency>) = copy(paid = paid.plus(amountToPay))
}
我希望方法'pay'
以磅为单位返回'paid'
和'amountToPay'
的加法。但是我得到一个错误,'paid '
在POUNDS中,而amountToPay
在USD中。所以,无法添加。
答案 0 :(得分:0)
您在已定义的IOUState中的付费属性设置为“磅”。导致出现此错误的唯一合理的解释是,您正在向薪水函数传递一些美元金额。
答案 1 :(得分:0)
您当前的解决方案将“付费”字段初始化为零磅。对于支付字段,货币令牌被硬编码为POUND。
这是当将任何其他货币作为付费方法的参数传递时代码中断的原因。
在IOUStateTests类的前几个测试中,使用POUND量。这与您当前的代码配合得很好。但是,一旦您还执行了以后的测试(使用DOLLAR Amounts进行测试),您的代码就会中断。
您不应在代码中对货币进行硬编码。
该问题的潜在解决方案是根据所传递的金额初始化付费字段。您可以在初始化支付字段时引用传递的金额值。
以下内容对我有用:
@BelongsToContract(IOUContract::class)
data class IOUState(
val amount: Amount<java.util.Currency>,
val lender: Party,
val borrower: Party,
val paid: Amount<java.util.Currency> = Amount.zero(amount.token),
override val linearId: UniqueIdentifier = UniqueIdentifier()
): ContractState, LinearState {
override val participants: List<Party> get() = listOf(lender, borrower)
fun pay(paid: Amount<Currency>) = this.copy(paid = this.paid.plus(paid))
}
不是将Currency令牌硬编码为POUND或DOLLAR;我们可以使用amount参数的货币令牌。
使用此解决方案,所有测试都可以通过,而无需更改测试中使用的币种: