20 #include <ripple/app/misc/LoadFeeTrack.h>
21 #include <ripple/app/misc/TxQ.h>
22 #include <ripple/basics/SubmitSync.h>
23 #include <ripple/basics/contract.h>
24 #include <ripple/beast/unit_test.h>
25 #include <ripple/core/ConfigSections.h>
26 #include <ripple/json/json_reader.h>
27 #include <ripple/protocol/ErrorCodes.h>
28 #include <ripple/protocol/Feature.h>
29 #include <ripple/rpc/impl/TransactionSign.h>
31 #include <test/jtx/envconfig.h>
54 char const* description_,
76 "command": "doesnt_matter",
77 "secret": "masterpassphrase",
79 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
80 "Amount": "1000000000",
81 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
82 "TransactionType": "Payment"
87 "Missing field 'account'.",
88 "Missing field 'tx_json.Sequence'."}}},
90 {
"Pass in Fee with minimal payment.",
93 "command": "doesnt_matter",
94 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
95 "secret": "masterpassphrase",
98 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
99 "Amount": "1000000000",
100 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
101 "TransactionType": "Payment"
106 "Missing field 'tx_json.Sequence'.",
107 "Missing field 'tx_json.Sequence'."}}},
109 {
"Pass in Sequence.",
112 "command": "doesnt_matter",
113 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
114 "secret": "masterpassphrase",
117 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
118 "Amount": "1000000000",
119 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
120 "TransactionType": "Payment"
125 "Missing field 'tx_json.Fee'.",
126 "Missing field 'tx_json.SigningPubKey'."}}},
128 {
"Pass in Sequence and Fee with minimal payment.",
131 "command": "doesnt_matter",
132 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
133 "secret": "masterpassphrase",
137 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
138 "Amount": "1000000000",
139 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
140 "TransactionType": "Payment"
145 "A Signer may not be the transaction's Account "
146 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
147 "Missing field 'tx_json.SigningPubKey'."}}},
149 {
"Add 'fee_mult_max' field.",
152 "command": "doesnt_matter",
153 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
154 "secret": "masterpassphrase",
158 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
159 "Amount": "1000000000",
160 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
161 "TransactionType": "Payment"
166 "Missing field 'tx_json.Fee'.",
167 "Missing field 'tx_json.SigningPubKey'."}}},
169 {
"Add 'fee_mult_max' and 'fee_div_max' field.",
172 "command": "doesnt_matter",
173 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
174 "secret": "masterpassphrase",
179 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
180 "Amount": "1000000000",
181 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
182 "TransactionType": "Payment"
187 "Missing field 'tx_json.Fee'.",
188 "Missing field 'tx_json.SigningPubKey'."}}},
190 {
"fee_mult_max is ignored if 'Fee' is present.",
193 "command": "doesnt_matter",
194 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
195 "secret": "masterpassphrase",
200 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
201 "Amount": "1000000000",
202 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
203 "TransactionType": "Payment"
208 "A Signer may not be the transaction's Account "
209 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
210 "Missing field 'tx_json.SigningPubKey'."}}},
212 {
"fee_div_max is ignored if 'Fee' is present.",
215 "command": "doesnt_matter",
216 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
217 "secret": "masterpassphrase",
223 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
224 "Amount": "1000000000",
225 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
226 "TransactionType": "Payment"
231 "A Signer may not be the transaction's Account "
232 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
233 "Missing field 'tx_json.SigningPubKey'."}}},
235 {
"Invalid 'fee_mult_max' field.",
238 "command": "doesnt_matter",
239 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
240 "secret": "masterpassphrase",
241 "fee_mult_max": "NotAFeeMultiplier",
244 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
245 "Amount": "1000000000",
246 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
247 "TransactionType": "Payment"
250 {{"Invalid field 'fee_mult_max', not a positive integer.",
251 "Invalid field 'fee_mult_max', not a positive integer.",
252 "Missing field 'tx_json.Fee'.",
253 "Missing field 'tx_json.SigningPubKey'."}}},
255 {
"Invalid 'fee_div_max' field.",
258 "command": "doesnt_matter",
259 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
260 "secret": "masterpassphrase",
262 "fee_div_max": "NotAFeeMultiplier",
265 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
266 "Amount": "1000000000",
267 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
268 "TransactionType": "Payment"
271 {{"Invalid field 'fee_div_max', not a positive integer.",
272 "Invalid field 'fee_div_max', not a positive integer.",
273 "Missing field 'tx_json.Fee'.",
274 "Missing field 'tx_json.SigningPubKey'."}}},
276 {
"Invalid value for 'fee_mult_max' field.",
279 "command": "doesnt_matter",
280 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
281 "secret": "masterpassphrase",
285 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
286 "Amount": "1000000000",
287 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
288 "TransactionType": "Payment"
291 {{"Fee of 10 exceeds the requested tx limit of 0",
292 "Fee of 10 exceeds the requested tx limit of 0",
293 "Missing field 'tx_json.Fee'.",
294 "Missing field 'tx_json.SigningPubKey'."}}},
296 {
"Invalid value for 'fee_div_max' field.",
299 "command": "doesnt_matter",
300 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
301 "secret": "masterpassphrase",
306 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
307 "Amount": "1000000000",
308 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
309 "TransactionType": "Payment"
312 {{"Fee of 10 exceeds the requested tx limit of 5",
313 "Fee of 10 exceeds the requested tx limit of 5",
314 "Missing field 'tx_json.Fee'.",
315 "Missing field 'tx_json.SigningPubKey'."}}},
317 {
"Invalid zero value for 'fee_div_max' field.",
320 "command": "doesnt_matter",
321 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
322 "secret": "masterpassphrase",
327 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
328 "Amount": "1000000000",
329 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
330 "TransactionType": "Payment"
333 {{"Invalid field 'fee_div_max', not a positive integer.",
334 "Invalid field 'fee_div_max', not a positive integer.",
335 "Missing field 'tx_json.Fee'.",
336 "Missing field 'tx_json.SigningPubKey'."}}},
338 {
"Missing 'Amount'.",
341 "command": "doesnt_matter",
342 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
343 "secret": "masterpassphrase",
345 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
346 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
347 "TransactionType": "Payment"
350 {{"Missing field 'tx_json.Amount'.",
351 "Missing field 'tx_json.Amount'.",
352 "Missing field 'tx_json.Sequence'.",
353 "Missing field 'tx_json.Sequence'."}}},
355 {
"Invalid 'Amount'.",
358 "command": "doesnt_matter",
359 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
360 "secret": "masterpassphrase",
362 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
363 "Amount": "NotAnAmount",
364 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
365 "TransactionType": "Payment"
368 {{"Invalid field 'tx_json.Amount'.",
369 "Invalid field 'tx_json.Amount'.",
370 "Missing field 'tx_json.Sequence'.",
371 "Missing field 'tx_json.Sequence'."}}},
373 {
"Missing 'Destination'.",
376 "command": "doesnt_matter",
377 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
378 "secret": "masterpassphrase",
380 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
381 "Amount": "1000000000",
382 "TransactionType": "Payment"
385 {{"Missing field 'tx_json.Destination'.",
386 "Missing field 'tx_json.Destination'.",
387 "Missing field 'tx_json.Sequence'.",
388 "Missing field 'tx_json.Sequence'."}}},
390 {
"Invalid 'Destination'.",
393 "command": "doesnt_matter",
394 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
395 "secret": "masterpassphrase",
397 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
398 "Amount": "1000000000",
399 "Destination": "NotADestination",
400 "TransactionType": "Payment"
403 {{"Invalid field 'tx_json.Destination'.",
404 "Invalid field 'tx_json.Destination'.",
405 "Missing field 'tx_json.Sequence'.",
406 "Missing field 'tx_json.Sequence'."}}},
408 {
"Cannot create XRP to XRP paths.",
411 "command": "doesnt_matter",
412 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
413 "secret": "masterpassphrase",
416 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
417 "Amount": "1000000000",
418 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
419 "TransactionType": "Payment"
422 {{"Cannot build XRP to XRP paths.",
423 "Cannot build XRP to XRP paths.",
424 "Missing field 'tx_json.Sequence'.",
425 "Missing field 'tx_json.Sequence'."}}},
427 {
"Successful 'build_path'.",
430 "command": "doesnt_matter",
431 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
432 "secret": "masterpassphrase",
435 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
439 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
441 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
442 "TransactionType": "Payment"
447 "Missing field 'tx_json.Sequence'.",
448 "Missing field 'tx_json.Sequence'."}}},
450 {
"Not valid to include both 'Paths' and 'build_path'.",
453 "command": "doesnt_matter",
454 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
455 "secret": "masterpassphrase",
458 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
462 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
464 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
466 "TransactionType": "Payment"
469 {{"Cannot specify both 'tx_json.Paths' and 'build_path'",
470 "Cannot specify both 'tx_json.Paths' and 'build_path'",
471 "Missing field 'tx_json.Sequence'.",
472 "Missing field 'tx_json.Sequence'."}}},
474 {
"Successful 'SendMax'.",
477 "command": "doesnt_matter",
478 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
479 "secret": "masterpassphrase",
482 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
486 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
491 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
493 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
494 "TransactionType": "Payment"
499 "Missing field 'tx_json.Sequence'.",
500 "Missing field 'tx_json.Sequence'."}}},
502 {
"'Amount' may not be XRP for pathfinding, but 'SendMax' may be XRP.",
505 "command": "doesnt_matter",
506 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
507 "secret": "masterpassphrase",
510 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
514 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
517 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
518 "TransactionType": "Payment"
523 "Missing field 'tx_json.Sequence'.",
524 "Missing field 'tx_json.Sequence'."}}},
526 {
"'secret' must be present.",
529 "command": "doesnt_matter",
530 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
532 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
533 "Amount": "1000000000",
534 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
535 "TransactionType": "Payment"
538 {{"Missing field 'secret'.",
539 "Missing field 'secret'.",
540 "Missing field 'tx_json.Sequence'.",
541 "Missing field 'tx_json.Sequence'."}}},
543 {
"'secret' must be non-empty.",
546 "command": "doesnt_matter",
547 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
550 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
551 "Amount": "1000000000",
552 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
553 "TransactionType": "Payment"
556 {{"Invalid field 'secret'.",
557 "Invalid field 'secret'.",
558 "Missing field 'tx_json.Sequence'.",
559 "Missing field 'tx_json.Sequence'."}}},
561 {
"Use 'seed' instead of 'secret'.",
564 "command": "doesnt_matter",
565 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
566 "key_type": "ed25519",
567 "seed": "sh1yJfwoi98zCygwijUzuHmJDeVKd",
569 "Account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
570 "Amount": "1000000000",
571 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
572 "TransactionType": "Payment"
577 "Missing field 'tx_json.Sequence'.",
578 "Missing field 'tx_json.Sequence'."}}},
580 {
"Malformed 'seed'.",
583 "command": "doesnt_matter",
584 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
585 "key_type": "ed25519",
586 "seed": "not a seed",
588 "Account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
589 "Amount": "1000000000",
590 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
591 "TransactionType": "Payment"
594 {{"Disallowed seed.",
596 "Missing field 'tx_json.Sequence'.",
597 "Missing field 'tx_json.Sequence'."}}},
599 {
"'tx_json' must be present.",
602 "command": "doesnt_matter",
603 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
604 "secret": "masterpassphrase",
606 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
607 "Amount": "1000000000",
608 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
609 "TransactionType": "Payment"
612 {{"Missing field 'tx_json'.",
613 "Missing field 'tx_json'.",
614 "Missing field 'tx_json'.",
615 "Missing field 'tx_json'."}}},
617 {
"'TransactionType' must be present.",
620 "command": "doesnt_matter",
621 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
622 "secret": "masterpassphrase",
624 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
625 "Amount": "1000000000",
626 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
629 {{"Missing field 'tx_json.TransactionType'.",
630 "Missing field 'tx_json.TransactionType'.",
631 "Missing field 'tx_json.Sequence'.",
632 "Missing field 'tx_json.Sequence'."}}},
634 {
"The 'TransactionType' must be a pre-established transaction type.",
637 "command": "doesnt_matter",
638 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
639 "secret": "masterpassphrase",
641 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
642 "Amount": "1000000000",
643 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
644 "TransactionType": "tt"
647 {{"Field 'tx_json.TransactionType' has invalid data.",
648 "Field 'tx_json.TransactionType' has invalid data.",
649 "Missing field 'tx_json.Sequence'.",
650 "Missing field 'tx_json.Sequence'."}}},
652 {
"The 'TransactionType' may be represented with an integer.",
655 "command": "doesnt_matter",
656 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
657 "secret": "masterpassphrase",
659 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
660 "Amount": "1000000000",
661 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
667 "Missing field 'tx_json.Sequence'.",
668 "Missing field 'tx_json.Sequence'."}}},
670 {
"'Account' must be present.",
673 "command": "doesnt_matter",
674 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
675 "secret": "masterpassphrase",
677 "Amount": "1000000000",
678 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
679 "TransactionType": "Payment"
682 {{"Missing field 'tx_json.Account'.",
683 "Missing field 'tx_json.Account'.",
684 "Missing field 'tx_json.Sequence'.",
685 "Missing field 'tx_json.Sequence'."}}},
687 {
"'Account' must be well formed.",
690 "command": "doesnt_matter",
691 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
692 "secret": "masterpassphrase",
694 "Account": "NotAnAccount",
695 "Amount": "1000000000",
696 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
697 "TransactionType": "Payment"
700 {{"Invalid field 'tx_json.Account'.",
701 "Invalid field 'tx_json.Account'.",
702 "Missing field 'tx_json.Sequence'.",
703 "Missing field 'tx_json.Sequence'."}}},
705 {
"The 'offline' tag may be added to the transaction.",
708 "command": "doesnt_matter",
709 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
710 "secret": "masterpassphrase",
713 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
714 "Amount": "1000000000",
715 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
716 "TransactionType": "Payment"
721 "Missing field 'tx_json.Sequence'.",
722 "Missing field 'tx_json.Sequence'."}}},
724 {
"If 'offline' is true then a 'Sequence' field must be supplied.",
727 "command": "doesnt_matter",
728 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
729 "secret": "masterpassphrase",
733 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
734 "Amount": "1000000000",
735 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
736 "TransactionType": "Payment"
739 {{"Missing field 'tx_json.Sequence'.",
740 "Missing field 'tx_json.Sequence'.",
741 "Missing field 'tx_json.Sequence'.",
742 "Missing field 'tx_json.Sequence'."}}},
744 {
"If 'offline' is true then a 'Fee' field must be supplied.",
747 "command": "doesnt_matter",
748 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
749 "secret": "masterpassphrase",
753 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
754 "Amount": "1000000000",
755 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
756 "TransactionType": "Payment"
759 {{"Missing field 'tx_json.Fee'.",
760 "Missing field 'tx_json.Fee'.",
761 "Missing field 'tx_json.Fee'.",
762 "Missing field 'tx_json.SigningPubKey'."}}},
764 {
"Valid transaction if 'offline' is true.",
767 "command": "doesnt_matter",
768 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
769 "secret": "masterpassphrase",
774 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
775 "Amount": "1000000000",
776 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
777 "TransactionType": "Payment"
782 "A Signer may not be the transaction's Account "
783 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
784 "Missing field 'tx_json.SigningPubKey'."}}},
786 {
"'offline' and 'build_path' are mutually exclusive.",
789 "command": "doesnt_matter",
790 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
791 "secret": "masterpassphrase",
797 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
798 "Amount": "1000000000",
799 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
800 "TransactionType": "Payment"
803 {{"Field 'build_path' not allowed in this context.",
804 "Field 'build_path' not allowed in this context.",
805 "Field 'build_path' not allowed in this context.",
806 "Missing field 'tx_json.SigningPubKey'."}}},
808 {
"A 'Flags' field may be specified.",
811 "command": "doesnt_matter",
812 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
813 "secret": "masterpassphrase",
816 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
817 "Amount": "1000000000",
818 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
819 "TransactionType": "Payment"
824 "Missing field 'tx_json.Sequence'.",
825 "Missing field 'tx_json.Sequence'."}}},
827 {
"The 'Flags' field must be numeric.",
830 "command": "doesnt_matter",
831 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
832 "secret": "masterpassphrase",
834 "Flags": "NotGoodFlags",
835 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
836 "Amount": "1000000000",
837 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
838 "TransactionType": "Payment"
841 {{"Field 'tx_json.Flags' has invalid data.",
842 "Field 'tx_json.Flags' has invalid data.",
843 "Missing field 'tx_json.Sequence'.",
844 "Missing field 'tx_json.Sequence'."}}},
846 {
"It's okay to add a 'debug_signing' field.",
849 "command": "doesnt_matter",
850 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
851 "secret": "masterpassphrase",
854 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
855 "Amount": "1000000000",
856 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
857 "TransactionType": "Payment"
862 "Missing field 'tx_json.Sequence'.",
863 "Missing field 'tx_json.Sequence'."}}},
865 {
"Single-sign a multisigned transaction.",
868 "command": "doesnt_matter",
869 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
872 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
873 "Amount" : "1000000000",
874 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
880 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
881 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
882 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
886 "SigningPubKey" : "",
887 "TransactionType" : "Payment"
890 {{"Already multisigned.",
891 "Already multisigned.",
892 "Secret does not match account.",
895 {
"Minimal sign_for.",
898 "command": "doesnt_matter",
899 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
900 "secret": "masterpassphrase",
902 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
903 "Amount": "1000000000",
904 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
908 "TransactionType": "Payment"
911 {{"Secret does not match account.",
912 "Secret does not match account.",
914 "Missing field 'tx_json.Signers'."}}},
916 {
"Minimal offline sign_for.",
919 "command": "doesnt_matter",
920 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
921 "secret": "masterpassphrase",
924 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
925 "Amount": "1000000000",
926 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
930 "TransactionType": "Payment"
933 {{"",
"",
"",
"Missing field 'tx_json.Signers'."}}},
935 {
"Offline sign_for using 'seed' instead of 'secret'.",
938 "command": "doesnt_matter",
939 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
940 "key_type": "ed25519",
941 "seed": "sh1yJfwoi98zCygwijUzuHmJDeVKd",
944 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
945 "Amount": "1000000000",
946 "Destination": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
950 "TransactionType": "Payment"
953 {{"",
"",
"",
"Missing field 'tx_json.Signers'."}}},
955 {
"Malformed seed in sign_for.",
958 "command": "doesnt_matter",
959 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
960 "key_type": "ed25519",
961 "seed": "sh1yJfwoi98zCygwjUzuHmJDeVKd",
964 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
965 "Amount": "1000000000",
966 "Destination": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
970 "TransactionType": "Payment"
973 {{"Disallowed seed.",
976 "Missing field 'tx_json.Signers'."}}},
978 {
"Missing 'Account' in sign_for.",
981 "command": "doesnt_matter",
982 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
983 "secret": "masterpassphrase",
985 "Amount": "1000000000",
986 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
990 "TransactionType": "Payment"
993 {{"Missing field 'tx_json.Account'.",
994 "Missing field 'tx_json.Account'.",
995 "Missing field 'tx_json.Account'.",
996 "Missing field 'tx_json.Account'."}}},
998 {
"Missing 'Amount' in sign_for.",
1001 "command": "doesnt_matter",
1002 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1003 "secret": "masterpassphrase",
1005 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1006 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1009 "SigningPubKey": "",
1010 "TransactionType": "Payment"
1013 {{"Missing field 'tx_json.Amount'.",
1014 "Missing field 'tx_json.Amount'.",
1015 "Missing field 'tx_json.Amount'.",
1016 "Missing field 'tx_json.Amount'."}}},
1018 {
"Missing 'Destination' in sign_for.",
1021 "command": "doesnt_matter",
1022 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1023 "secret": "masterpassphrase",
1025 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1026 "Amount": "1000000000",
1029 "SigningPubKey": "",
1030 "TransactionType": "Payment"
1033 {{"Missing field 'tx_json.Destination'.",
1034 "Missing field 'tx_json.Destination'.",
1035 "Missing field 'tx_json.Destination'.",
1036 "Missing field 'tx_json.Destination'."}}},
1038 {
"Missing 'Fee' in sign_for.",
1041 "command": "doesnt_matter",
1042 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1043 "secret": "masterpassphrase",
1045 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1046 "Amount": "1000000000",
1047 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1049 "SigningPubKey": "",
1050 "TransactionType": "Payment"
1053 {{"Secret does not match account.",
1054 "Secret does not match account.",
1055 "Missing field 'tx_json.Fee'.",
1056 "Missing field 'tx_json.Fee'."}}},
1058 {
"Missing 'Sequence' in sign_for.",
1061 "command": "doesnt_matter",
1062 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1063 "secret": "masterpassphrase",
1065 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1066 "Amount": "1000000000",
1067 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1069 "SigningPubKey": "",
1070 "TransactionType": "Payment"
1073 {{"Secret does not match account.",
1074 "Secret does not match account.",
1075 "Missing field 'tx_json.Sequence'.",
1076 "Missing field 'tx_json.Sequence'."}}},
1078 {
"Missing 'SigningPubKey' in sign_for is automatically filled in.",
1081 "command": "doesnt_matter",
1082 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1083 "secret": "masterpassphrase",
1085 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1086 "Amount": "1000000000",
1087 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1090 "TransactionType": "Payment"
1093 {{"Secret does not match account.",
1094 "Secret does not match account.",
1096 "Missing field 'tx_json.SigningPubKey'."}}},
1098 {
"In sign_for, an account may not sign for itself.",
1101 "command": "doesnt_matter",
1102 "account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1105 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1106 "Amount": "1000000000",
1107 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1110 "TransactionType": "Payment"
1115 "A Signer may not be the transaction's Account "
1116 "(rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA).",
1117 "Missing field 'tx_json.SigningPubKey'."}}},
1119 {
"Cannot put duplicate accounts in Signers array",
1122 "command": "doesnt_matter",
1123 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1124 "secret": "masterpassphrase",
1126 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1127 "Amount" : "1000000000",
1128 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1134 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1135 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1136 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1140 "SigningPubKey" : "",
1141 "TransactionType" : "Payment"
1144 {{"Already multisigned.",
1145 "Already multisigned.",
1146 "Duplicate Signers:Signer:Account entries "
1147 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh) are not allowed.",
1150 {
"Correctly append to pre-established Signers array",
1153 "command": "doesnt_matter",
1154 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1157 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1158 "Amount" : "1000000000",
1159 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1165 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1166 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1167 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1171 "SigningPubKey" : "",
1172 "TransactionType" : "Payment"
1175 {{"Already multisigned.",
"Already multisigned.",
"",
""}}},
1177 {
"Append to pre-established Signers array with bad signature",
1180 "command": "doesnt_matter",
1181 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1184 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1185 "Amount" : "1000000000",
1186 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1192 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1193 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1194 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ACB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1198 "SigningPubKey" : "",
1199 "TransactionType" : "Payment"
1202 {{"Already multisigned.",
1203 "Already multisigned.",
1204 "Invalid signature.",
1205 "Invalid signature."}}},
1207 {
"Non-empty 'SigningPubKey' in sign_for.",
1210 "command": "doesnt_matter",
1211 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1212 "secret": "masterpassphrase",
1214 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1215 "Amount": "1000000000",
1216 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1219 "SigningPubKey": "1",
1220 "TransactionType": "Payment"
1223 {{"Secret does not match account.",
1224 "Secret does not match account.",
1225 "When multi-signing 'tx_json.SigningPubKey' must be empty.",
1226 "When multi-signing 'tx_json.SigningPubKey' must be empty."}}},
1228 {
"Missing 'TransactionType' in sign_for.",
1231 "command": "doesnt_matter",
1232 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1233 "secret": "masterpassphrase",
1235 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1236 "Amount": "1000000000",
1237 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1240 "SigningPubKey": "",
1243 {{"Missing field 'tx_json.TransactionType'.",
1244 "Missing field 'tx_json.TransactionType'.",
1245 "Missing field 'tx_json.TransactionType'.",
1246 "Missing field 'tx_json.TransactionType'."}}},
1248 {
"TxnSignature in sign_for.",
1251 "command": "doesnt_matter",
1252 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1255 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1256 "Amount" : "1000000000",
1257 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1263 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1264 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1265 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1269 "SigningPubKey" : "",
1270 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998",
1271 "TransactionType" : "Payment"
1274 {{"Already multisigned.",
1275 "Already multisigned.",
1276 "Already single-signed.",
1277 "Signing of transaction is malformed."}}},
1279 {
"Invalid field 'tx_json': string instead of object",
1282 "command": "doesnt_matter",
1283 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1284 "secret": "masterpassphrase",
1287 {{"Invalid field 'tx_json', not object.",
1288 "Invalid field 'tx_json', not object.",
1289 "Invalid field 'tx_json', not object.",
1290 "Invalid field 'tx_json', not object."}}},
1292 {
"Invalid field 'tx_json': integer instead of object",
1295 "command": "doesnt_matter",
1296 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1297 "secret": "masterpassphrase",
1300 {{"Invalid field 'tx_json', not object.",
1301 "Invalid field 'tx_json', not object.",
1302 "Invalid field 'tx_json', not object.",
1303 "Invalid field 'tx_json', not object."}}},
1305 {
"Invalid field 'tx_json': array instead of object",
1308 "command": "doesnt_matter",
1309 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1310 "secret": "masterpassphrase",
1311 "tx_json": [ "hello", "world" ]
1313 {{"Invalid field 'tx_json', not object.",
1314 "Invalid field 'tx_json', not object.",
1315 "Invalid field 'tx_json', not object.",
1316 "Invalid field 'tx_json', not object."}}},
1318 {
"Minimal submit_multisigned.",
1321 "command": "submit_multisigned",
1323 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1324 "Amount": "1000000000",
1325 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1331 "Account" : "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1332 "SigningPubKey" : "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8",
1333 "TxnSignature" : "3045022100909D01399AFFAD1E30D250CE61F93975B7F61E47B5244D78C3E86D9806535D95022012E389E0ACB016334052B7FE07FA6CEFDC8BE82CB410FA841D5049641C89DC8F"
1337 "SigningPubKey": "",
1338 "TransactionType": "Payment"
1341 {{"Missing field 'secret'.",
1342 "Missing field 'secret'.",
1343 "Missing field 'account'.",
1346 {
"Minimal submit_multisigned with bad signature.",
1349 "command": "submit_multisigned",
1351 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1352 "Amount": "1000000000",
1353 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1359 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1360 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1361 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1365 "SigningPubKey": "",
1366 "TransactionType": "Payment"
1369 {{"Missing field 'secret'.",
1370 "Missing field 'secret'.",
1371 "Missing field 'account'.",
1372 "Invalid signature."}}},
1374 {
"Missing tx_json in submit_multisigned.",
1377 "command": "submit_multisigned",
1381 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1382 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1383 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1388 {{"Missing field 'secret'.",
1389 "Missing field 'secret'.",
1390 "Missing field 'account'.",
1391 "Missing field 'tx_json'."}}},
1393 {
"Missing sequence in submit_multisigned.",
1396 "command": "submit_multisigned",
1398 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1399 "Amount": "1000000000",
1400 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1405 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1406 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1407 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1411 "SigningPubKey": "",
1412 "TransactionType": "Payment"
1415 {{"Missing field 'secret'.",
1416 "Missing field 'secret'.",
1417 "Missing field 'account'.",
1418 "Missing field 'tx_json.Sequence'."}}},
1420 {
"Missing SigningPubKey in submit_multisigned.",
1423 "command": "submit_multisigned",
1425 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1426 "Amount": "1000000000",
1427 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1432 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1433 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1434 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1439 "TransactionType": "Payment"
1442 {{"Missing field 'secret'.",
1443 "Missing field 'secret'.",
1444 "Missing field 'account'.",
1445 "Missing field 'tx_json.SigningPubKey'."}}},
1447 {
"Non-empty SigningPubKey in submit_multisigned.",
1450 "command": "submit_multisigned",
1452 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1453 "Amount": "1000000000",
1454 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1460 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1461 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1462 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1466 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8",
1467 "TransactionType": "Payment"
1470 {{"Missing field 'secret'.",
1471 "Missing field 'secret'.",
1472 "Missing field 'account'.",
1473 "When multi-signing 'tx_json.SigningPubKey' must be empty."}}},
1475 {
"Missing TransactionType in submit_multisigned.",
1478 "command": "submit_multisigned",
1480 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1481 "Amount": "1000000000",
1482 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1487 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1488 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1489 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1494 "SigningPubKey": "",
1497 {{"Missing field 'secret'.",
1498 "Missing field 'secret'.",
1499 "Missing field 'account'.",
1500 "Missing field 'tx_json.TransactionType'."}}},
1502 {
"Missing Account in submit_multisigned.",
1505 "command": "submit_multisigned",
1507 "Amount": "1000000000",
1508 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1514 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1515 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1516 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1520 "SigningPubKey": "",
1521 "TransactionType": "Payment"
1524 {{"Missing field 'secret'.",
1525 "Missing field 'secret'.",
1526 "Missing field 'account'.",
1527 "Missing field 'tx_json.Account'."}}},
1529 {
"Malformed Account in submit_multisigned.",
1532 "command": "submit_multisigned",
1534 "Account": "NotAnAccount",
1535 "Amount": "1000000000",
1536 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1542 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1543 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1544 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1548 "SigningPubKey": "",
1549 "TransactionType": "Payment"
1552 {{"Missing field 'secret'.",
1553 "Missing field 'secret'.",
1554 "Missing field 'account'.",
1555 "Invalid field 'tx_json.Account'."}}},
1557 {
"Account not in ledger in submit_multisigned.",
1560 "command": "submit_multisigned",
1562 "Account": "rDg53Haik2475DJx8bjMDSDPj4VX7htaMd",
1563 "Amount": "1000000000",
1564 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1570 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1571 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1572 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1576 "SigningPubKey": "",
1577 "TransactionType": "Payment"
1580 {{"Missing field 'secret'.",
1581 "Missing field 'secret'.",
1582 "Missing field 'account'.",
1583 "Source account not found."}}},
1585 {
"Missing Fee in submit_multisigned.",
1588 "command": "submit_multisigned",
1590 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1591 "Amount": "1000000000",
1592 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1597 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1598 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1599 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1603 "SigningPubKey": "",
1604 "TransactionType": "Payment"
1607 {{"Missing field 'secret'.",
1608 "Missing field 'secret'.",
1609 "Missing field 'account'.",
1610 "Missing field 'tx_json.Fee'."}}},
1612 {
"Non-numeric Fee in submit_multisigned.",
1615 "command": "submit_multisigned",
1617 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1618 "Amount": "1000000000",
1619 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1625 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1626 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1627 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1631 "SigningPubKey": "",
1632 "TransactionType": "Payment"
1635 {{"Missing field 'secret'.",
1636 "Missing field 'secret'.",
1637 "Missing field 'account'.",
1638 "Field 'tx_json.Fee' has invalid data."}}},
1640 {
"Missing Amount in submit_multisigned Payment.",
1643 "command": "submit_multisigned",
1645 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1646 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1652 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1653 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1654 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1658 "SigningPubKey": "",
1659 "TransactionType": "Payment"
1662 {{"Missing field 'secret'.",
1663 "Missing field 'secret'.",
1664 "Missing field 'account'.",
1665 "Missing field 'tx_json.Amount'."}}},
1667 {
"Invalid Amount in submit_multisigned Payment.",
1670 "command": "submit_multisigned",
1672 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1673 "Amount": "NotANumber",
1674 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1680 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1681 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1682 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1686 "SigningPubKey": "",
1687 "TransactionType": "Payment"
1690 {{"Missing field 'secret'.",
1691 "Missing field 'secret'.",
1692 "Missing field 'account'.",
1693 "Invalid field 'tx_json.Amount'."}}},
1695 {
"No build_path in submit_multisigned.",
1698 "command": "submit_multisigned",
1701 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1702 "Amount": "1000000000",
1703 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1709 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1710 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1711 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1715 "SigningPubKey": "",
1716 "TransactionType": "Payment"
1719 {{"Missing field 'secret'.",
1720 "Missing field 'secret'.",
1721 "Missing field 'account'.",
1722 "Field 'build_path' not allowed in this context."}}},
1724 {
"Missing Destination in submit_multisigned Payment.",
1727 "command": "submit_multisigned",
1729 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1730 "Amount": "1000000000",
1736 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1737 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1738 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1742 "SigningPubKey": "",
1743 "TransactionType": "Payment"
1746 {{"Missing field 'secret'.",
1747 "Missing field 'secret'.",
1748 "Missing field 'account'.",
1749 "Missing field 'tx_json.Destination'."}}},
1751 {
"Malformed Destination in submit_multisigned Payment.",
1754 "command": "submit_multisigned",
1756 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1757 "Amount": "1000000000",
1758 "Destination": "NotADestination",
1764 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1765 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1766 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1770 "SigningPubKey": "",
1771 "TransactionType": "Payment"
1774 {{"Missing field 'secret'.",
1775 "Missing field 'secret'.",
1776 "Missing field 'account'.",
1777 "Invalid field 'tx_json.Destination'."}}},
1779 {
"Missing Signers field in submit_multisigned.",
1782 "command": "submit_multisigned",
1784 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1785 "Amount": "1000000000",
1786 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1789 "SigningPubKey": "",
1790 "TransactionType": "Payment"
1793 {{"Missing field 'secret'.",
1794 "Missing field 'secret'.",
1795 "Missing field 'account'.",
1796 "Missing field 'tx_json.Signers'."}}},
1798 {
"Signers not an array in submit_multisigned.",
1801 "command": "submit_multisigned",
1803 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1804 "Amount": "1000000000",
1805 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1809 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1810 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1811 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1813 "SigningPubKey": "",
1814 "TransactionType": "Payment"
1817 {{"Missing field 'secret'.",
1818 "Missing field 'secret'.",
1819 "Missing field 'account'.",
1820 "Field 'tx_json.Signers' is not a JSON array."}}},
1822 {
"Empty Signers array in submit_multisigned.",
1825 "command": "submit_multisigned",
1827 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1828 "Amount": "1000000000",
1829 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1834 "SigningPubKey": "",
1835 "TransactionType": "Payment"
1838 {{"Missing field 'secret'.",
1839 "Missing field 'secret'.",
1840 "Missing field 'account'.",
1841 "tx_json.Signers array may not be empty."}}},
1843 {
"Duplicate Signer in submit_multisigned.",
1846 "command": "submit_multisigned",
1848 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1849 "Amount": "1000000000",
1850 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1856 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1857 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1858 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1863 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1864 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1865 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1869 "SigningPubKey": "",
1870 "TransactionType": "Payment"
1873 {{"Missing field 'secret'.",
1874 "Missing field 'secret'.",
1875 "Missing field 'account'.",
1876 "Duplicate Signers:Signer:Account entries "
1877 "(rPcNzota6B8YBokhYtcTNqQVCngtbnWfux) are not allowed."}}},
1879 {
"Signer is tx_json Account in submit_multisigned.",
1882 "command": "submit_multisigned",
1884 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1885 "Amount": "1000000000",
1886 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1892 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1893 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1894 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1898 "SigningPubKey": "",
1899 "TransactionType": "Payment"
1902 {{"Missing field 'secret'.",
1903 "Missing field 'secret'.",
1904 "Missing field 'account'.",
1905 "A Signer may not be the transaction's Account "
1906 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh)."}}},
1918 env.
rpc(
"bad_command", R
"({"MakingThisUp": 0})")};
1920 BEAST_EXPECT(result[jss::result][jss::error] == "unknownCmd");
1922 result[jss::result][jss::request][jss::command] ==
"bad_command");
1935 "{ \"fee_mult_max\" : 1, \"tx_json\" : { } } ", req);
1947 req[jss::tx_json].isMember(jss::Fee) &&
1948 req[jss::tx_json][jss::Fee] == 10);
1954 "{ \"fee_mult_max\" : 3, \"fee_div_max\" : 2, "
1955 "\"tx_json\" : { } } ",
1968 req[jss::tx_json].isMember(jss::Fee) &&
1969 req[jss::tx_json][jss::Fee] == 10);
1975 "{ \"fee_mult_max\" : 0, \"tx_json\" : { } } ", req);
1986 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
1994 "{ \"fee_mult_max\" : 3, \"fee_div_max\" : 6, "
1995 "\"tx_json\" : { } } ",
2007 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2013 "{ \"fee_mult_max\" : 0, \"fee_div_max\" : 2, "
2014 "\"tx_json\" : { } } ",
2026 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2032 "{ \"fee_mult_max\" : 10, \"fee_div_max\" : 0, "
2033 "\"tx_json\" : { } } ",
2045 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2052 using namespace test::jtx;
2054 cfg->loadFromString(
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
2055 cfg->section(
"transaction_queue")
2056 .
set(
"minimum_txn_in_ledger_standalone",
"3");
2059 LoadFeeTrack const& feeTrackOuter = env.app().getFeeTrack();
2066 "fee_mult_max" : 1000,
2081 req[jss::tx_json].isMember(jss::Fee) &&
2082 req[jss::tx_json][jss::Fee] == 10);
2105 req[jss::tx_json].isMember(jss::Fee) &&
2106 req[jss::tx_json][jss::Fee] == 10);
2110 for (
auto i = 0; i < 4; ++i)
2112 env(noop(env.master));
2120 "fee_mult_max" : 1000,
2135 req[jss::tx_json].isMember(jss::Fee) &&
2136 req[jss::tx_json][jss::Fee] == 8889);
2158 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2166 "fee_mult_max" : 1000,
2181 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2189 "fee_mult_max" : 8000,
2205 req[jss::tx_json].isMember(jss::Fee) &&
2206 req[jss::tx_json][jss::Fee] == 8889);
2214 "fee_mult_max" : -5,
2256 "fee_mult_max" : -2,
2278 toSign[jss::tx_json] = noop(env.master);
2279 toSign[jss::secret] =
"masterpassphrase";
2280 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2281 auto result = rpcResult[jss::result];
2285 result[jss::tx_json].isMember(jss::Fee) &&
2286 result[jss::tx_json][jss::Fee] ==
"10");
2288 result[jss::tx_json].isMember(jss::Sequence) &&
2289 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2290 Json::ValueType::uintValue));
2298 auto metrics = env.app().getTxQ().getMetrics(*env.current());
2299 if (metrics.openLedgerFeeLevel > metrics.minProcessingFeeLevel)
2301 env(noop(env.master));
2305 toSign[jss::tx_json] = noop(env.master);
2306 toSign[jss::secret] =
"masterpassphrase";
2307 toSign[jss::fee_mult_max] = 900;
2308 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2309 auto result = rpcResult[jss::result];
2313 result[jss::tx_json].isMember(jss::Fee) &&
2314 result[jss::tx_json][jss::Fee] ==
"7813");
2316 result[jss::tx_json].isMember(jss::Sequence) &&
2317 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2318 Json::ValueType::uintValue));
2326 auto& feeTrack = env.app().getFeeTrack();
2327 BEAST_EXPECT(feeTrack.getLoadFactor() == 256);
2328 for (
int i = 0; i < 8; ++i)
2329 feeTrack.raiseLocalFee();
2330 BEAST_EXPECT(feeTrack.getLoadFactor() == 1220);
2334 toSign[jss::tx_json] = noop(env.master);
2335 toSign[jss::secret] =
"masterpassphrase";
2336 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2337 auto result = rpcResult[jss::result];
2341 result[jss::tx_json].isMember(jss::Fee) &&
2342 result[jss::tx_json][jss::Fee] ==
"47");
2344 result[jss::tx_json].isMember(jss::Sequence) &&
2345 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2346 Json::ValueType::uintValue));
2356 auto metrics = env.app().getTxQ().getMetrics(*env.current());
2357 if (metrics.openLedgerFeeLevel > metrics.minProcessingFeeLevel)
2359 env(noop(env.master), fee(47));
2365 toSign[jss::tx_json] = noop(env.master);
2366 toSign[jss::secret] =
"masterpassphrase";
2368 toSign[jss::fee_mult_max] = 700;
2369 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2370 auto result = rpcResult[jss::result];
2374 result[jss::tx_json].isMember(jss::Fee) &&
2375 result[jss::tx_json][jss::Fee] ==
"6806");
2377 result[jss::tx_json].isMember(jss::Sequence) &&
2378 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2379 Json::ValueType::uintValue));
2397 using namespace std::chrono_literals;
2399 test::jtx::Account
const a{
"a"};
2400 test::jtx::Account
const g{
"g"};
2401 auto const USD = g[
"USD"];
2410 test::jtx::Env env(*
this);
2414 env(
trust(a, USD(1000)));
2415 env(
trust(env.master, USD(1000)));
2416 env(
pay(g, a, USD(50)));
2417 env(
pay(g, env.master, USD(50)));
2442 static TestStuff
const testFuncs[] = {
2449 "submit_multisigned",
2452 for (
auto testFunc : testFuncs)
2460 Throw<std::runtime_error>(
2461 "Internal JSONRPC_test error. Bad test JSON.");
2463 static Role const testedRoles[] = {
2466 for (
Role testRole : testedRoles)
2469 auto const signFn = get<0>(testFunc);
2470 if (signFn !=
nullptr)
2472 assert(get<1>(testFunc) ==
nullptr);
2482 auto const submitFn = get<1>(testFunc);
2483 assert(submitFn !=
nullptr);
2496 errStr = result[
"error_message"].
asString();
2498 if (errStr == txnTest.expMsg[get<3>(testFunc)])
2505 description << txnTest.description <<
" Called "
2506 << get<2>(testFunc) <<
"(). Got \'"
2508 fail(description.
str(), __FILE__, txnTest.line);