Repository navigation
Expand file tree
/
Copy pathCertifiedMintTransaction.java
More file actions
145 lines (124 loc) · 4.42 KB
/
Copy pathCertifiedMintTransaction.java
File metadata and controls
145 lines (124 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package org.unicitylabs.sdk.transaction;
import org.unicitylabs.sdk.api.InclusionProof;
import org.unicitylabs.sdk.api.bft.RootTrustBase;
import org.unicitylabs.sdk.crypto.hash.DataHash;
import org.unicitylabs.sdk.predicate.Predicate;
import org.unicitylabs.sdk.predicate.verification.PredicateVerifierService;
import org.unicitylabs.sdk.serializer.cbor.CborDeserializer;
import org.unicitylabs.sdk.serializer.cbor.CborSerializer;
import org.unicitylabs.sdk.transaction.verification.InclusionProofVerificationRule;
import org.unicitylabs.sdk.transaction.verification.InclusionProofVerificationStatus;
import org.unicitylabs.sdk.util.verification.VerificationException;
import org.unicitylabs.sdk.util.verification.VerificationResult;
import java.util.List;
import java.util.Optional;
/**
* Mint transaction bundled with an inclusion proof.
*/
public class CertifiedMintTransaction implements Transaction {
private final MintTransaction transaction;
private final InclusionProof inclusionProof;
private CertifiedMintTransaction(MintTransaction transaction, InclusionProof inclusionProof) {
this.transaction = transaction;
this.inclusionProof = inclusionProof;
}
@Override
public Optional<byte[]> getData() {
return this.transaction.getData();
}
@Override
public Predicate getLockScript() {
return this.transaction.getLockScript();
}
@Override
public Predicate getRecipient() {
return this.transaction.getRecipient();
}
@Override
public DataHash getSourceStateHash() {
return this.transaction.getSourceStateHash();
}
/**
* Returns the token identifier.
*
* @return token id
*/
public TokenId getTokenId() {
return this.transaction.getTokenId();
}
/**
* Returns the token type.
*
* @return token type
*/
public TokenType getTokenType() {
return this.transaction.getTokenType();
}
public Optional<byte[]> getJustification() {
return this.transaction.getJustification();
}
@Override
public byte[] getStateMask() {
return this.transaction.getStateMask();
}
/**
* Returns the inclusion proof certifying this transaction.
*
* @return inclusion proof
*/
public InclusionProof getInclusionProof() {
return this.inclusionProof;
}
/**
* Deserializes a certified mint transaction from CBOR.
*
* @param bytes CBOR-encoded certified mint transaction
* @return decoded certified mint transaction
*/
public static CertifiedMintTransaction fromCbor(byte[] bytes) {
List<byte[]> data = CborDeserializer.decodeArray(bytes, 2);
return new CertifiedMintTransaction(MintTransaction.fromCbor(data.get(0)),
InclusionProof.fromCbor(data.get(1)));
}
/**
* Creates a certified mint transaction after verifying the inclusion proof.
*
* @param trustBase trust base used to verify inclusion proof signatures
* @param predicateVerifier service used for predicate verification during proof validation
* @param transaction mint transaction to certify
* @param inclusionProof inclusion proof for the transaction
* @return certified mint transaction
* @throws VerificationException if inclusion proof verification fails
*/
public static CertifiedMintTransaction fromTransaction(RootTrustBase trustBase,
PredicateVerifierService predicateVerifier, MintTransaction transaction,
InclusionProof inclusionProof) {
VerificationResult<InclusionProofVerificationStatus> result = InclusionProofVerificationRule.verify(
trustBase,
predicateVerifier,
inclusionProof,
transaction
);
if (result.getStatus() != InclusionProofVerificationStatus.OK) {
throw new VerificationException("Inclusion proof verification failed", result);
}
return new CertifiedMintTransaction(transaction, inclusionProof);
}
@Override
public DataHash calculateStateHash() {
return this.transaction.calculateStateHash();
}
@Override
public DataHash calculateTransactionHash() {
return this.transaction.calculateTransactionHash();
}
@Override
public byte[] toCbor() {
return CborSerializer.encodeArray(this.transaction.toCbor(), this.inclusionProof.toCbor());
}
@Override
public String toString() {
return String.format("CertifiedMintTransaction{transaction=%s, inclusionProof=%s}",
this.transaction, this.inclusionProof);
}
}