20 #include <ripple/app/misc/LoadFeeTrack.h>
21 #include <ripple/app/misc/TxQ.h>
22 #include <ripple/basics/contract.h>
23 #include <ripple/beast/unit_test.h>
24 #include <ripple/core/ConfigSections.h>
25 #include <ripple/json/json_reader.h>
26 #include <ripple/protocol/ErrorCodes.h>
27 #include <ripple/protocol/Feature.h>
28 #include <ripple/rpc/impl/TransactionSign.h>
30 #include <test/jtx/envconfig.h>
53 char const* description_,
75 "command": "doesnt_matter",
76 "secret": "masterpassphrase",
78 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
79 "Amount": "1000000000",
80 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
81 "TransactionType": "Payment"
86 "Missing field 'account'.",
87 "Missing field 'tx_json.Sequence'."}}},
89 {
"Pass in Fee with minimal payment.",
92 "command": "doesnt_matter",
93 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
94 "secret": "masterpassphrase",
97 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
98 "Amount": "1000000000",
99 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
100 "TransactionType": "Payment"
105 "Missing field 'tx_json.Sequence'.",
106 "Missing field 'tx_json.Sequence'."}}},
108 {
"Pass in Sequence.",
111 "command": "doesnt_matter",
112 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
113 "secret": "masterpassphrase",
116 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
117 "Amount": "1000000000",
118 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
119 "TransactionType": "Payment"
124 "Missing field 'tx_json.Fee'.",
125 "Missing field 'tx_json.SigningPubKey'."}}},
127 {
"Pass in Sequence and Fee with minimal payment.",
130 "command": "doesnt_matter",
131 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
132 "secret": "masterpassphrase",
136 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
137 "Amount": "1000000000",
138 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
139 "TransactionType": "Payment"
144 "A Signer may not be the transaction's Account "
145 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
146 "Missing field 'tx_json.SigningPubKey'."}}},
148 {
"Add 'fee_mult_max' field.",
151 "command": "doesnt_matter",
152 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
153 "secret": "masterpassphrase",
157 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
158 "Amount": "1000000000",
159 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
160 "TransactionType": "Payment"
165 "Missing field 'tx_json.Fee'.",
166 "Missing field 'tx_json.SigningPubKey'."}}},
168 {
"Add 'fee_mult_max' and 'fee_div_max' field.",
171 "command": "doesnt_matter",
172 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
173 "secret": "masterpassphrase",
178 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
179 "Amount": "1000000000",
180 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
181 "TransactionType": "Payment"
186 "Missing field 'tx_json.Fee'.",
187 "Missing field 'tx_json.SigningPubKey'."}}},
189 {
"fee_mult_max is ignored if 'Fee' is present.",
192 "command": "doesnt_matter",
193 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
194 "secret": "masterpassphrase",
199 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
200 "Amount": "1000000000",
201 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
202 "TransactionType": "Payment"
207 "A Signer may not be the transaction's Account "
208 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
209 "Missing field 'tx_json.SigningPubKey'."}}},
211 {
"fee_div_max is ignored if 'Fee' is present.",
214 "command": "doesnt_matter",
215 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
216 "secret": "masterpassphrase",
222 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
223 "Amount": "1000000000",
224 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
225 "TransactionType": "Payment"
230 "A Signer may not be the transaction's Account "
231 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
232 "Missing field 'tx_json.SigningPubKey'."}}},
234 {
"Invalid 'fee_mult_max' field.",
237 "command": "doesnt_matter",
238 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
239 "secret": "masterpassphrase",
240 "fee_mult_max": "NotAFeeMultiplier",
243 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
244 "Amount": "1000000000",
245 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
246 "TransactionType": "Payment"
249 {{"Invalid field 'fee_mult_max', not a positive integer.",
250 "Invalid field 'fee_mult_max', not a positive integer.",
251 "Missing field 'tx_json.Fee'.",
252 "Missing field 'tx_json.SigningPubKey'."}}},
254 {
"Invalid 'fee_div_max' field.",
257 "command": "doesnt_matter",
258 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
259 "secret": "masterpassphrase",
261 "fee_div_max": "NotAFeeMultiplier",
264 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
265 "Amount": "1000000000",
266 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
267 "TransactionType": "Payment"
270 {{"Invalid field 'fee_div_max', not a positive integer.",
271 "Invalid field 'fee_div_max', not a positive integer.",
272 "Missing field 'tx_json.Fee'.",
273 "Missing field 'tx_json.SigningPubKey'."}}},
275 {
"Invalid value for 'fee_mult_max' field.",
278 "command": "doesnt_matter",
279 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
280 "secret": "masterpassphrase",
284 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
285 "Amount": "1000000000",
286 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
287 "TransactionType": "Payment"
290 {{"Fee of 10 exceeds the requested tx limit of 0",
291 "Fee of 10 exceeds the requested tx limit of 0",
292 "Missing field 'tx_json.Fee'.",
293 "Missing field 'tx_json.SigningPubKey'."}}},
295 {
"Invalid value for 'fee_div_max' field.",
298 "command": "doesnt_matter",
299 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
300 "secret": "masterpassphrase",
305 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
306 "Amount": "1000000000",
307 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
308 "TransactionType": "Payment"
311 {{"Fee of 10 exceeds the requested tx limit of 5",
312 "Fee of 10 exceeds the requested tx limit of 5",
313 "Missing field 'tx_json.Fee'.",
314 "Missing field 'tx_json.SigningPubKey'."}}},
316 {
"Invalid zero value for 'fee_div_max' field.",
319 "command": "doesnt_matter",
320 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
321 "secret": "masterpassphrase",
326 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
327 "Amount": "1000000000",
328 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
329 "TransactionType": "Payment"
332 {{"Invalid field 'fee_div_max', not a positive integer.",
333 "Invalid field 'fee_div_max', not a positive integer.",
334 "Missing field 'tx_json.Fee'.",
335 "Missing field 'tx_json.SigningPubKey'."}}},
337 {
"Missing 'Amount'.",
340 "command": "doesnt_matter",
341 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
342 "secret": "masterpassphrase",
344 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
345 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
346 "TransactionType": "Payment"
349 {{"Missing field 'tx_json.Amount'.",
350 "Missing field 'tx_json.Amount'.",
351 "Missing field 'tx_json.Sequence'.",
352 "Missing field 'tx_json.Sequence'."}}},
354 {
"Invalid 'Amount'.",
357 "command": "doesnt_matter",
358 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
359 "secret": "masterpassphrase",
361 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
362 "Amount": "NotAnAmount",
363 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
364 "TransactionType": "Payment"
367 {{"Invalid field 'tx_json.Amount'.",
368 "Invalid field 'tx_json.Amount'.",
369 "Missing field 'tx_json.Sequence'.",
370 "Missing field 'tx_json.Sequence'."}}},
372 {
"Missing 'Destination'.",
375 "command": "doesnt_matter",
376 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
377 "secret": "masterpassphrase",
379 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
380 "Amount": "1000000000",
381 "TransactionType": "Payment"
384 {{"Missing field 'tx_json.Destination'.",
385 "Missing field 'tx_json.Destination'.",
386 "Missing field 'tx_json.Sequence'.",
387 "Missing field 'tx_json.Sequence'."}}},
389 {
"Invalid 'Destination'.",
392 "command": "doesnt_matter",
393 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
394 "secret": "masterpassphrase",
396 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
397 "Amount": "1000000000",
398 "Destination": "NotADestination",
399 "TransactionType": "Payment"
402 {{"Invalid field 'tx_json.Destination'.",
403 "Invalid field 'tx_json.Destination'.",
404 "Missing field 'tx_json.Sequence'.",
405 "Missing field 'tx_json.Sequence'."}}},
407 {
"Cannot create XRP to XRP paths.",
410 "command": "doesnt_matter",
411 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
412 "secret": "masterpassphrase",
415 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
416 "Amount": "1000000000",
417 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
418 "TransactionType": "Payment"
421 {{"Cannot build XRP to XRP paths.",
422 "Cannot build XRP to XRP paths.",
423 "Missing field 'tx_json.Sequence'.",
424 "Missing field 'tx_json.Sequence'."}}},
426 {
"Successful 'build_path'.",
429 "command": "doesnt_matter",
430 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
431 "secret": "masterpassphrase",
434 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
438 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
440 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
441 "TransactionType": "Payment"
446 "Missing field 'tx_json.Sequence'.",
447 "Missing field 'tx_json.Sequence'."}}},
449 {
"Not valid to include both 'Paths' and 'build_path'.",
452 "command": "doesnt_matter",
453 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
454 "secret": "masterpassphrase",
457 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
461 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
463 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
465 "TransactionType": "Payment"
468 {{"Cannot specify both 'tx_json.Paths' and 'build_path'",
469 "Cannot specify both 'tx_json.Paths' and 'build_path'",
470 "Missing field 'tx_json.Sequence'.",
471 "Missing field 'tx_json.Sequence'."}}},
473 {
"Successful 'SendMax'.",
476 "command": "doesnt_matter",
477 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
478 "secret": "masterpassphrase",
481 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
485 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
490 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
492 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
493 "TransactionType": "Payment"
498 "Missing field 'tx_json.Sequence'.",
499 "Missing field 'tx_json.Sequence'."}}},
501 {
"'Amount' may not be XRP for pathfinding, but 'SendMax' may be XRP.",
504 "command": "doesnt_matter",
505 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
506 "secret": "masterpassphrase",
509 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
513 "issuer": "rLPwWB1itaUGMV8kbMLLysjGkEpTM2Soy4"
516 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
517 "TransactionType": "Payment"
522 "Missing field 'tx_json.Sequence'.",
523 "Missing field 'tx_json.Sequence'."}}},
525 {
"'secret' must be present.",
528 "command": "doesnt_matter",
529 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
531 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
532 "Amount": "1000000000",
533 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
534 "TransactionType": "Payment"
537 {{"Missing field 'secret'.",
538 "Missing field 'secret'.",
539 "Missing field 'tx_json.Sequence'.",
540 "Missing field 'tx_json.Sequence'."}}},
542 {
"'secret' must be non-empty.",
545 "command": "doesnt_matter",
546 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
549 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
550 "Amount": "1000000000",
551 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
552 "TransactionType": "Payment"
555 {{"Invalid field 'secret'.",
556 "Invalid field 'secret'.",
557 "Missing field 'tx_json.Sequence'.",
558 "Missing field 'tx_json.Sequence'."}}},
560 {
"Use 'seed' instead of 'secret'.",
563 "command": "doesnt_matter",
564 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
565 "key_type": "ed25519",
566 "seed": "sh1yJfwoi98zCygwijUzuHmJDeVKd",
568 "Account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
569 "Amount": "1000000000",
570 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
571 "TransactionType": "Payment"
576 "Missing field 'tx_json.Sequence'.",
577 "Missing field 'tx_json.Sequence'."}}},
579 {
"Malformed 'seed'.",
582 "command": "doesnt_matter",
583 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
584 "key_type": "ed25519",
585 "seed": "not a seed",
587 "Account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
588 "Amount": "1000000000",
589 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
590 "TransactionType": "Payment"
593 {{"Disallowed seed.",
595 "Missing field 'tx_json.Sequence'.",
596 "Missing field 'tx_json.Sequence'."}}},
598 {
"'tx_json' must be present.",
601 "command": "doesnt_matter",
602 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
603 "secret": "masterpassphrase",
605 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
606 "Amount": "1000000000",
607 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
608 "TransactionType": "Payment"
611 {{"Missing field 'tx_json'.",
612 "Missing field 'tx_json'.",
613 "Missing field 'tx_json'.",
614 "Missing field 'tx_json'."}}},
616 {
"'TransactionType' must be present.",
619 "command": "doesnt_matter",
620 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
621 "secret": "masterpassphrase",
623 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
624 "Amount": "1000000000",
625 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
628 {{"Missing field 'tx_json.TransactionType'.",
629 "Missing field 'tx_json.TransactionType'.",
630 "Missing field 'tx_json.Sequence'.",
631 "Missing field 'tx_json.Sequence'."}}},
633 {
"The 'TransactionType' must be a pre-established transaction type.",
636 "command": "doesnt_matter",
637 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
638 "secret": "masterpassphrase",
640 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
641 "Amount": "1000000000",
642 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
643 "TransactionType": "tt"
646 {{"Field 'tx_json.TransactionType' has invalid data.",
647 "Field 'tx_json.TransactionType' has invalid data.",
648 "Missing field 'tx_json.Sequence'.",
649 "Missing field 'tx_json.Sequence'."}}},
651 {
"The 'TransactionType' may be represented with an integer.",
654 "command": "doesnt_matter",
655 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
656 "secret": "masterpassphrase",
658 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
659 "Amount": "1000000000",
660 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
666 "Missing field 'tx_json.Sequence'.",
667 "Missing field 'tx_json.Sequence'."}}},
669 {
"'Account' must be present.",
672 "command": "doesnt_matter",
673 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
674 "secret": "masterpassphrase",
676 "Amount": "1000000000",
677 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
678 "TransactionType": "Payment"
681 {{"Missing field 'tx_json.Account'.",
682 "Missing field 'tx_json.Account'.",
683 "Missing field 'tx_json.Sequence'.",
684 "Missing field 'tx_json.Sequence'."}}},
686 {
"'Account' must be well formed.",
689 "command": "doesnt_matter",
690 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
691 "secret": "masterpassphrase",
693 "Account": "NotAnAccount",
694 "Amount": "1000000000",
695 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
696 "TransactionType": "Payment"
699 {{"Invalid field 'tx_json.Account'.",
700 "Invalid field 'tx_json.Account'.",
701 "Missing field 'tx_json.Sequence'.",
702 "Missing field 'tx_json.Sequence'."}}},
704 {
"The 'offline' tag may be added to the transaction.",
707 "command": "doesnt_matter",
708 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
709 "secret": "masterpassphrase",
712 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
713 "Amount": "1000000000",
714 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
715 "TransactionType": "Payment"
720 "Missing field 'tx_json.Sequence'.",
721 "Missing field 'tx_json.Sequence'."}}},
723 {
"If 'offline' is true then a 'Sequence' field must be supplied.",
726 "command": "doesnt_matter",
727 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
728 "secret": "masterpassphrase",
732 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
733 "Amount": "1000000000",
734 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
735 "TransactionType": "Payment"
738 {{"Missing field 'tx_json.Sequence'.",
739 "Missing field 'tx_json.Sequence'.",
740 "Missing field 'tx_json.Sequence'.",
741 "Missing field 'tx_json.Sequence'."}}},
743 {
"If 'offline' is true then a 'Fee' field must be supplied.",
746 "command": "doesnt_matter",
747 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
748 "secret": "masterpassphrase",
752 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
753 "Amount": "1000000000",
754 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
755 "TransactionType": "Payment"
758 {{"Missing field 'tx_json.Fee'.",
759 "Missing field 'tx_json.Fee'.",
760 "Missing field 'tx_json.Fee'.",
761 "Missing field 'tx_json.SigningPubKey'."}}},
763 {
"Valid transaction if 'offline' is true.",
766 "command": "doesnt_matter",
767 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
768 "secret": "masterpassphrase",
773 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
774 "Amount": "1000000000",
775 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
776 "TransactionType": "Payment"
781 "A Signer may not be the transaction's Account "
782 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh).",
783 "Missing field 'tx_json.SigningPubKey'."}}},
785 {
"'offline' and 'build_path' are mutually exclusive.",
788 "command": "doesnt_matter",
789 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
790 "secret": "masterpassphrase",
796 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
797 "Amount": "1000000000",
798 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
799 "TransactionType": "Payment"
802 {{"Field 'build_path' not allowed in this context.",
803 "Field 'build_path' not allowed in this context.",
804 "Field 'build_path' not allowed in this context.",
805 "Missing field 'tx_json.SigningPubKey'."}}},
807 {
"A 'Flags' field may be specified.",
810 "command": "doesnt_matter",
811 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
812 "secret": "masterpassphrase",
815 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
816 "Amount": "1000000000",
817 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
818 "TransactionType": "Payment"
823 "Missing field 'tx_json.Sequence'.",
824 "Missing field 'tx_json.Sequence'."}}},
826 {
"The 'Flags' field must be numeric.",
829 "command": "doesnt_matter",
830 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
831 "secret": "masterpassphrase",
833 "Flags": "NotGoodFlags",
834 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
835 "Amount": "1000000000",
836 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
837 "TransactionType": "Payment"
840 {{"Field 'tx_json.Flags' has invalid data.",
841 "Field 'tx_json.Flags' has invalid data.",
842 "Missing field 'tx_json.Sequence'.",
843 "Missing field 'tx_json.Sequence'."}}},
845 {
"It's okay to add a 'debug_signing' field.",
848 "command": "doesnt_matter",
849 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
850 "secret": "masterpassphrase",
853 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
854 "Amount": "1000000000",
855 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
856 "TransactionType": "Payment"
861 "Missing field 'tx_json.Sequence'.",
862 "Missing field 'tx_json.Sequence'."}}},
864 {
"Single-sign a multisigned transaction.",
867 "command": "doesnt_matter",
868 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
871 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
872 "Amount" : "1000000000",
873 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
879 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
880 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
881 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
885 "SigningPubKey" : "",
886 "TransactionType" : "Payment"
889 {{"Already multisigned.",
890 "Already multisigned.",
891 "Secret does not match account.",
894 {
"Minimal sign_for.",
897 "command": "doesnt_matter",
898 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
899 "secret": "masterpassphrase",
901 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
902 "Amount": "1000000000",
903 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
907 "TransactionType": "Payment"
910 {{"Secret does not match account.",
911 "Secret does not match account.",
913 "Missing field 'tx_json.Signers'."}}},
915 {
"Minimal offline sign_for.",
918 "command": "doesnt_matter",
919 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
920 "secret": "masterpassphrase",
923 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
924 "Amount": "1000000000",
925 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
929 "TransactionType": "Payment"
932 {{"",
"",
"",
"Missing field 'tx_json.Signers'."}}},
934 {
"Offline sign_for using 'seed' instead of 'secret'.",
937 "command": "doesnt_matter",
938 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
939 "key_type": "ed25519",
940 "seed": "sh1yJfwoi98zCygwijUzuHmJDeVKd",
943 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
944 "Amount": "1000000000",
945 "Destination": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
949 "TransactionType": "Payment"
952 {{"",
"",
"",
"Missing field 'tx_json.Signers'."}}},
954 {
"Malformed seed in sign_for.",
957 "command": "doesnt_matter",
958 "account": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
959 "key_type": "ed25519",
960 "seed": "sh1yJfwoi98zCygwjUzuHmJDeVKd",
963 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
964 "Amount": "1000000000",
965 "Destination": "rJrxi4Wxev4bnAGVNP9YCdKPdAoKfAmcsi",
969 "TransactionType": "Payment"
972 {{"Disallowed seed.",
975 "Missing field 'tx_json.Signers'."}}},
977 {
"Missing 'Account' in sign_for.",
980 "command": "doesnt_matter",
981 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
982 "secret": "masterpassphrase",
984 "Amount": "1000000000",
985 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
989 "TransactionType": "Payment"
992 {{"Missing field 'tx_json.Account'.",
993 "Missing field 'tx_json.Account'.",
994 "Missing field 'tx_json.Account'.",
995 "Missing field 'tx_json.Account'."}}},
997 {
"Missing 'Amount' in sign_for.",
1000 "command": "doesnt_matter",
1001 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1002 "secret": "masterpassphrase",
1004 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1005 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1008 "SigningPubKey": "",
1009 "TransactionType": "Payment"
1012 {{"Missing field 'tx_json.Amount'.",
1013 "Missing field 'tx_json.Amount'.",
1014 "Missing field 'tx_json.Amount'.",
1015 "Missing field 'tx_json.Amount'."}}},
1017 {
"Missing 'Destination' in sign_for.",
1020 "command": "doesnt_matter",
1021 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1022 "secret": "masterpassphrase",
1024 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1025 "Amount": "1000000000",
1028 "SigningPubKey": "",
1029 "TransactionType": "Payment"
1032 {{"Missing field 'tx_json.Destination'.",
1033 "Missing field 'tx_json.Destination'.",
1034 "Missing field 'tx_json.Destination'.",
1035 "Missing field 'tx_json.Destination'."}}},
1037 {
"Missing 'Fee' in sign_for.",
1040 "command": "doesnt_matter",
1041 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1042 "secret": "masterpassphrase",
1044 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1045 "Amount": "1000000000",
1046 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1048 "SigningPubKey": "",
1049 "TransactionType": "Payment"
1052 {{"Secret does not match account.",
1053 "Secret does not match account.",
1054 "Missing field 'tx_json.Fee'.",
1055 "Missing field 'tx_json.Fee'."}}},
1057 {
"Missing 'Sequence' in sign_for.",
1060 "command": "doesnt_matter",
1061 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1062 "secret": "masterpassphrase",
1064 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1065 "Amount": "1000000000",
1066 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1068 "SigningPubKey": "",
1069 "TransactionType": "Payment"
1072 {{"Secret does not match account.",
1073 "Secret does not match account.",
1074 "Missing field 'tx_json.Sequence'.",
1075 "Missing field 'tx_json.Sequence'."}}},
1077 {
"Missing 'SigningPubKey' in sign_for is automatically filled in.",
1080 "command": "doesnt_matter",
1081 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1082 "secret": "masterpassphrase",
1084 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1085 "Amount": "1000000000",
1086 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1089 "TransactionType": "Payment"
1092 {{"Secret does not match account.",
1093 "Secret does not match account.",
1095 "Missing field 'tx_json.SigningPubKey'."}}},
1097 {
"In sign_for, an account may not sign for itself.",
1100 "command": "doesnt_matter",
1101 "account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1104 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1105 "Amount": "1000000000",
1106 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1109 "TransactionType": "Payment"
1114 "A Signer may not be the transaction's Account "
1115 "(rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA).",
1116 "Missing field 'tx_json.SigningPubKey'."}}},
1118 {
"Cannot put duplicate accounts in Signers array",
1121 "command": "doesnt_matter",
1122 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1123 "secret": "masterpassphrase",
1125 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1126 "Amount" : "1000000000",
1127 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1133 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1134 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1135 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1139 "SigningPubKey" : "",
1140 "TransactionType" : "Payment"
1143 {{"Already multisigned.",
1144 "Already multisigned.",
1145 "Duplicate Signers:Signer:Account entries "
1146 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh) are not allowed.",
1149 {
"Correctly append to pre-established Signers array",
1152 "command": "doesnt_matter",
1153 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1156 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1157 "Amount" : "1000000000",
1158 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1164 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1165 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1166 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1170 "SigningPubKey" : "",
1171 "TransactionType" : "Payment"
1174 {{"Already multisigned.",
"Already multisigned.",
"",
""}}},
1176 {
"Append to pre-established Signers array with bad signature",
1179 "command": "doesnt_matter",
1180 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1183 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1184 "Amount" : "1000000000",
1185 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1191 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1192 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1193 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ACB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1197 "SigningPubKey" : "",
1198 "TransactionType" : "Payment"
1201 {{"Already multisigned.",
1202 "Already multisigned.",
1203 "Invalid signature.",
1204 "Invalid signature."}}},
1206 {
"Non-empty 'SigningPubKey' in sign_for.",
1209 "command": "doesnt_matter",
1210 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1211 "secret": "masterpassphrase",
1213 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1214 "Amount": "1000000000",
1215 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1218 "SigningPubKey": "1",
1219 "TransactionType": "Payment"
1222 {{"Secret does not match account.",
1223 "Secret does not match account.",
1224 "When multi-signing 'tx_json.SigningPubKey' must be empty.",
1225 "When multi-signing 'tx_json.SigningPubKey' must be empty."}}},
1227 {
"Missing 'TransactionType' in sign_for.",
1230 "command": "doesnt_matter",
1231 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1232 "secret": "masterpassphrase",
1234 "Account": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1235 "Amount": "1000000000",
1236 "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1239 "SigningPubKey": "",
1242 {{"Missing field 'tx_json.TransactionType'.",
1243 "Missing field 'tx_json.TransactionType'.",
1244 "Missing field 'tx_json.TransactionType'.",
1245 "Missing field 'tx_json.TransactionType'."}}},
1247 {
"TxnSignature in sign_for.",
1250 "command": "doesnt_matter",
1251 "account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1254 "Account" : "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1255 "Amount" : "1000000000",
1256 "Destination" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1262 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1263 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
1264 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998"
1268 "SigningPubKey" : "",
1269 "TxnSignature" : "304502210080EB23E78A841DDC5E3A4F10DE6EAF052207D6B519BF8954467ADB221B3F349002202CA458E8D4E4DE7176D27A91628545E7B295A5DFC8ADF0B5CD3E279B6FA02998",
1270 "TransactionType" : "Payment"
1273 {{"Already multisigned.",
1274 "Already multisigned.",
1275 "Already single-signed.",
1276 "Signing of transaction is malformed."}}},
1278 {
"Invalid field 'tx_json': string instead of object",
1281 "command": "doesnt_matter",
1282 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1283 "secret": "masterpassphrase",
1286 {{"Invalid field 'tx_json', not object.",
1287 "Invalid field 'tx_json', not object.",
1288 "Invalid field 'tx_json', not object.",
1289 "Invalid field 'tx_json', not object."}}},
1291 {
"Invalid field 'tx_json': integer instead of object",
1294 "command": "doesnt_matter",
1295 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1296 "secret": "masterpassphrase",
1299 {{"Invalid field 'tx_json', not object.",
1300 "Invalid field 'tx_json', not object.",
1301 "Invalid field 'tx_json', not object.",
1302 "Invalid field 'tx_json', not object."}}},
1304 {
"Invalid field 'tx_json': array instead of object",
1307 "command": "doesnt_matter",
1308 "account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1309 "secret": "masterpassphrase",
1310 "tx_json": [ "hello", "world" ]
1312 {{"Invalid field 'tx_json', not object.",
1313 "Invalid field 'tx_json', not object.",
1314 "Invalid field 'tx_json', not object.",
1315 "Invalid field 'tx_json', not object."}}},
1317 {
"Minimal submit_multisigned.",
1320 "command": "submit_multisigned",
1322 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1323 "Amount": "1000000000",
1324 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1330 "Account" : "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1331 "SigningPubKey" : "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8",
1332 "TxnSignature" : "3045022100909D01399AFFAD1E30D250CE61F93975B7F61E47B5244D78C3E86D9806535D95022012E389E0ACB016334052B7FE07FA6CEFDC8BE82CB410FA841D5049641C89DC8F"
1336 "SigningPubKey": "",
1337 "TransactionType": "Payment"
1340 {{"Missing field 'secret'.",
1341 "Missing field 'secret'.",
1342 "Missing field 'account'.",
1345 {
"Minimal submit_multisigned with bad signature.",
1348 "command": "submit_multisigned",
1350 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1351 "Amount": "1000000000",
1352 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1358 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1359 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1360 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1364 "SigningPubKey": "",
1365 "TransactionType": "Payment"
1368 {{"Missing field 'secret'.",
1369 "Missing field 'secret'.",
1370 "Missing field 'account'.",
1371 "Invalid signature."}}},
1373 {
"Missing tx_json in submit_multisigned.",
1376 "command": "submit_multisigned",
1380 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1381 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1382 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1387 {{"Missing field 'secret'.",
1388 "Missing field 'secret'.",
1389 "Missing field 'account'.",
1390 "Missing field 'tx_json'."}}},
1392 {
"Missing sequence in submit_multisigned.",
1395 "command": "submit_multisigned",
1397 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1398 "Amount": "1000000000",
1399 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1404 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1405 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1406 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1410 "SigningPubKey": "",
1411 "TransactionType": "Payment"
1414 {{"Missing field 'secret'.",
1415 "Missing field 'secret'.",
1416 "Missing field 'account'.",
1417 "Missing field 'tx_json.Sequence'."}}},
1419 {
"Missing SigningPubKey in submit_multisigned.",
1422 "command": "submit_multisigned",
1424 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1425 "Amount": "1000000000",
1426 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1431 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1432 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1433 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1438 "TransactionType": "Payment"
1441 {{"Missing field 'secret'.",
1442 "Missing field 'secret'.",
1443 "Missing field 'account'.",
1444 "Missing field 'tx_json.SigningPubKey'."}}},
1446 {
"Non-empty SigningPubKey in submit_multisigned.",
1449 "command": "submit_multisigned",
1451 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1452 "Amount": "1000000000",
1453 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1459 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1460 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1461 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1465 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8",
1466 "TransactionType": "Payment"
1469 {{"Missing field 'secret'.",
1470 "Missing field 'secret'.",
1471 "Missing field 'account'.",
1472 "When multi-signing 'tx_json.SigningPubKey' must be empty."}}},
1474 {
"Missing TransactionType in submit_multisigned.",
1477 "command": "submit_multisigned",
1479 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1480 "Amount": "1000000000",
1481 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1486 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1487 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1488 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1493 "SigningPubKey": "",
1496 {{"Missing field 'secret'.",
1497 "Missing field 'secret'.",
1498 "Missing field 'account'.",
1499 "Missing field 'tx_json.TransactionType'."}}},
1501 {
"Missing Account in submit_multisigned.",
1504 "command": "submit_multisigned",
1506 "Amount": "1000000000",
1507 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1513 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1514 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1515 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1519 "SigningPubKey": "",
1520 "TransactionType": "Payment"
1523 {{"Missing field 'secret'.",
1524 "Missing field 'secret'.",
1525 "Missing field 'account'.",
1526 "Missing field 'tx_json.Account'."}}},
1528 {
"Malformed Account in submit_multisigned.",
1531 "command": "submit_multisigned",
1533 "Account": "NotAnAccount",
1534 "Amount": "1000000000",
1535 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1541 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1542 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1543 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1547 "SigningPubKey": "",
1548 "TransactionType": "Payment"
1551 {{"Missing field 'secret'.",
1552 "Missing field 'secret'.",
1553 "Missing field 'account'.",
1554 "Invalid field 'tx_json.Account'."}}},
1556 {
"Account not in ledger in submit_multisigned.",
1559 "command": "submit_multisigned",
1561 "Account": "rDg53Haik2475DJx8bjMDSDPj4VX7htaMd",
1562 "Amount": "1000000000",
1563 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1569 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1570 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1571 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1575 "SigningPubKey": "",
1576 "TransactionType": "Payment"
1579 {{"Missing field 'secret'.",
1580 "Missing field 'secret'.",
1581 "Missing field 'account'.",
1582 "Source account not found."}}},
1584 {
"Missing Fee in submit_multisigned.",
1587 "command": "submit_multisigned",
1589 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1590 "Amount": "1000000000",
1591 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1596 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1597 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1598 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1602 "SigningPubKey": "",
1603 "TransactionType": "Payment"
1606 {{"Missing field 'secret'.",
1607 "Missing field 'secret'.",
1608 "Missing field 'account'.",
1609 "Missing field 'tx_json.Fee'."}}},
1611 {
"Non-numeric Fee in submit_multisigned.",
1614 "command": "submit_multisigned",
1616 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1617 "Amount": "1000000000",
1618 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1624 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1625 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1626 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1630 "SigningPubKey": "",
1631 "TransactionType": "Payment"
1634 {{"Missing field 'secret'.",
1635 "Missing field 'secret'.",
1636 "Missing field 'account'.",
1637 "Field 'tx_json.Fee' has invalid data."}}},
1639 {
"Missing Amount in submit_multisigned Payment.",
1642 "command": "submit_multisigned",
1644 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1645 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1651 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1652 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1653 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1657 "SigningPubKey": "",
1658 "TransactionType": "Payment"
1661 {{"Missing field 'secret'.",
1662 "Missing field 'secret'.",
1663 "Missing field 'account'.",
1664 "Missing field 'tx_json.Amount'."}}},
1666 {
"Invalid Amount in submit_multisigned Payment.",
1669 "command": "submit_multisigned",
1671 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1672 "Amount": "NotANumber",
1673 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1679 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1680 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1681 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1685 "SigningPubKey": "",
1686 "TransactionType": "Payment"
1689 {{"Missing field 'secret'.",
1690 "Missing field 'secret'.",
1691 "Missing field 'account'.",
1692 "Invalid field 'tx_json.Amount'."}}},
1694 {
"No build_path in submit_multisigned.",
1697 "command": "submit_multisigned",
1700 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1701 "Amount": "1000000000",
1702 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1708 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1709 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1710 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1714 "SigningPubKey": "",
1715 "TransactionType": "Payment"
1718 {{"Missing field 'secret'.",
1719 "Missing field 'secret'.",
1720 "Missing field 'account'.",
1721 "Field 'build_path' not allowed in this context."}}},
1723 {
"Missing Destination in submit_multisigned Payment.",
1726 "command": "submit_multisigned",
1728 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1729 "Amount": "1000000000",
1735 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1736 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1737 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1741 "SigningPubKey": "",
1742 "TransactionType": "Payment"
1745 {{"Missing field 'secret'.",
1746 "Missing field 'secret'.",
1747 "Missing field 'account'.",
1748 "Missing field 'tx_json.Destination'."}}},
1750 {
"Malformed Destination in submit_multisigned Payment.",
1753 "command": "submit_multisigned",
1755 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1756 "Amount": "1000000000",
1757 "Destination": "NotADestination",
1763 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1764 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1765 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1769 "SigningPubKey": "",
1770 "TransactionType": "Payment"
1773 {{"Missing field 'secret'.",
1774 "Missing field 'secret'.",
1775 "Missing field 'account'.",
1776 "Invalid field 'tx_json.Destination'."}}},
1778 {
"Missing Signers field in submit_multisigned.",
1781 "command": "submit_multisigned",
1783 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1784 "Amount": "1000000000",
1785 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1788 "SigningPubKey": "",
1789 "TransactionType": "Payment"
1792 {{"Missing field 'secret'.",
1793 "Missing field 'secret'.",
1794 "Missing field 'account'.",
1795 "Missing field 'tx_json.Signers'."}}},
1797 {
"Signers not an array in submit_multisigned.",
1800 "command": "submit_multisigned",
1802 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1803 "Amount": "1000000000",
1804 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1808 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1809 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1810 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1812 "SigningPubKey": "",
1813 "TransactionType": "Payment"
1816 {{"Missing field 'secret'.",
1817 "Missing field 'secret'.",
1818 "Missing field 'account'.",
1819 "Field 'tx_json.Signers' is not a JSON array."}}},
1821 {
"Empty Signers array in submit_multisigned.",
1824 "command": "submit_multisigned",
1826 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1827 "Amount": "1000000000",
1828 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1833 "SigningPubKey": "",
1834 "TransactionType": "Payment"
1837 {{"Missing field 'secret'.",
1838 "Missing field 'secret'.",
1839 "Missing field 'account'.",
1840 "tx_json.Signers array may not be empty."}}},
1842 {
"Duplicate Signer in submit_multisigned.",
1845 "command": "submit_multisigned",
1847 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1848 "Amount": "1000000000",
1849 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1855 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1856 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1857 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1862 "Account": "rPcNzota6B8YBokhYtcTNqQVCngtbnWfux",
1863 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1864 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1868 "SigningPubKey": "",
1869 "TransactionType": "Payment"
1872 {{"Missing field 'secret'.",
1873 "Missing field 'secret'.",
1874 "Missing field 'account'.",
1875 "Duplicate Signers:Signer:Account entries "
1876 "(rPcNzota6B8YBokhYtcTNqQVCngtbnWfux) are not allowed."}}},
1878 {
"Signer is tx_json Account in submit_multisigned.",
1881 "command": "submit_multisigned",
1883 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1884 "Amount": "1000000000",
1885 "Destination": "rnUy2SHTrB9DubsPmkJZUXTf5FcNDGrYEA",
1891 "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
1892 "TxnSignature": "3045022100F9ED357606932697A4FAB2BE7F222C21DD93CA4CFDD90357AADD07465E8457D6022038173193E3DFFFB5D78DD738CC0905395F885DA65B98FDB9793901FE3FD26ECE",
1893 "SigningPubKey": "02FE36A690D6973D55F88553F5D2C4202DE75F2CF8A6D0E17C70AC223F044501F8"
1897 "SigningPubKey": "",
1898 "TransactionType": "Payment"
1901 {{"Missing field 'secret'.",
1902 "Missing field 'secret'.",
1903 "Missing field 'account'.",
1904 "A Signer may not be the transaction's Account "
1905 "(rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh)."}}},
1917 env.
rpc(
"bad_command", R
"({"MakingThisUp": 0})")};
1919 BEAST_EXPECT(result[jss::result][jss::error] == "unknownCmd");
1921 result[jss::result][jss::request][jss::command] ==
"bad_command");
1934 "{ \"fee_mult_max\" : 1, \"tx_json\" : { } } ", req);
1946 req[jss::tx_json].isMember(jss::Fee) &&
1947 req[jss::tx_json][jss::Fee] == 10);
1953 "{ \"fee_mult_max\" : 3, \"fee_div_max\" : 2, "
1954 "\"tx_json\" : { } } ",
1967 req[jss::tx_json].isMember(jss::Fee) &&
1968 req[jss::tx_json][jss::Fee] == 10);
1974 "{ \"fee_mult_max\" : 0, \"tx_json\" : { } } ", req);
1985 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
1993 "{ \"fee_mult_max\" : 3, \"fee_div_max\" : 6, "
1994 "\"tx_json\" : { } } ",
2006 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2012 "{ \"fee_mult_max\" : 0, \"fee_div_max\" : 2, "
2013 "\"tx_json\" : { } } ",
2025 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2031 "{ \"fee_mult_max\" : 10, \"fee_div_max\" : 0, "
2032 "\"tx_json\" : { } } ",
2044 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2051 using namespace test::jtx;
2053 cfg->loadFromString(
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
2054 cfg->section(
"transaction_queue")
2055 .
set(
"minimum_txn_in_ledger_standalone",
"3");
2058 LoadFeeTrack const& feeTrackOuter = env.app().getFeeTrack();
2065 "fee_mult_max" : 1000,
2080 req[jss::tx_json].isMember(jss::Fee) &&
2081 req[jss::tx_json][jss::Fee] == 10);
2104 req[jss::tx_json].isMember(jss::Fee) &&
2105 req[jss::tx_json][jss::Fee] == 10);
2109 for (
auto i = 0; i < 4; ++i)
2111 env(noop(env.master));
2119 "fee_mult_max" : 1000,
2134 req[jss::tx_json].isMember(jss::Fee) &&
2135 req[jss::tx_json][jss::Fee] == 8889);
2157 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2165 "fee_mult_max" : 1000,
2180 BEAST_EXPECT(!req[jss::tx_json].isMember(jss::Fee));
2188 "fee_mult_max" : 8000,
2204 req[jss::tx_json].isMember(jss::Fee) &&
2205 req[jss::tx_json][jss::Fee] == 8889);
2213 "fee_mult_max" : -5,
2255 "fee_mult_max" : -2,
2277 toSign[jss::tx_json] = noop(env.master);
2278 toSign[jss::secret] =
"masterpassphrase";
2279 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2280 auto result = rpcResult[jss::result];
2284 result[jss::tx_json].isMember(jss::Fee) &&
2285 result[jss::tx_json][jss::Fee] ==
"10");
2287 result[jss::tx_json].isMember(jss::Sequence) &&
2288 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2289 Json::ValueType::uintValue));
2297 auto metrics = env.app().getTxQ().getMetrics(*env.current());
2298 if (metrics.openLedgerFeeLevel > metrics.minProcessingFeeLevel)
2300 env(noop(env.master));
2304 toSign[jss::tx_json] = noop(env.master);
2305 toSign[jss::secret] =
"masterpassphrase";
2306 toSign[jss::fee_mult_max] = 900;
2307 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2308 auto result = rpcResult[jss::result];
2312 result[jss::tx_json].isMember(jss::Fee) &&
2313 result[jss::tx_json][jss::Fee] ==
"7813");
2315 result[jss::tx_json].isMember(jss::Sequence) &&
2316 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2317 Json::ValueType::uintValue));
2325 auto& feeTrack = env.app().getFeeTrack();
2326 BEAST_EXPECT(feeTrack.getLoadFactor() == 256);
2327 for (
int i = 0; i < 8; ++i)
2328 feeTrack.raiseLocalFee();
2329 BEAST_EXPECT(feeTrack.getLoadFactor() == 1220);
2333 toSign[jss::tx_json] = noop(env.master);
2334 toSign[jss::secret] =
"masterpassphrase";
2335 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2336 auto result = rpcResult[jss::result];
2340 result[jss::tx_json].isMember(jss::Fee) &&
2341 result[jss::tx_json][jss::Fee] ==
"47");
2343 result[jss::tx_json].isMember(jss::Sequence) &&
2344 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2345 Json::ValueType::uintValue));
2355 auto metrics = env.app().getTxQ().getMetrics(*env.current());
2356 if (metrics.openLedgerFeeLevel > metrics.minProcessingFeeLevel)
2358 env(noop(env.master), fee(47));
2364 toSign[jss::tx_json] = noop(env.master);
2365 toSign[jss::secret] =
"masterpassphrase";
2367 toSign[jss::fee_mult_max] = 700;
2368 auto rpcResult = env.rpc(
"json",
"sign",
to_string(toSign));
2369 auto result = rpcResult[jss::result];
2373 result[jss::tx_json].isMember(jss::Fee) &&
2374 result[jss::tx_json][jss::Fee] ==
"6806");
2376 result[jss::tx_json].isMember(jss::Sequence) &&
2377 result[jss::tx_json][jss::Sequence].isConvertibleTo(
2378 Json::ValueType::uintValue));
2396 using namespace std::chrono_literals;
2398 test::jtx::Account
const a{
"a"};
2399 test::jtx::Account
const g{
"g"};
2400 auto const USD = g[
"USD"];
2409 test::jtx::Env env(*
this);
2413 env(
trust(a, USD(1000)));
2414 env(
trust(env.master, USD(1000)));
2415 env(
pay(g, a, USD(50)));
2416 env(
pay(g, env.master, USD(50)));
2440 static TestStuff
const testFuncs[] = {
2447 "submit_multisigned",
2450 for (
auto testFunc : testFuncs)
2458 Throw<std::runtime_error>(
2459 "Internal JSONRPC_test error. Bad test JSON.");
2461 static Role const testedRoles[] = {
2464 for (
Role testRole : testedRoles)
2467 auto const signFn = get<0>(testFunc);
2468 if (signFn !=
nullptr)
2470 assert(get<1>(testFunc) ==
nullptr);
2480 auto const submitFn = get<1>(testFunc);
2481 assert(submitFn !=
nullptr);
2493 errStr = result[
"error_message"].
asString();
2495 if (errStr == txnTest.expMsg[get<3>(testFunc)])
2502 description << txnTest.description <<
" Called "
2503 << get<2>(testFunc) <<
"(). Got \'"
2505 fail(description.
str(), __FILE__, txnTest.line);