Skip to content

Commit b41ebc1

Browse files
feat: normalize exit codes for ocr
1 parent 9763931 commit b41ebc1

File tree

11 files changed

+215
-119
lines changed

11 files changed

+215
-119
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// getFacilityId(stringCrc32(com.chainlink.ton.lib.ocr.MultiOCR3Base))
2+
const MultiOCR3Base_FACILITY_ID = 31;
3+
const MultiOCR3Base_ERROR_CODE = MultiOCR3Base_FACILITY_ID * 100
4+
5+
enum MultiOCR3Base_Error {
6+
BigFMustBePositive = MultiOCR3Base_ERROR_CODE;
7+
StaticConfigCannotBeChanged
8+
TooManySigners
9+
BigFTooHigh
10+
TooManyTransmitters
11+
NoTransmitters
12+
RepeatedSigners
13+
RepeatedTransmitters
14+
ConfigDigestMismatch
15+
UnauthorizedTransmitter
16+
WrongNumberOfSignatures
17+
UnauthorizedSigner
18+
NonUniqueSignatures
19+
InvalidSignature
20+
NonExistentOcrPluginType
21+
NoSigners
22+
}

contracts/contracts/lib/ocr/exit_codes.tolk

Lines changed: 0 additions & 16 deletions
This file was deleted.

contracts/contracts/lib/ocr/multi_ocr3_base.tolk

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import "./types.tolk";
2-
import "./exit_codes.tolk";
31
import "./../utils.tolk";
2+
import "types.tolk";
3+
import "errors";
44

55

66
const OCR3BASE_CONFIG_SET_TOPIC: int = stringCrc32("OCR3Base_ConfigSet");
@@ -67,12 +67,12 @@ fun OCR3Base.getConfig(self, ocrPluginType: uint16): OCRConfig? {
6767
}
6868
return self.execute!.load();
6969
} else {
70-
throw ERROR_NON_EXISTENT_OCR_PLUGIN_TYPE;
70+
throw MultiOCR3Base_Error.NonExistentOcrPluginType;
7171
}
7272
}
7373

7474
fun OCR3Base.setOcr3Config(mutate self, msg: OCR3Base_SetOCR3Config) {
75-
assert(msg.bigF > 0, ERROR_BIG_F_MUST_BE_POSITIVE);
75+
assert(msg.bigF > 0, MultiOCR3Base_Error.BigFMustBePositive);
7676

7777
var ocrConfig = self.getConfig(msg.ocrPluginType);
7878
if (ocrConfig == null) {
@@ -86,21 +86,21 @@ fun OCR3Base.setOcr3Config(mutate self, msg: OCR3Base_SetOCR3Config) {
8686
} else {
8787
assert(
8888
ocrConfig.configInfo.isSignatureVerificationEnabled == msg.isSignatureVerificationEnabled,
89-
ERROR_STATIC_CONFIG_CANNOT_BE_CHANGED
89+
MultiOCR3Base_Error.StaticConfigCannotBeChanged
9090
);
9191
}
9292
val transmitters_length = countAddresses(msg.transmitters);
9393
// val transmitters_length = msg.transmitters.iter().size(ADDR_KEY_LEN);
9494

95-
assert(transmitters_length <= MAX_NUM_ORACLES, ERROR_TOO_MANY_TRANSMITTERS);
96-
assert(transmitters_length > 0, ERROR_NO_TRANSMITTERS);
95+
assert(transmitters_length <= MAX_NUM_ORACLES, MultiOCR3Base_Error.TooManyTransmitters);
96+
assert(transmitters_length > 0, MultiOCR3Base_Error.NoTransmitters);
9797

9898
if (msg.isSignatureVerificationEnabled) {
9999
val signers_length = msg.signers.iter().countBytes() / 32;
100-
assert(signers_length > 0, ERROR_NO_SIGNERS);
101-
assert(signers_length <= MAX_NUM_ORACLES, ERROR_TOO_MANY_SIGNERS);
102-
assert(signers_length > 3 * msg.bigF, ERROR_BIG_F_TOO_HIGH);
103-
assert(signers_length >= transmitters_length, ERROR_TOO_MANY_TRANSMITTERS);
100+
assert(signers_length > 0, MultiOCR3Base_Error.NoSigners);
101+
assert(signers_length <= MAX_NUM_ORACLES, MultiOCR3Base_Error.TooManySigners);
102+
assert(signers_length > 3 * msg.bigF, MultiOCR3Base_Error.BigFTooHigh);
103+
assert(signers_length >= transmitters_length, MultiOCR3Base_Error.TooManyTransmitters);
104104
ocrConfig.configInfo.n = signers_length;
105105
ocrConfig.assignSignerOracles(msg.signers);
106106
}
@@ -133,24 +133,24 @@ fun OCR3Base.transmit(
133133
signatures: SnakedCell<SignatureEd25519>,
134134
) {
135135
var ocrConfig = self.getConfig(ocrPluginType);
136-
assert(ocrConfig != null, ERROR_NON_EXISTENT_OCR_PLUGIN_TYPE);
136+
assert(ocrConfig != null, MultiOCR3Base_Error.NonExistentOcrPluginType);
137137
ocrConfig = ocrConfig!;
138138
var configInfo: ConfigInfo = ocrConfig.configInfo;
139139

140140
// EVM checks transaction data length here, it's probably too expensive to do this in TON
141141

142-
assert(reportContext.configDigest == configInfo.configDigest, ERROR_CONFIG_DIGEST_MISMATCH);
142+
assert(reportContext.configDigest == configInfo.configDigest, MultiOCR3Base_Error.ConfigDigestMismatch);
143143

144144
// EVM checks assert_chain_not_forked, this is not necessary in TON
145145

146146
val pluginTransmitters = ocrConfig.transmitters;
147147

148-
assert(pluginTransmitters.get(transmitter).isFound, ERROR_UNAUTHORIZED_TRANSMITTER);
148+
assert(pluginTransmitters.get(transmitter).isFound, MultiOCR3Base_Error.UnauthorizedTransmitter);
149149

150150
if (configInfo.isSignatureVerificationEnabled) {
151151
var expectedSignatures = configInfo.bigF + 1;
152152
val signatures_length = signatures.iter().countBytes() / 96; //expensive
153-
assert(signatures_length == expectedSignatures, ERROR_WRONG_NUMBER_OF_SIGNATURES);
153+
assert(signatures_length == expectedSignatures, MultiOCR3Base_Error.WrongNumberOfSignatures);
154154
var hashedReport = self.hashReport(report, reportContext);
155155
var pluginSigners = ocrConfig.signers;
156156

@@ -188,11 +188,11 @@ fun OCR3Base.verifySignature(
188188

189189
val entry = signers.get(signer);
190190
val authorized= entry.isFound;
191-
assert(authorized, ERROR_UNAUTHORIZED_SIGNER);
191+
assert(authorized, MultiOCR3Base_Error.UnauthorizedSigner);
192192
val signerIndex = entry.loadValue();
193-
assert(isSignatureValid(hashedReport,signature.toCell().beginParse().skipBits(256), signer), ERROR_INVALID_SIGNATURE);
193+
assert(isSignatureValid(hashedReport,signature.toCell().beginParse().skipBits(256), signer), MultiOCR3Base_Error.InvalidSignature);
194194

195-
assert(!seen.has(signerIndex!), ERROR_NON_UNIQUE_SIGNATURES);
195+
assert(!seen.has(signerIndex!), MultiOCR3Base_Error.NonUniqueSignatures);
196196
seen.set(signerIndex!);
197197
}
198198
}

contracts/contracts/lib/ocr/types.tolk

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import "./../utils.tolk";
2-
import "./exit_codes.tolk";
2+
import "errors";
33

44
// Maximum number of oracles the offchain reporting protocol is designed for
55
const MAX_NUM_ORACLES: int = 255;
@@ -33,7 +33,7 @@ fun OCRConfig.assignSignerOracles(
3333
var i = 0;
3434
while (!signersIt.empty()) {
3535
val signer = signersIt.next();
36-
assert(!signersMap.get(signer).isFound, ERROR_REPEATED_SIGNERS);
36+
assert(!signersMap.get(signer).isFound, MultiOCR3Base_Error.RepeatedSigners);
3737
i = i + 1;
3838
signersMap.set(
3939
signer,
@@ -52,7 +52,7 @@ fun OCRConfig.assignTransmitterOracles(
5252
var i = 0;
5353
while (!transmittersIt.empty()) {
5454
val transmitter = transmittersIt.next();
55-
assert(!transmittersMap.get(transmitter).isFound, ERROR_REPEATED_TRANSMITTERS);
55+
assert(!transmittersMap.get(transmitter).isFound, MultiOCR3Base_Error.RepeatedTransmitters);
5656
i = i + 1;
5757
transmittersMap.set(
5858
transmitter,

contracts/contracts/test/examples/ocr3_base.tolk

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import "@stdlib/lisp-lists";
21
import "./../../lib/ocr/multi_ocr3_base.tolk";
32
import "./../../lib/ocr/types.tolk";
4-
import "./../../lib/ocr/exit_codes.tolk";
53
import "./../../lib/utils.tolk";
4+
import "../../lib/ocr/errors";
65

76
struct OCR3BaseExampleContract {
87
contractId: uint64;
@@ -60,14 +59,14 @@ fun onInternalMessage(in: InMessage) {
6059
get fun ocr3ConfigInfo(ocrPluginType: uint16): ConfigInfo {
6160
val s = lazy OCR3BaseExampleContract.load();
6261
val config = s.ocr3Base.getConfig(ocrPluginType);
63-
assert(config != null, ERROR_NON_EXISTENT_OCR_PLUGIN_TYPE);
62+
assert(config != null, MultiOCR3Base_Error.NonExistentOcrPluginType);
6463
return config!.configInfo;
6564
}
6665

6766
get fun ocr3Signers(ocrPluginType: uint16): tuple? {
6867
val s = lazy OCR3BaseExampleContract.load();
6968
val config = s.ocr3Base.getConfig(ocrPluginType);
70-
assert(config != null, ERROR_NON_EXISTENT_OCR_PLUGIN_TYPE);
69+
assert(config != null, MultiOCR3Base_Error.NonExistentOcrPluginType);
7170
var d = config!.signers;
7271

7372
return keysLispList(d);
@@ -76,7 +75,7 @@ get fun ocr3Signers(ocrPluginType: uint16): tuple? {
7675
get fun ocr3Transmitters(ocrPluginType: uint16): tuple? {
7776
val s = lazy OCR3BaseExampleContract.load();
7877
val config = s.ocr3Base.getConfig(ocrPluginType);
79-
assert(config != null, ERROR_NON_EXISTENT_OCR_PLUGIN_TYPE);
78+
assert(config != null, MultiOCR3Base_Error.NonExistentOcrPluginType);
8079
var d = config!.transmitters;
8180

8281
return keysLispList(d);

0 commit comments

Comments
 (0)