From 08e7059b8ce65c06d905a53320d075d0baf766ea Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Mon, 3 Jul 2023 12:24:49 +0200 Subject: [PATCH 1/3] fix tests --- src/test/app/Import_test.cpp | 112 ++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 34 deletions(-) diff --git a/src/test/app/Import_test.cpp b/src/test/app/Import_test.cpp index a6ca0db7b..de0f34202 100644 --- a/src/test/app/Import_test.cpp +++ b/src/test/app/Import_test.cpp @@ -1859,17 +1859,34 @@ class Import_test : public beast::unit_test::suite env(tx, ter(temMALFORMED)); } - // telIMPORT_VL_KEY_NOT_RECOGNISED - Import: (fromchain) key does not - // match (tochain) key + // temMALFORMED - Import: validation.unl.public_key was not valid hex { Json::Value tmpXpop = accountSetXpop(); - tmpXpop[jss::validation][jss::unl][jss::public_key] = - "ED84D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" - "CDC1"; + tmpXpop[jss::validation][jss::unl][jss::public_key] = "not a hex"; Json::Value tx = import(alice, tmpXpop); - env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + env(tx, ter(temMALFORMED)); } + // temMALFORMED - Import: validation.unl.public_key was not a recognised public key type + { + Json::Value tmpXpop = accountSetXpop(); + tmpXpop[jss::validation][jss::unl][jss::public_key] = "0084D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1"; + Json::Value tx = import(alice, tmpXpop); + env(tx, ter(temMALFORMED)); + } + + // // DA REMOVE + // // telIMPORT_VL_KEY_NOT_RECOGNISED - Import: (fromchain) key does not + // // match (tochain) key + // // { + // // Json::Value tmpXpop = accountSetXpop(); + // // tmpXpop[jss::validation][jss::unl][jss::public_key] = + // // "ED84D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + // // "CDC1"; + // // Json::Value tx = import(alice, tmpXpop); + // // env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + // // } + // getInnerTxn - !xpop // DA: Duplicate - @@ -1888,8 +1905,8 @@ class Import_test : public beast::unit_test::suite env(tx, ter(temMALFORMED)); } - // temMALFORMED - !stpTrans - // DA: Duplicate - getInnerTxn (Any Failure) + // // temMALFORMED - !stpTrans + // // DA: Duplicate - getInnerTxn (Any Failure) // temMALFORMED - Import: attempted to import xpop containing an emitted // or pseudo txn. @@ -2073,6 +2090,15 @@ class Import_test : public beast::unit_test::suite env(tx, ter(temMALFORMED)); } + // temMALFORMED - Import: unl blob not signed correctly + { + Json::Value tmpXpop = accountSetXpop(); + tmpXpop[jss::validation][jss::unl][jss::signature] = "not a hex"; + Json::Value tx = import(alice, tmpXpop); + env(tx, ter(temMALFORMED)); + } + + // DA: GOOD SIGNATURE NOT JSON // temMALFORMED - Import: unl blob was not valid json (after base64 // decoding) { @@ -2082,27 +2108,41 @@ class Import_test : public beast::unit_test::suite env(tx, ter(temMALFORMED)); } + // DA: GOOD SIGNATURE GOOD JSON MISSING FIELDS // temMALFORMED - Import: unl blob json (after base64 decoding) lacked // required fields and/or types - // missing - + + // temMALFORMED - Import: unl blob validUntil <= validFrom { Json::Value tmpXpop = accountSetXpop(); - tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; + tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjowLCJleHBpcmF0aW9uIjowLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19"; + tmpXpop[jss::validation][jss::unl][jss::signature] = "2B3C0ECB63C82454522188337354C480693A9BCD64E776B4DBAD4C61B9E72DD4CC1DC237B06891E57C623C38506FE8E01B1914C9413471BCC160111E28297606"; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } - // DA: YOU ARE HERE + // temMALFORMED - Import: unl blob expired + { + Json::Value tmpXpop = accountSetXpop(); + tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjowLCJleHBpcmF0aW9uIjoxLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19"; + tmpXpop[jss::validation][jss::unl][jss::signature] = "FA82662A23EC78E9644C65F752B7A58F61F35AC36C260F9E9D5CAC7D53D16D5D615A02A6462F2618C162D089AD2E3BA7D656728392180517A81B4C47F86A640D"; + Json::Value tx = import(alice, tmpXpop); + env(tx, ter(temMALFORMED)); + } - /*temMALFORMED - Import: unl blob validUnil <= validFrom - temMALFORMED - Import: unl blob expired - temMALFORMED - Import: unl blob not yet valid + // temMALFORMED - Import: unl blob not yet valid + { + Json::Value tmpXpop = accountSetXpop(); + tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjozNjAwLCJleHBpcmF0aW9uIjo4NjQwMCwidmFsaWRhdG9ycyI6W3sidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRUQzOEJENDQ1QUZENjIxNTk2MjBDQzE5NkMyNjY4QTI2QjZGQkIzNkIwOTlFQjU1QjM4QTU4QzExQzEyMDRERTVDIiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMDR2VVJhL1dJVmxpRE1HV3dtYUtKcmI3czJzSm5yVmJPS1dNRWNFZ1RlWEhNaEFvR01OY3NnVVVOd0tvK2g3emhhWEtGK0hHdzZYaEVqb0RLcmFsa1luTWpLZGtjd1JRSWhBSjdjTjRKNk5kVmZwbnZFSS9aZXVXQ1R2bnBhSmlyS05GY0Mzek1Pamd3akFpQWJLSTBmYlhnUzFSTGxvTmh4ZEhoVnE5b3pFV1ZFOWNJd1hETjNBeHF5WTNBU1FDdDArdS9pTlNERDZiWHZVVHRkbXQ0TnJ0bGJ4NFZ6dW1UcGZqUllwNGxNb0kvaDQzcFVUanA3VkZvWGJuS1dqVmhxTmFHbTU3N0s2SjY5N1haN1RRRT0ifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEQkVFMzBGQUU5MkVFRTg4RTFDNDk4MEQwOUVDRkRFOTlBMTE2RDA3OEVDMjE4NTdEQjFCNDdCNDI2NDE4RTQyOCIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTIrNHcrdWt1N29qaHhKZ05DZXo5NlpvUmJRZU93aGhYMnh0SHRDWkJqa0tITWhBOVNtSER4T2lDTVRabDVuUnhycDJ5aldaNWdqeDJEcm9VRnJVNG5yRXFVN2RrY3dSUUloQUxkRUZlalkrcFVuZ2xpN3NUdmliMEJtREhQN042aWtWRUJJNkg3SXdVMXpBaUJkc3lvU3FQY0MyTk1xZ0FuSFhIR2RrQUl3QlFEMUFVZzlYOFpKTHlmY3dIQVNRQ3QxYktWek9NeFJRbVIzd05LNGRLZG9mSUdyeEU5U2p1TFI2UGE4QjVuMDhTWUo4SzYyZ2UrOWE2QnRaYWxFbS9IT2RjejBOQUZPY3ljckYvQ3RTQTQ9In1dfQ"; + tmpXpop[jss::validation][jss::unl][jss::signature] = "9CCA07A3EDD1334D5ADCB3730D8F3F9BD1E0C338100384C7B15B6A910F96BE4F46E3052B37E9FE2E7DC9918BD85B9E871923AE1BDD7144EE2A92F625064C570C"; + Json::Value tx = import(alice, tmpXpop); + env(tx, ter(temMALFORMED)); + } - temMALFORMED - Import: depth > 32 - temMALFORMED - Import: !proof->isObject() && !proof->isArray() - DA: Catchall Error - temMALFORMED - Import: return false - */ + // temMALFORMED - Import: depth > 32 + // temMALFORMED - Import: !proof->isObject() && !proof->isArray() + // DA: Catchall Error + // temMALFORMED - Import: return false // temMALFORMED - Import: xpop proof did not contain the specified txn // hash @@ -2116,9 +2156,9 @@ class Import_test : public beast::unit_test::suite env(tx, ter(temMALFORMED)); } - // temMALFORMED - Import: depth > 32 - // temMALFORMED - Import: !proof.isObject() && !proof.isArray() - // DA: CatchAll Error + // // temMALFORMED - Import: depth > 32 + // // temMALFORMED - Import: !proof.isObject() && !proof.isArray() + // // DA: CatchAll Error // temMALFORMED - Import: computed txroot does not match xpop txroot, // invalid xpop. @@ -2161,16 +2201,22 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob contained an invalid validator key, // skipping + // { + + // } // temMALFORMED - Import: unl blob contained an invalid manifest, // skipping - // temMALFORMED - Import: unl blob list entry manifest master key did - // not match master key, skipping - // temMALFORMED - Import: unl blob list entry manifest signature - // invalid, skipping - // temMALFORMED - Import: validator nodepub did not appear in validator - // list but did appear - // temMALFORMED - Import: validator nodepub key appears more than once - // in data section + // { + + // } + // // temMALFORMED - Import: unl blob list entry manifest master key did + // // not match master key, skipping + // // temMALFORMED - Import: unl blob list entry manifest signature + // // invalid, skipping + // // temMALFORMED - Import: validator nodepub did not appear in validator + // // list but did appear + // // temMALFORMED - Import: validator nodepub key appears more than once + // // in data section // temMALFORMED - Import: validation inside xpop was not valid hex { @@ -2605,8 +2651,6 @@ class Import_test : public beast::unit_test::suite env.fund(XRP(1000), alice, bob); env.close(); - auto const feeDrops = env.current()->fees().base; - // ACCOUNT SET { auto const preAlice = env.balance(alice); @@ -2614,13 +2658,13 @@ class Import_test : public beast::unit_test::suite env(import(alice, accountSetXpop()), ter(tesSUCCESS)); env.close(); auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000) + feeDrops); + BEAST_EXPECT(postAlice == preAlice + XRP(1000)); } // DOUBLE ENTRY { auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(2000) + feeDrops); + BEAST_EXPECT(preAlice == XRP(2000)); env(import(alice, accountSetXpop()), ter(tefPAST_IMPORT_SEQ)); env.close(); auto const postAlice = env.balance(alice); From 4f7fed3708b61ddd836002d5cf78bb2483584a79 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Mon, 3 Jul 2023 12:24:29 +0200 Subject: [PATCH 2/3] move sig check --- src/ripple/app/tx/impl/Import.cpp | 34 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/ripple/app/tx/impl/Import.cpp b/src/ripple/app/tx/impl/Import.cpp index d0a16ad29..e700e1a91 100644 --- a/src/ripple/app/tx/impl/Import.cpp +++ b/src/ripple/app/tx/impl/Import.cpp @@ -388,25 +388,12 @@ Import::preflight(PreflightContext const& ctx) << tx.getTransactionID(); return temMALFORMED; } - // manifest signing (ephemeral) key auto const signingKey = m->signingKey; // decode blob auto const data = base64_decode((*xpop)[jss::validation][jss::unl][jss::blob].asString()); - auto const sig = strUnHex((*xpop)[jss::validation][jss::unl][jss::signature].asString()); - if (!sig || - !ripple::verify( - signingKey, - makeSlice(data), - makeSlice(*sig))) - { - JLOG(ctx.j.warn()) - << "Import: unl blob not signed correctly " - << tx.getTransactionID(); - return temMALFORMED; - } Json::Reader r; Json::Value list; @@ -456,7 +443,7 @@ Import::preflight(PreflightContext const& ctx) if (validUntil <= validFrom) { JLOG(ctx.j.warn()) - << "Import: unl blob validUnil <= validFrom " + << "Import: unl blob validUntil <= validFrom " << tx.getTransactionID(); return temMALFORMED; } @@ -477,6 +464,19 @@ Import::preflight(PreflightContext const& ctx) return temMALFORMED; } + auto const sig = strUnHex((*xpop)[jss::validation][jss::unl][jss::signature].asString()); + if (!sig || + !ripple::verify( + signingKey, + makeSlice(data), + makeSlice(*sig))) + { + JLOG(ctx.j.warn()) + << "Import: unl blob not signed correctly " + << tx.getTransactionID(); + return temMALFORMED; + } + auto const tx_hash = stpTrans->getTransactionID();//sha512Half(HashPrefix::transactionID, *rawTx); JLOG(ctx.j.trace()) << "tx_hash (computed): " << tx_hash; @@ -924,12 +924,12 @@ Import::preclaim(PreclaimContext const& ctx) auto pkHex = strUnHex(strPk); if (!pkHex) return tefINTERNAL; - + auto const pkType = publicKeyType(makeSlice(*pkHex)); if (!pkType) return tefINTERNAL; - PublicKey const pk (makeSlice(*pkHex)); + PublicKey const pk (makeSlice(*pkHex)); // check on ledger if (auto const unlRep = ctx.view.read(keylet::UNLReport()); unlRep) @@ -1045,7 +1045,6 @@ Import::doApply() } else if (tt == ttREGULAR_KEY_SET) { - JLOG(ctx_.journal.warn()) << "SetRegularKey"; // key import: regular key setRegularKey = stpTrans->getAccountID(sfRegularKey); } @@ -1068,7 +1067,6 @@ Import::doApply() if (create) { // Create the account. - JLOG(ctx_.journal.warn()) << "create - create account"; std::uint32_t const seqno{ view().rules().enabled(featureDeletableAccounts) ? view().seq() : 1}; From 728d2b46834564ded98be98d23d96550dd98ebe2 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Tue, 11 Jul 2023 10:31:43 +0200 Subject: [PATCH 3/3] update tests --- src/test/app/Import_test.cpp | 905 ++++++++++++++++++---------------- src/test/app/Import_test.json | 213 ++++++++ 2 files changed, 683 insertions(+), 435 deletions(-) create mode 100644 src/test/app/Import_test.json diff --git a/src/test/app/Import_test.cpp b/src/test/app/Import_test.cpp index de0f34202..88c9c9eea 100644 --- a/src/test/app/Import_test.cpp +++ b/src/test/app/Import_test.cpp @@ -33,6 +33,8 @@ getRaw) outer txid: #include #include #include +#include + #define BEAST_REQUIRE(x) \ { \ BEAST_EXPECT(!!(x)); \ @@ -52,10 +54,10 @@ class Import_test : public beast::unit_test::suite "ED74D4036C6591A4BDF9C54CEFA39B996A" "5DCE5F86D11FDA1874481CE9D5A1CDC1"}; return envconfig([&](std::unique_ptr cfg) { - cfg->section(SECTION_RPC_STARTUP) - .append( - "{ \"command\": \"log_level\", \"severity\": \"warning\" " - "}"); + // cfg->section(SECTION_RPC_STARTUP) + // .append( + // "{ \"command\": \"log_level\", \"severity\": \"warn\" " + // "}"); cfg->NETWORK_ID = networkID; for (auto const& strPk : keys) @@ -111,308 +113,56 @@ class Import_test : public beast::unit_test::suite }; static Json::Value - accountSetXpop() + makeXpop(std::string tt, std::string tc, std::string strJson) { - std::string strJson = R"json({ - "ledger": { - "acroot": "4300DFEC01D20F18FB8AD86A1A4EC619A5F3A5C248F3A91913C0EF04D8F29734", - "close": 739431052, - "coins": "99999998999999844", - "cres": 10, - "flags": 0, - "index": 41, - "pclose": 739431051, - "phash": "B8DB71F81667151FDD00CCADB209A777371A18F8F2BE9ADED7345D210CC5FDC1", - "txroot": "CD68159512E84E0DE430AA685A7574C57AACD5FB6DA511CB9B8F4276CFAB53B5" - }, - "transaction": { - "blob": "12000322000000002400000002201B0000003B201D0000535968400000003B9ACA0073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100E3E45165E99720E0D9CA2F1101E619DC29F78DE310DEC25604A24F47D671860B02207626E36D9E5DBBB5BD33F892B0C1DF419A2E4511F164346341220627EB7FB41F8114AE123A8556F3CF91154711376AFB0F894F832B3D", - "meta": "201C00000005F8E5110061250000002955E110681DFD389BE1F7D3A1A08919C3FD16ABA78EE6A86FD7F8A2CD7512E0CBE05692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000773593F4E1E7220000000024000000032D0000000162400000003B9AC9F48114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "0": { - "children": {}, - "hash": "D73E14195A5FE5C00E71FAD095AF5EF2C1B7CEC47EF45F6751B84972C1956FF6", - "key": "05137BD9679EDF737EE6CAA69427D243C53AE6945C97E41C462AE647D25B0B12" - }, - "3": { - "children": {}, - "hash": "00D9FDA1C18A1B3950750A43F6649BE81F06C565AE6513BB14F285A2DE7A9953", - "key": "38EF03286B154F56882CF62F6AFB3B94624E6089040562E965A8243FF7397A7B" - }, - "4": { - "children": {}, - "hash": "32A91095374D7A4239301B5CE7F0A9066986913CFACF29E1B6C3CD07DED921F6", - "key": "47D5B86F48B38FBB12E570778AA5FBD8126D2C6A452F135424E7061FA1C5CF42" - }, - "5": { - "children": {}, - "hash": "361C68190AB24629D15F44D13EFF57CC0A9CA6826D24DD840749ECDB4D8DC096", - "key": "55616BC25786E929DC7B163F2DABAA17DEF3D4FC13D8BF484AA70022AE38954C" - }, - "7": { - "children": {}, - "hash": "6691A9F3EECDB5C1D4B9736DF300FFC22C3138DAD64D0D77C93A56CC5217682F", - "key": "77AB1364F7C6D1C92A42CE737D5A5C749984AFD267230A69A05724602F92DD6A" - }, - "8": { - "children": {}, - "hash": "B0D13F5F9B7BA4E5963715BBCA6CD76A4A85AF3643784C1EC065E1325852E4F9", - "key": "895F910AC4C59E4138623432F103A92E2092D458B020296715A7C86946BD0224" - }, - "A": { - "children": {}, - "hash": "50B49F162EB2D8EA2DE6646ED7B75C4AC181A8C281BFAE62FF9EB38BC26E4F87", - "key": "AA8EB7038D77837CF9055B2AF13B1AACCCEDA792B9A07732549646925A97F462" - }, - "D": { - "children": {}, - "hash": "348754862F6E8ED4D23CA346FA53DF311375D42A3BA20C33D927FB74DF5DBC56", - "key": "D146454960D401B9AB4C6DE32F8E9A9186765EFE76EE611B4A0D18D69242D51E" - }, - "E": { - "children": { - "1": { - "children": {}, - "hash": "4FA153CE29ECA36803CAC28CF27DEC73491398B64032E7030F8219179CDADCEA", - "key": "E110681DFD389BE1F7D3A1A08919C3FD16ABA78EE6A86FD7F8A2CD7512E0CBE0" - }, - "F": { - "children": {}, - "hash": "0B316915D2F11B82EE9402A7C686C5AD576510C1C209AA36506A4AF5DED0DDA9", - "key": "EFFD664A294E07A5BF939E8A2CAF19C54BB11949FCD1D28D74C3862A50CCBEE3" - } - }, - "hash": "0D7AC4E4D9BCBB51C279EC171A2FA672045A79FB1564B3ED87DAE809CD859148", - "key": "E000000000000000000000000000000000000000000000000000000000000000" - }, - "F": { - "children": { - "1": { - "children": {}, - "hash": "15AFD9F20741B8768EF4E8B4DF351F777E3660EA71F399A66C30F6A5D42FFDFB", - "key": "F11B47F322D2D1EFFA6CB6F7D3BEFE50AE152B87014CCF840886DB915FA40A13" - }, - "3": { - "children": {}, - "hash": "B663FD9DE6B4C98A4803C2ADAFA1590EF0EC8E1F9994059FF055890230BCA4EC", - "key": "F34B5CEA1C4CDEE7B4C8788B0F667C4921A555E86FC23768E51DE880924CBBD6" - }, - "A": { - "children": {}, - "hash": "0610257AAFD2B633AF9DB57CF4BAC521D3D6CD62357340A121B875442D0E9926", - "key": "FADD7A23E29B443A0F4B35B7CB0A17DACE13CA1CEAA08AF95B251701AAD81751" - }, - "F": { - "children": {}, - "hash": "F07D692BF72C72F5CC61F6FED04737A7C4E0CC8EBA0F52051C736B4FF233E9EC", - "key": "FFF1E36E035C347F06C0A54DA45981CB8ABA91EEDB82D7C61E3952F698769D2B" - } - }, - "hash": "96AC68A145A7229869267AEF3D6AA4C2C56C30184CE3BB5C20FCC11161F7A49B", - "key": "F000000000000000000000000000000000000000000000000000000000000000" - } - }, - "hash": "CD68159512E84E0DE430AA685A7574C57AACD5FB6DA511CB9B8F4276CFAB53B5", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "validation": { - "data": { - "n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN": "22800000012600000029292C12D28E514F1F56EB808B9DA5564AABB7019D3EA1692C3C5DFA49E975D56CC48963E941A25017F878F54DA3C37C554E7B5DF952E1BD1181A4D63CA05F1D6751DD1A129C4CEF4A732103D4A61C3C4E882313665E67471AE9DB28D6679823C760EBA1416B5389EB12A53B76473045022100F7BA251EBE7AC9DFC6C95BD6BA6F1372F09E90BCDC302D73E6AD5D32CA2FAA1702201234FF330B5F1C5AB53D67C50396BEDC20389F8BB9A71158FBAA2F937FB98528", - "n9KXYzdZD8YpsNiChtMjP6yhvQAhkkh5XeSTbvYyV1waF8wkNnBT": "22800000012600000029292C12D28E514F1F56EB808B9DA5564AABB7019D3EA1692C3C5DFA49E975D56CC48963E941A25017F878F54DA3C37C554E7B5DF952E1BD1181A4D63CA05F1D6751DD1A129C4CEF4A732102818C35CB205143702A8FA1EF385A5CA17E1C6C3A5E1123A032AB6A59189CC8CA76473045022100BC6CD6BE325712336C769D996F11107D145ED6732E7484B13FA8632752B3D9DF022017ABD68DC746273B2B175AACFCBB24EA1CD7DDA82D5FAA5C5BC4B054D5E94D79" - }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "849F6B8DA6E11C213B561659C16F13D35385E8EA9E775483ADC84578F6D578943DE5EB681584B2C03EFFFDFD216F9E0B21576E482F941C7195893B72B5B1F70D", - "version": 1 - } - } - })json"; - Json::Value xpop; + Json::Value jsonValue; Json::Reader reader; - reader.parse(strJson, xpop); - return xpop; + reader.parse(strJson, jsonValue); + return jsonValue[tt][tc]; } static Json::Value - setRegularKeyXpop() + loadXpop(std::string tt, std::string tc) { - std::string strJson = R"json({ - "ledger": { - "acroot": "A8AAC3B6BE8027650DCA96F5FC59D2BCB961E43B8E69554DCDC3E7D5546BD973", - "close": 739435131, - "coins": "99999998999999832", - "cres": 10, - "flags": 0, - "index": 668, - "pclose": 739435130, - "phash": "E153F8A1286AAC8A3F0DA26DACCF52C2760FEA4DEB572CD2CEF0818618E84FA6", - "txroot": "2D27060F123E5D8D96AC3ADB5F21D62CE58EF193A5EE1FAE5649D682AF490CD5" - }, - "transaction": { - "blob": "12000522000000002400000005201B000002AF201D0000535968400000000000000C73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C0527446304402205FC70E12E5638B25BD9662F22C16A3710247862CE06FC9E8D7E80DD1B97A1F5102204752F43F2F835748822EA74DA9B5AFB28BF8DDE7F8E88EDE2C72654364F5919A8114AE123A8556F3CF91154711376AFB0F894F832B3D8814AE123A8556F3CF91154711376AFB0F894F832B3D", - "meta": "201C00000000F8E511006125000000295505137BD9679EDF737EE6CAA69427D243C53AE6945C97E41C462AE647D25B0B125692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE6240000000562400000003B9AC9DCE1E7220001000024000000062D0000000462400000003B9AC9D08114AE123A8556F3CF91154711376AFB0F894F832B3D8814AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "1": { - "children": {}, - "hash": "98397F90D1A82985D12E58DDCF831F3D0B0299A920B2E5D51EC529D22CF02906", - "key": "194CB1D80535AE884C7E3CAE200267F68B03BBCD0137C391D9F3B5499B11B6D3" - } - }, - "hash": "2D27060F123E5D8D96AC3ADB5F21D62CE58EF193A5EE1FAE5649D682AF490CD5", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "validation": { - "data": { - "n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN": "2280000001260000029C292C12E27B51A19C5772B28B6A73A5DFD27FA933622CA24475C1809E5A79C7C9953340D5FD9D5017CF34CE9E06B20CFC46167FA254D3C2245F64C702E7B889A82315E41B2E0AED74732103D4A61C3C4E882313665E67471AE9DB28D6679823C760EBA1416B5389EB12A53B7646304402201F9E79949D6E122EAE09EE39913F69F792C4FCA9D6B00D13C85533D9C188848002206AC93CCF23B1B6B2E97A5E021E267EF635DE1F242DEABAC5A699534C2D53F463", - "n9KXYzdZD8YpsNiChtMjP6yhvQAhkkh5XeSTbvYyV1waF8wkNnBT": "2280000001260000029C292C12E27B51A19C5772B28B6A73A5DFD27FA933622CA24475C1809E5A79C7C9953340D5FD9D5017CF34CE9E06B20CFC46167FA254D3C2245F64C702E7B889A82315E41B2E0AED74732102818C35CB205143702A8FA1EF385A5CA17E1C6C3A5E1123A032AB6A59189CC8CA76473045022100B93F0FAC8C9832F6CF67E0404B775BCCA205431616A221190666517DE3A39D9902206E244EFA5EDABE4B72BCF3C973C475B784BED3D44E4B00837580DC23B41129E1" - }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "849F6B8DA6E11C213B561659C16F13D35385E8EA9E775483ADC84578F6D578943DE5EB681584B2C03EFFFDFD216F9E0B21576E482F941C7195893B72B5B1F70D", - "version": 1 - } + std::string fn = "../src/test/app/Import_test.json"; + try + { + // check if file exists and is not empty + if (!std::filesystem::exists(fn) || + std::filesystem::file_size(fn) == 0) + { + std::cout << "file was zero size or didn't exist" + << "\n"; + return {}; } - })json"; - Json::Value xpop; - Json::Reader reader; - reader.parse(strJson, xpop); - return xpop; - } - static Json::Value - signersListSetXpop() - { - std::string strJson = R"json({ - "ledger": { - "acroot": "4300DFEC01D20F18FB8AD86A1A4EC619A5F3A5C248F3A91913C0EF04D8F29734", - "close": 739431052, - "coins": "99999998999999844", - "cres": 10, - "flags": 0, - "index": 41, - "pclose": 739431051, - "phash": "B8DB71F81667151FDD00CCADB209A777371A18F8F2BE9ADED7345D210CC5FDC1", - "txroot": "CD68159512E84E0DE430AA685A7574C57AACD5FB6DA511CB9B8F4276CFAB53B5" - }, - "transaction": { - "blob": "12000C22000000002400000004201B0000003B201D0000535920230000000168400000000000000C73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100E462E53C592D6756968203CB4D146539BA2B397BCE5909890592E9AB7AB63204022061895689FD8FAA3CA1E1072554DB65E873BB586ECB5B7A04789D2BEC0785E3008114AE123A8556F3CF91154711376AFB0F894F832B3DF4EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1", - "meta": "201C00000007F8E311005356472CD116F1449F280243169C442271168E368750479CC7B20816170EDBDCA4E6E8202300000001F4EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1E1E1E5110061250000002955F11B47F322D2D1EFFA6CB6F7D3BEFE50AE152B87014CCF840886DB915FA40A135692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000042D0000000162400000003B9AC9E8E1E7220001000024000000052D0000000462400000003B9AC9DC8114AE123A8556F3CF91154711376AFB0F894F832B3D8814AE123A8556F3CF91154711376AFB0F894F832B3DE1E1E511006456A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217DE7220000000058A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D8214AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "0": { - "children": {}, - "hash": "D73E14195A5FE5C00E71FAD095AF5EF2C1B7CEC47EF45F6751B84972C1956FF6", - "key": "05137BD9679EDF737EE6CAA69427D243C53AE6945C97E41C462AE647D25B0B12" - }, - "3": { - "children": {}, - "hash": "00D9FDA1C18A1B3950750A43F6649BE81F06C565AE6513BB14F285A2DE7A9953", - "key": "38EF03286B154F56882CF62F6AFB3B94624E6089040562E965A8243FF7397A7B" - }, - "4": { - "children": {}, - "hash": "32A91095374D7A4239301B5CE7F0A9066986913CFACF29E1B6C3CD07DED921F6", - "key": "47D5B86F48B38FBB12E570778AA5FBD8126D2C6A452F135424E7061FA1C5CF42" - }, - "5": { - "children": {}, - "hash": "361C68190AB24629D15F44D13EFF57CC0A9CA6826D24DD840749ECDB4D8DC096", - "key": "55616BC25786E929DC7B163F2DABAA17DEF3D4FC13D8BF484AA70022AE38954C" - }, - "7": { - "children": {}, - "hash": "6691A9F3EECDB5C1D4B9736DF300FFC22C3138DAD64D0D77C93A56CC5217682F", - "key": "77AB1364F7C6D1C92A42CE737D5A5C749984AFD267230A69A05724602F92DD6A" - }, - "8": { - "children": {}, - "hash": "B0D13F5F9B7BA4E5963715BBCA6CD76A4A85AF3643784C1EC065E1325852E4F9", - "key": "895F910AC4C59E4138623432F103A92E2092D458B020296715A7C86946BD0224" - }, - "A": { - "children": {}, - "hash": "50B49F162EB2D8EA2DE6646ED7B75C4AC181A8C281BFAE62FF9EB38BC26E4F87", - "key": "AA8EB7038D77837CF9055B2AF13B1AACCCEDA792B9A07732549646925A97F462" - }, - "D": { - "children": {}, - "hash": "348754862F6E8ED4D23CA346FA53DF311375D42A3BA20C33D927FB74DF5DBC56", - "key": "D146454960D401B9AB4C6DE32F8E9A9186765EFE76EE611B4A0D18D69242D51E" - }, - "E": { - "children": { - "1": { - "children": {}, - "hash": "4FA153CE29ECA36803CAC28CF27DEC73491398B64032E7030F8219179CDADCEA", - "key": "E110681DFD389BE1F7D3A1A08919C3FD16ABA78EE6A86FD7F8A2CD7512E0CBE0" - }, - "F": { - "children": {}, - "hash": "0B316915D2F11B82EE9402A7C686C5AD576510C1C209AA36506A4AF5DED0DDA9", - "key": "EFFD664A294E07A5BF939E8A2CAF19C54BB11949FCD1D28D74C3862A50CCBEE3" - } - }, - "hash": "0D7AC4E4D9BCBB51C279EC171A2FA672045A79FB1564B3ED87DAE809CD859148", - "key": "E000000000000000000000000000000000000000000000000000000000000000" - }, - "F": { - "children": { - "1": { - "children": {}, - "hash": "15AFD9F20741B8768EF4E8B4DF351F777E3660EA71F399A66C30F6A5D42FFDFB", - "key": "F11B47F322D2D1EFFA6CB6F7D3BEFE50AE152B87014CCF840886DB915FA40A13" - }, - "3": { - "children": {}, - "hash": "B663FD9DE6B4C98A4803C2ADAFA1590EF0EC8E1F9994059FF055890230BCA4EC", - "key": "F34B5CEA1C4CDEE7B4C8788B0F667C4921A555E86FC23768E51DE880924CBBD6" - }, - "A": { - "children": {}, - "hash": "0610257AAFD2B633AF9DB57CF4BAC521D3D6CD62357340A121B875442D0E9926", - "key": "FADD7A23E29B443A0F4B35B7CB0A17DACE13CA1CEAA08AF95B251701AAD81751" - }, - "F": { - "children": {}, - "hash": "F07D692BF72C72F5CC61F6FED04737A7C4E0CC8EBA0F52051C736B4FF233E9EC", - "key": "FFF1E36E035C347F06C0A54DA45981CB8ABA91EEDB82D7C61E3952F698769D2B" - } - }, - "hash": "96AC68A145A7229869267AEF3D6AA4C2C56C30184CE3BB5C20FCC11161F7A49B", - "key": "F000000000000000000000000000000000000000000000000000000000000000" - } - }, - "hash": "CD68159512E84E0DE430AA685A7574C57AACD5FB6DA511CB9B8F4276CFAB53B5", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "validation": { - "data": { - "n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN": "22800000012600000029292C12D28E514F1F56EB808B9DA5564AABB7019D3EA1692C3C5DFA49E975D56CC48963E941A25017F878F54DA3C37C554E7B5DF952E1BD1181A4D63CA05F1D6751DD1A129C4CEF4A732103D4A61C3C4E882313665E67471AE9DB28D6679823C760EBA1416B5389EB12A53B76473045022100F7BA251EBE7AC9DFC6C95BD6BA6F1372F09E90BCDC302D73E6AD5D32CA2FAA1702201234FF330B5F1C5AB53D67C50396BEDC20389F8BB9A71158FBAA2F937FB98528", - "n9KXYzdZD8YpsNiChtMjP6yhvQAhkkh5XeSTbvYyV1waF8wkNnBT": "22800000012600000029292C12D28E514F1F56EB808B9DA5564AABB7019D3EA1692C3C5DFA49E975D56CC48963E941A25017F878F54DA3C37C554E7B5DF952E1BD1181A4D63CA05F1D6751DD1A129C4CEF4A732102818C35CB205143702A8FA1EF385A5CA17E1C6C3A5E1123A032AB6A59189CC8CA76473045022100BC6CD6BE325712336C769D996F11107D145ED6732E7484B13FA8632752B3D9DF022017ABD68DC746273B2B175AACFCBB24EA1CD7DDA82D5FAA5C5BC4B054D5E94D79" - }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "849F6B8DA6E11C213B561659C16F13D35385E8EA9E775483ADC84578F6D578943DE5EB681584B2C03EFFFDFD216F9E0B21576E482F941C7195893B72B5B1F70D", - "version": 1 - } + // open file and read its content + std::ifstream inFile(fn, std::ios::in | std::ios::binary); + if (inFile) + { + std::string content( + (std::istreambuf_iterator(inFile)), + std::istreambuf_iterator()); + + return makeXpop(tt, tc, content); } - })json"; - - Json::Value xpop; - Json::Reader reader; - reader.parse(strJson, xpop); - return xpop; + else + { + std::cout << "failed to open file" + << "\n"; + return {}; + } + } + catch (std::filesystem::filesystem_error& e) + { + std::cout << "Failed to load file " + fn + " (" + e.what() + ")"; + return {}; + } + catch (std::runtime_error& e) + { + std::cout << e.what(); + return {}; + } } void @@ -1773,9 +1523,6 @@ class Import_test : public beast::unit_test::suite using namespace jtx; using namespace std::literals::chrono_literals; - // setup env - auto const alice = Account("alice"); - for (bool const withImport : {false, true}) { // If the Import amendment is not enabled, you should not be able @@ -1783,6 +1530,8 @@ class Import_test : public beast::unit_test::suite auto const amend = withImport ? features : features - featureImport; Env env{*this, makeNetworkConfig(21337), amend}; + // setup env + auto const alice = Account("alice"); env.fund(XRP(1000), alice); env.close(); @@ -1791,16 +1540,16 @@ class Import_test : public beast::unit_test::suite auto const ownerDir = withImport ? 1 : 0; // IMPORT - Account Set - env(import(alice, accountSetXpop()), txResult); + env(import(alice, loadXpop("account_set", "normal")), txResult); env.close(); - // IMPORT - Signers List Set - env(import(alice, signersListSetXpop()), txResult); - env.close(); + // // IMPORT - Set Regular Key + // env(import(alice, loadXpop("set_regular_key", "bob_carol")), txResult); + // env.close(); - // IMPORT - Set Regular Key - env(import(alice, setRegularKeyXpop()), txResult); - env.close(); + // // IMPORT - Signers List Set + // env(import(alice, loadXpop("signers_list_set", "bob_carol")), txResult); + // env.close(); } } @@ -1828,7 +1577,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - sfFee cannot be 0 { - Json::Value tx = import(alice, accountSetXpop()); + Json::Value tx = import(alice, loadXpop("account_set", "normal")); STAmount const& fee = XRP(10); tx[jss::Fee] = fee.getJson(JsonOptions::none); env(tx, ter(temMALFORMED)); @@ -1845,7 +1594,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - sfAmount field must be in drops { - Json::Value tx = import(alice, accountSetXpop()); + Json::Value tx = import(alice, loadXpop("account_set", "normal")); STAmount const& amount = XRP(-1); tx[jss::Amount] = amount.getJson(JsonOptions::none); env(tx, ter(temMALFORMED)); @@ -1853,7 +1602,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - !xpop | XPOP.validation is not a JSON object { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation] = {}; // one of many ways to throw error Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -1861,7 +1610,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation.unl.public_key was not valid hex { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::public_key] = "not a hex"; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -1869,24 +1618,12 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation.unl.public_key was not a recognised public key type { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::public_key] = "0084D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1"; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } - // // DA REMOVE - // // telIMPORT_VL_KEY_NOT_RECOGNISED - Import: (fromchain) key does not - // // match (tochain) key - // // { - // // Json::Value tmpXpop = accountSetXpop(); - // // tmpXpop[jss::validation][jss::unl][jss::public_key] = - // // "ED84D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" - // // "CDC1"; - // // Json::Value tx = import(alice, tmpXpop); - // // env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); - // // } - // getInnerTxn - !xpop // DA: Duplicate - @@ -1898,7 +1635,7 @@ class Import_test : public beast::unit_test::suite // getInnerTxn - failed to deserialize tx blob/meta inside xpop { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "DEADBEEF"; tmpXpop[jss::transaction][jss::meta] = "DEADBEEF"; Json::Value tx = import(alice, tmpXpop); @@ -1911,7 +1648,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: attempted to import xpop containing an emitted // or pseudo txn. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12000322000000002400000002201B00000069201D0000535968400000003B" "9ACA0073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A" @@ -1929,7 +1666,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: inner txn lacked transaction result { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::meta] = "201C00000006F8E5110061250000005655463E39A6AFDDA77DBF3591BF3C2A" "4BE9BB8D9113BF6D0797EB403C3D0D894FEF5692FA6A9FC8EA6018D5D16532" @@ -1943,7 +1680,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: inner txn did not have a tesSUCCESS or tec // result { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::meta] = "201C00000006F8E5110061250000005655463E39A6AFDDA77DBF3591BF3C2A" "4BE9BB8D9113BF6D0797EB403C3D0D894FEF5692FA6A9FC8EA6018D5D16532" @@ -1957,7 +1694,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: import and txn inside xpop must be signed by // the same account { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value tx = import(bob, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1965,7 +1702,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: attempted to import xpop containing a txn with // a sfNetworkID field. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "120003210000535922000000002400000002201B00000069201D0000535968" "400000003B9ACA0073210388935426E0D08083314842EDFBB2D517BD47699F" @@ -1980,7 +1717,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: OperationLimit missing from inner xpop txn. // outer txid: { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12000322000000002400000002201B0000006C68400000003B9ACA007321ED" "A8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62ECAD0AE4A96C" @@ -1994,7 +1731,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: Wrong network ID for OperationLimit in inner // txn. outer txid: { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12000322000000002400000002201B0000006C201D0000535A68400000003B" "9ACA007321EDA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62" @@ -2009,7 +1746,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: inner txn must be an AccountSet, SetRegularKey // or SignerListSet transaction. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12006322000000002400000002201B0000006C201D0000535968400000003B" "9ACA007321EDA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62" @@ -2027,7 +1764,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: outer and inner txns were signed with // different keys. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12000322000000002400000002201B0000006C201D0000535968400000003B" "9ACA007321EBA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62" @@ -2044,7 +1781,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: failed to deserialize manifest on txid { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::manifest] = "YmFkSnNvbg=="; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2053,7 +1790,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: manifest master key did not match top level // master key in unl section of xpop { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::manifest] = "JAAAAAFxIe2E1ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+" "b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338" @@ -2067,7 +1804,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: manifest signature invalid { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::manifest] = "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+" "b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkA3UjfY5zOEkhq31tU4338" @@ -2081,7 +1818,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob not signed correctly { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::signature] = "949F6B8DA6E11C213B561659C16F13D35385E8EA9E775483ADC84578F6D578" "943DE5EB681584B2C03EFFFDFD216F9E0B21576E482F941C7195893B72B5B1" @@ -2092,7 +1829,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob not signed correctly { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::signature] = "not a hex"; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2102,7 +1839,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob was not valid json (after base64 // decoding) { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2114,7 +1851,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob validUntil <= validFrom { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjowLCJleHBpcmF0aW9uIjowLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19"; tmpXpop[jss::validation][jss::unl][jss::signature] = "2B3C0ECB63C82454522188337354C480693A9BCD64E776B4DBAD4C61B9E72DD4CC1DC237B06891E57C623C38506FE8E01B1914C9413471BCC160111E28297606"; Json::Value tx = import(alice, tmpXpop); @@ -2123,7 +1860,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob expired { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjowLCJleHBpcmF0aW9uIjoxLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQmprS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJFcVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQkk2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUjZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9DdFNBND0ifV19"; tmpXpop[jss::validation][jss::unl][jss::signature] = "FA82662A23EC78E9644C65F752B7A58F61F35AC36C260F9E9D5CAC7D53D16D5D615A02A6462F2618C162D089AD2E3BA7D656728392180517A81B4C47F86A640D"; Json::Value tx = import(alice, tmpXpop); @@ -2132,7 +1869,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob not yet valid { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MSwiZWZmZWN0aXZlIjozNjAwLCJleHBpcmF0aW9uIjo4NjQwMCwidmFsaWRhdG9ycyI6W3sidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRUQzOEJENDQ1QUZENjIxNTk2MjBDQzE5NkMyNjY4QTI2QjZGQkIzNkIwOTlFQjU1QjM4QTU4QzExQzEyMDRERTVDIiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMDR2VVJhL1dJVmxpRE1HV3dtYUtKcmI3czJzSm5yVmJPS1dNRWNFZ1RlWEhNaEFvR01OY3NnVVVOd0tvK2g3emhhWEtGK0hHdzZYaEVqb0RLcmFsa1luTWpLZGtjd1JRSWhBSjdjTjRKNk5kVmZwbnZFSS9aZXVXQ1R2bnBhSmlyS05GY0Mzek1Pamd3akFpQWJLSTBmYlhnUzFSTGxvTmh4ZEhoVnE5b3pFV1ZFOWNJd1hETjNBeHF5WTNBU1FDdDArdS9pTlNERDZiWHZVVHRkbXQ0TnJ0bGJ4NFZ6dW1UcGZqUllwNGxNb0kvaDQzcFVUanA3VkZvWGJuS1dqVmhxTmFHbTU3N0s2SjY5N1haN1RRRT0ifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEQkVFMzBGQUU5MkVFRTg4RTFDNDk4MEQwOUVDRkRFOTlBMTE2RDA3OEVDMjE4NTdEQjFCNDdCNDI2NDE4RTQyOCIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTIrNHcrdWt1N29qaHhKZ05DZXo5NlpvUmJRZU93aGhYMnh0SHRDWkJqa0tITWhBOVNtSER4T2lDTVRabDVuUnhycDJ5aldaNWdqeDJEcm9VRnJVNG5yRXFVN2RrY3dSUUloQUxkRUZlalkrcFVuZ2xpN3NUdmliMEJtREhQN042aWtWRUJJNkg3SXdVMXpBaUJkc3lvU3FQY0MyTk1xZ0FuSFhIR2RrQUl3QlFEMUFVZzlYOFpKTHlmY3dIQVNRQ3QxYktWek9NeFJRbVIzd05LNGRLZG9mSUdyeEU5U2p1TFI2UGE4QjVuMDhTWUo4SzYyZ2UrOWE2QnRaYWxFbS9IT2RjejBOQUZPY3ljckYvQ3RTQTQ9In1dfQ"; tmpXpop[jss::validation][jss::unl][jss::signature] = "9CCA07A3EDD1334D5ADCB3730D8F3F9BD1E0C338100384C7B15B6A910F96BE4F46E3052B37E9FE2E7DC9918BD85B9E871923AE1BDD7144EE2A92F625064C570C"; Json::Value tx = import(alice, tmpXpop); @@ -2147,7 +1884,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: xpop proof did not contain the specified txn // hash { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::proof][jss::children]["D"] [jss::children]["7"][jss::hash] = "12D47E7D543E15F1EDBA91CDF335722727851BDDA8C2FF8924772AD" @@ -2163,7 +1900,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: computed txroot does not match xpop txroot, // invalid xpop. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::proof][jss::children]["3"] [jss::hash] = "22D47E7D543E15F1EDBA91CDF335722727851BDDA8C2FF8924772AD" @@ -2178,7 +1915,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: unl blob contained invalid validator entry, // skipping { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3" "JzIjpbeyJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21h" @@ -2220,7 +1957,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation inside xpop was not valid hex { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value valData; valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = "not a hex"; @@ -2232,7 +1969,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation message was not for computed ledger // hash { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value valData; valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = "22800000012600000056292C0D012051A0829745427488A59B6525231634DC" @@ -2249,7 +1986,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation inside xpop was not signed with a // signing key we recognise { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value valData; valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = "22800000012600000056292C0D012051B0829745427488A59B6525231634DC" @@ -2266,7 +2003,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: validation inside xpop was not correctly // signed { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value valData; valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = "22800000012600000056292C0D012051B0829745427488A59B6525231634DC" @@ -2287,7 +2024,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: xpop did not contain an 80% quorum for the txn // it purports to prove. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); Json::Value valData; valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = ""; @@ -2301,7 +2038,7 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - Import: xpop inner txn did not contain a sequence // number or fee No Sequence { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "1200632200000000201B0000006C201D0000535968400000003B9ACA007321" "EDA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62ECAD0AE4A9" @@ -2313,7 +2050,7 @@ class Import_test : public beast::unit_test::suite } // No Fee { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "12006322000000002400000002201B0000006C201D000053597321EDA8D46E" "11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62ECAD0AE4A96C747440" @@ -2349,7 +2086,7 @@ class Import_test : public beast::unit_test::suite // tefINTERNAL/temMALFORMED - during preclaim could not parse xpop, // bailing. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation] = {}; // one of many ways to throw error Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2357,7 +2094,7 @@ class Import_test : public beast::unit_test::suite // tefINTERNAL/temMALFORMED - during preclaim could not find // importSequence, bailing. { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "1200632200000000201B0000006C201D0000535968400000003B9ACA007321" "EDA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62ECAD0AE4A9" @@ -2369,22 +2106,33 @@ class Import_test : public beast::unit_test::suite } // tefPAST_IMPORT_SEQ - { - env(import(alice, setRegularKeyXpop()), ter(tesSUCCESS)); - env(import(alice, accountSetXpop()), ter(tefPAST_IMPORT_SEQ)); + env(import(alice, loadXpop("account_set", "normal")), ter(tesSUCCESS)); + env(import(alice, loadXpop("account_set", "min")), ter(tefPAST_IMPORT_SEQ)); } // tefINTERNAL/temMALFORMED - !vlInfo { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // tefPAST_IMPORT_VL_SEQ - sfImportSequence > vlInfo->first // { - // Json::Value tx = import(alice, accountSetXpop()); + // Json::Value tx = import(alice, loadXpop("account_set", "normal")); // env(tx, ter(tefPAST_IMPORT_SEQ)); // } + + // telIMPORT_VL_KEY_NOT_RECOGNISED - Import: (fromchain) key does not + // match (tochain) key + // { + // Json::Value tmpXpop = loadXpop("account_set", "normal"); + // tmpXpop[jss::validation][jss::unl][jss::public_key] = + // "ED84D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + // "CDC1"; + // Json::Value tx = import(alice, tmpXpop); + // env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + // } } void @@ -2419,7 +2167,7 @@ class Import_test : public beast::unit_test::suite // tefINTERNAL/temMALFORMED - !xpop { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation] = {}; // one of many ways to throw error Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2429,7 +2177,7 @@ class Import_test : public beast::unit_test::suite // or fee, bailing. // No Fee { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::transaction][jss::blob] = "1200632200000000201B0000006C201D0000535968400000003B9ACA007321" "EDA8D46E11FD5D2082A4E6FF3039EB6259FBC2334983D015FC62ECAD0AE4A9" @@ -2449,7 +2197,7 @@ class Import_test : public beast::unit_test::suite // tefINTERNAL/temMALFORMED - !infoVL { - Json::Value tmpXpop = accountSetXpop(); + Json::Value tmpXpop = loadXpop("account_set", "normal"); tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; Json::Value tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); @@ -2467,20 +2215,117 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - // NO ACCOUNT + // NO ACCOUNT - MIN { + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + + // init env auto const alice = Account("alice"); + env.memoize(alice); + + // confirm env + auto const preCoins = env.current()->info().drops; + std::cout << "PRE COINS: " << preCoins << "\n"; + BEAST_EXPECT(preCoins == 99'999'999'999'900'000); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(0)); - Json::Value tx = import(alice, accountSetXpop()); + + // import tx + auto const xpopJson = loadXpop("account_set", "min"); + Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; env(tx, alice, ter(tesSUCCESS)); env.close(); + + // confirm fee was minted auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000) + XRP(2)); + BEAST_EXPECT(postAlice == preAlice + XRP(0.00001) + XRP(2)); + auto const postCoins = env.current()->info().drops; + std::cout << "POST COINS: " << postCoins << "\n"; + BEAST_EXPECT(postCoins == 99'999'999'999'900'000); + + // confirm account exists + auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT(acctSle != nullptr); + auto const feeDrops = env.current()->fees().base; + env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); } + + // NO ACCOUNT - NORMAL (10,000 B2M) + { + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + + // init env + auto const alice = Account("alice"); + env.memoize(alice); + + // confirm env + auto const preCoins = env.current()->info().drops; + std::cout << "PRE COINS: " << preCoins << "\n"; + BEAST_EXPECT(preCoins == 99'999'999'999'900'000); + auto const preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(0)); + + // import tx + auto const xpopJson = loadXpop("account_set", "normal"); + Json::Value tx = import(alice, xpopJson); + tx[jss::Sequence] = 0; + env(tx, alice, ter(tesSUCCESS)); + env.close(); + + // confirm fee was minted + auto const postAlice = env.balance(alice); + BEAST_EXPECT(postAlice == preAlice + XRP(10000) + XRP(2)); + auto const postCoins = env.current()->info().drops; + std::cout << "POST COINS: " << postCoins << "\n"; + BEAST_EXPECT(postCoins == 99'999'999'999'900'000); + + // confirm account exists + auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT(acctSle != nullptr); + auto const feeDrops = env.current()->fees().base; + env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); + } + + // NO ACCOUNT - MAX + // { + // // init env + // auto const alice = Account("alice"); + // env.memoize(alice); + + // // confirm env + // auto const preCoins = env.current()->info().drops; + // BEAST_EXPECT(preCoins == 100'000'000'000'000'000); + // auto const preAlice = env.balance(alice); + // BEAST_EXPECT(preAlice == XRP(0)); + + // // import tx + // auto const xpopJson = loadXpop("account_set", "max"); + // Json::Value tx = import(alice, xpopJson); + // tx[jss::Sequence] = 0; + // env(tx, alice, ter(tesSUCCESS)); + // env.close(); + + // // confirm fee was minted + // auto const postAlice = env.balance(alice); + // BEAST_EXPECT(postAlice == preAlice + XRP(999'999'999'999'000'000) + XRP(2)); + // auto const postCoins = env.current()->info().drops; + // std::cout << "POST COINS: " << postCoins << "\n"; + + // // confirm account exists + // auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); + // BEAST_EXPECT(acctSle != nullptr); + // auto const feeDrops = env.current()->fees().base; + // env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); + // } } void @@ -2493,18 +2338,41 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; + // burn 100,000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + auto const alice = Account("alice"); env.fund(XRP(1000), alice); env.close(); // FUNDED ACCOUNT { + // confirm env + auto const preCoins = env.current()->info().drops; + std::cout << "PRE COINS: " << preCoins << "\n"; + BEAST_EXPECT(preCoins == 99'999'999'999'899'980); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); - env(import(alice, accountSetXpop()), ter(tesSUCCESS)); + + // import tx + env(import(alice, loadXpop("account_set", "normal")), ter(tesSUCCESS)); env.close(); + + // confirm fee was minted auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000)); + BEAST_EXPECT(postAlice == preAlice + XRP(10000)); + env.close(); + auto const postCoins = env.current()->info().drops; + std::cout << "POST COINS: " << postCoins << "\n"; + BEAST_EXPECT(postCoins == 99'999'999'999'899'980); + + // confirm account exists + auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT(acctSle != nullptr); + auto const feeDrops = env.current()->fees().base; + env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); } } @@ -2518,22 +2386,46 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; + // burn 100,000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + // NO ACCOUNT { - auto const alice = Account("alice"); - auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(0)); - Json::Value tx = import(alice, setRegularKeyXpop()); + // init env + auto const bob = Account("bob"); + auto const carol = Account("carol"); + env.memoize(bob); + env.memoize(carol); + + // confirm env + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == 99'999'999'999'900'000); + auto const preBob = env.balance(bob); + BEAST_EXPECT(preBob == XRP(0)); + + // import tx + auto const xpopJson = loadXpop("set_regular_key", "bob_carol"); + Json::Value tx = import(bob, xpopJson); tx[jss::Sequence] = 0; - env(tx, alice, ter(tesSUCCESS)); + env(tx, bob, ter(tesSUCCESS)); env.close(); - auto const postAlice = env.balance(alice); + + // confirm fee was minted + auto const postBob = env.balance(bob); auto const feeDrops = env.current()->fees().base; BEAST_EXPECT( - postAlice == preAlice + XRP(2) + feeDrops + XRP(0.000002)); + postBob == preBob + XRP(2) + feeDrops + XRP(0.000002)); + auto const postCoins = env.current()->info().drops; + std::cout << "POST COINS: " << postCoins << "\n"; + BEAST_EXPECT(postCoins == 99'999'999'999'900'000); + + // confirm regular key auto const [acct, acctSle] = - accountKeyAndSle(*env.current(), alice); - BEAST_EXPECT(acctSle->getAccountID(sfRegularKey) == alice.id()); + accountKeyAndSle(*env.current(), bob); + BEAST_EXPECT(acctSle->getAccountID(sfRegularKey) == carol.id()); + env(noop(bob), sig(carol), fee(feeDrops), ter(tesSUCCESS)); } } @@ -2547,22 +2439,43 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; - auto const alice = Account("alice"); - env.fund(XRP(1000), alice); + // burn 100,000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); env.close(); + auto const bob = Account("bob"); + auto const carol = Account("carol"); + env.fund(XRP(1000), bob, carol); + env.close(); + + // FUNDED ACCOUNT { - auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(1000)); - env(import(alice, setRegularKeyXpop()), ter(tesSUCCESS)); + // confirm env + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == 99'999'999'999'899'960); + auto const preBob = env.balance(bob); + BEAST_EXPECT(preBob == XRP(1000)); + + // import tx + auto const xpopJson = loadXpop("set_regular_key", "bob_carol"); + env(import(bob, xpopJson), ter(tesSUCCESS)); env.close(); - auto const postAlice = env.balance(alice); + + // confirm fee was minted + auto const postBob = env.balance(bob); auto const feeDrops = env.current()->fees().base; - BEAST_EXPECT(postAlice == preAlice + feeDrops + XRP(0.000002)); + BEAST_EXPECT(postBob == preBob + feeDrops + XRP(0.000002)); + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == 99'999'999'999'899'960); + std::cout << "POST COINS: " << postCoins << "\n"; + + // confirm regular key auto const [acct, acctSle] = - accountKeyAndSle(*env.current(), alice); - BEAST_EXPECT(acctSle->getAccountID(sfRegularKey) == alice.id()); + accountKeyAndSle(*env.current(), bob); + BEAST_EXPECT(acctSle->getAccountID(sfRegularKey) == carol.id()); + env(noop(bob), sig(carol), fee(feeDrops), ter(tesSUCCESS)); } } @@ -2576,28 +2489,43 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; + // burn 100,000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + // NO ACCOUNT { - auto const alice = Account("alice"); + // init env auto const bob = Account("bob"); - auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(0)); - Json::Value tx = import(alice, signersListSetXpop()); + auto const carol = Account("carol"); + env.memoize(bob); + env.memoize(carol); + + // confirm env + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == 99'999'999'999'900'000); + auto const preBob = env.balance(bob); + BEAST_EXPECT(preBob == XRP(0)); + + // import tx + auto const xpopJson = loadXpop("signers_list_set", "bob_carol"); + Json::Value tx = import(bob, xpopJson); tx[jss::Sequence] = 0; - env(tx, alice, ter(tesSUCCESS)); + env(tx, bob, ter(tesSUCCESS)); env.close(); - auto const postAlice = env.balance(alice); + + // confirm fee was minted + auto const postBob = env.balance(bob); auto const feeDrops = env.current()->fees().base; - BEAST_EXPECT( - postAlice == preAlice + feeDrops + XRP(2) + XRP(0.000002)); - auto const [signers, signersSle] = - signersKeyAndSle(*env.current(), alice); - BEAST_REQUIRE(!!signersSle); - auto const signerEntries = - signersSle->getFieldArray(sfSignerEntries); - BEAST_EXPECT(signerEntries.size() == 1); - BEAST_EXPECT(signerEntries[0u].getFieldU16(sfSignerWeight) == 1); - BEAST_EXPECT(signerEntries[0u].getAccountID(sfAccount) == bob.id()); + BEAST_EXPECT(postBob == preBob + feeDrops + XRP(2) + XRP(0.000002)); + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == 99'999'999'999'900'000); + std::cout << "POST COINS: " << postCoins << "\n"; + + // confirm signers not set + auto const k = keylet::signers(bob); + BEAST_EXPECT(env.current()->read(k) == nullptr); } } @@ -2611,35 +2539,133 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; - auto const alice = Account("alice"); + // burn 100,000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(100'000), ter(tesSUCCESS)); + env.close(); + auto const bob = Account("bob"); - env.fund(XRP(1000), alice, bob); + auto const carol = Account("carol"); + env.fund(XRP(1000), bob, carol); env.close(); // FUNDED ACCOUNT { - auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(1000)); - env(import(alice, signersListSetXpop()), ter(tesSUCCESS)); - env.close(); - auto const postAlice = env.balance(alice); - auto const feeDrops = env.current()->fees().base; - BEAST_EXPECT(postAlice == preAlice + feeDrops + XRP(0.000002)); + // confirm env + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == 99'999'999'999'899'960); + auto const preBob = env.balance(bob); + BEAST_EXPECT(preBob == XRP(1000)); + // import tx + auto const xpopJson = loadXpop("signers_list_set", "bob_carol"); + env(import(bob, xpopJson), ter(tesSUCCESS)); + env.close(); + + // confirm fee minted + auto const postBob = env.balance(bob); + auto const feeDrops = env.current()->fees().base; + BEAST_EXPECT(postBob == preBob + feeDrops + XRP(0.000002)); + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == 99'999'999'999'899'960); + std::cout << "POST COINS: " << postCoins << "\n"; + + // confirm signers set auto const [signers, signersSle] = - signersKeyAndSle(*env.current(), alice); + signersKeyAndSle(*env.current(), bob); auto const signerEntries = signersSle->getFieldArray(sfSignerEntries); BEAST_EXPECT(signerEntries.size() == 1); BEAST_EXPECT(signerEntries[0u].getFieldU16(sfSignerWeight) == 1); - BEAST_EXPECT(signerEntries[0u].getAccountID(sfAccount) == bob.id()); + BEAST_EXPECT(signerEntries[0u].getAccountID(sfAccount) == carol.id()); + + // confirm multisign tx + auto const bobSeq = env.seq(bob); + env(noop(bob), + msig(carol), + fee(3 * feeDrops), + ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT(env.seq(bob) == bobSeq + 1); } } void - testDoubleEntry(FeatureBitset features) + testImportSequence(FeatureBitset features) { - testcase("double entry"); + testcase("import sequence"); + + using namespace test::jtx; + using namespace std::literals; + + // test tefPAST_IMPORT_SEQ + { + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + auto preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(1000)); + env(import(alice, loadXpop("account_set", "normal")), ter(tesSUCCESS)); + env.close(); + auto const postAlice = env.balance(alice); + BEAST_EXPECT(postAlice == preAlice + XRP(1000)); + + preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(2000)); + env(import(alice, loadXpop("account_set", "normal")), ter(tefPAST_IMPORT_SEQ)); + env.close(); + BEAST_EXPECT(preAlice == XRP(2000)); + } + + // test chain of events + { + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + auto const alice = Account("alice"); + auto const bob = Account("bob"); + auto const carol = Account("carol"); + auto const dave = Account("dave"); + + env.fund(XRP(1000), alice, bob, carol, dave); + env.close(); + + auto const feeDrops = env.current()->fees().base; + + // bob import carol as regular key + auto const xpopJson1 = loadXpop("set_regular_key", "import_seq_1"); + env(import(bob, xpopJson1), ter(tesSUCCESS)); + env.close(); + + // carol signs noop + env(noop(bob), sig(carol), fee(feeDrops), ter(tesSUCCESS)); + env.close(); + + // bob, using carol, import carol and dave as signers list + auto const xpopJson2 = loadXpop("signers_list_set", "import_seq_2"); + // env(import(bob, xpopJson2), sig(carol, dave), ter(tesSUCCESS)); + // env.close(); + + // msig carol and dave signs noop + // env(noop(bob), msig(carol), (feeDrops), ter(tesSUCCESS)); + // env.close(); + + // bob, using msig (carol, dave), import bob as regular key + auto const xpopJson3 = loadXpop("set_regular_key", "import_seq_3"); + // env(import(bob, xpopJson3), sig(carol), ter(tesSUCCESS)); + // env.close(); + + // bob signs noop + env(noop(bob), fee(feeDrops), ter(tesSUCCESS)); + env.close(); + } + } + + void + testMaxSupply(FeatureBitset features) + { + testcase("max supply"); using namespace test::jtx; using namespace std::literals; @@ -2647,31 +2673,38 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{*this, makeNetworkConfig(21337)}; auto const alice = Account("alice"); - auto const bob = Account("bob"); - env.fund(XRP(1000), alice, bob); + env.fund(XRP(1000), alice); env.close(); - - // ACCOUNT SET { - auto const preAlice = env.balance(alice); + auto const preCoins = env.current()->info().drops; + std::cout << "PRE COINS: " << preCoins << "\n"; + BEAST_EXPECT(preCoins == 99'999'999'999'999'980); + auto preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); - env(import(alice, accountSetXpop()), ter(tesSUCCESS)); + env(import(alice, loadXpop("account_set", "normal")), ter(tesSUCCESS)); env.close(); auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000)); + BEAST_EXPECT(postAlice == preAlice + XRP(10000)); + auto const postCoins = env.current()->info().drops; + std::cout << "POST COINS: " << postCoins << "\n"; + BEAST_EXPECT(postCoins == 99'999'999'999'999'980); } + } - // DOUBLE ENTRY - { - auto const preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(2000)); - env(import(alice, accountSetXpop()), ter(tefPAST_IMPORT_SEQ)); - env.close(); - auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice); - } - // DELETE ACCOUNT - // ACCOUNT SET + void + testUNLReport(FeatureBitset features) + { + testcase("unl report"); + + using namespace test::jtx; + using namespace std::literals; + + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + + // DA: TODO } public: @@ -2703,7 +2736,9 @@ public: testSetRegularKeyFA(features); testSignersListSetNA(features); testSignersListSetFA(features); - testDoubleEntry(features); + // testImportSequence(features); + testMaxSupply(features); + // testUNLReport(features); } }; diff --git a/src/test/app/Import_test.json b/src/test/app/Import_test.json new file mode 100644 index 000000000..4f5c93718 --- /dev/null +++ b/src/test/app/Import_test.json @@ -0,0 +1,213 @@ +{ + "account_set": { + "min": { + "ledger": { + "acroot": "97A33800660C87FB79EA1E7F998B6E0F864FBB8C36E1828D5F44E5AE2C7B0832", + "close": 742337421, + "coins": "99999999999999858", + "cres": 10, + "flags": 0, + "index": 564, + "pclose": 742337420, + "phash": "01D9E5CD0E0B9731A19011D2C0A4FC1BB071FD7A725331E3AF9EE2D0BD1900D5", + "txroot": "B9964E7B5E19A70D690F896C93955B6C2E3F36621E4C4E3E60D527B72FCAA8AC" + }, + "transaction": { + "blob": "12000322000000002400000002201B00000246201D0000535968400000000000000A73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100AFA421E92AE4F523F6264DEAD1A191095276BABB1512B1A3F937F922C442EBC302202DE241E718F5150C03C2FEEE3E43C275BD99A9FE57BD38D7B3EDD2D29A1693038114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E51100612500000176556E648E37BC5FCAC89E3F5F6AE9CFD3642A4810E7FF9F4F2556B0232839CD741F5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000773593F4E1E7220000000024000000032D000000016240000000773593EA8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "8": { + "children": {}, + "hash": "F26F9D8569266D3AB4EDD57D4967FDE1FA4F9DD6D13F15B34564649BAC2C3DD3", + "key": "81B99F7D5E6A060F8A95BA1242558A5242169F468C7CAC4D747F5308C00E0BDD" + } + }, + "hash": "B9964E7B5E19A70D690F896C93955B6C2E3F36621E4C4E3E60D527B72FCAA8AC", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000234292C3F2B8D5114D6124F7810B6C55EBBC1BE3EF120ED71AD1177069F57516958352A49A488285017001FA66BFD8047E80B02C9F3E219966401823937FB7ADD01CFCB640B64039041732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB3280757646304402200D7A4F0C6A3322004911954682787FBAA0EAD094F5FF99BEB2E3BF7E9807B1CA022052FD558C455AB9BB54CEDC1B447AF0737E6F5F67F22C07ACE3C803CE93AEB93D", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000234292C3F2B8D5114D6124F7810B6C55EBBC1BE3EF120ED71AD1177069F57516958352A49A488285017001FA66BFD8047E80B02C9F3E219966401823937FB7ADD01CFCB640B64039041732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76463044022044BDD4925425350FDA97F0044A4E55938C6710CBE487AADD1887EFA76DFB8A6202203BB2711B4E9C8D37F9CEF6CE3B31D69254463C3CB04E91BDC313DF5FBC187378" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } + } + }, + "max": { + "ledger": { + "acroot": "8A1732AB91953D0093AF5CB7447BD8E7C24805DCB01BB23F79258CF167E16249", + "close": 742324483, + "coins": "99999999998999868", + "cres": 10, + "flags": 0, + "index": 48, + "pclose": 742324482, + "phash": "F0F51F0E524AC82A25D3ECF11A702C51F6906FB37FBFB029F92CB70D4C10BE84", + "txroot": "BFD49B8622E29F4C62282C4618036EC7BBABB6C18E2F454B58AAC673657FEB9D" + }, + "transaction": { + "blob": "12000322000000002400000002201B00000042201D000053596840000000000F424073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100D0A0519C1CC56DF9478BC803C67A06B385FAB1414F73CB0385CCA545CB296BE402206B0844DA18F4209A3F6645C267B4B0A0BEBE9C61A93A707EEBA3666F1F71A3078114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E51100612500000017558E1B96AFCA6F571DE01430A2AE8167C812377DB92FF476EA9FF9DD10508428AB5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000773593F4E1E7220000000024000000032D000000016240000000772651B48114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "7": { + "children": {}, + "hash": "B965E3A7DD50B0635B90E1CEF7D2892188C210E4FCE44A153DFB7CFDAB1E8B2E", + "key": "7DD23F399E94A202C2E9FFB17B4EDA044804C35811B0A4532847E8144925383E" + } + }, + "hash": "BFD49B8622E29F4C62282C4618036EC7BBABB6C18E2F454B58AAC673657FEB9D", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000030292C3EF907517FC39D3103A3008D15C0DBF0B06176A9DB86EF3B55FF829960CFBE640A67C21D5017531BCBC1BA1DB5459262AA1020FB817C64937C46D83212E1DD86B4E0959907CE732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100AFD1037DC3C4AC538706675F7D9EC209725B4FFAF302501DE3EA0714514608200220791B694E3FA23187A7A69865FC214CB54B66C730DEF5298DF7EFE6F662BE3F85", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000030292C3EF907517FC39D3103A3008D15C0DBF0B06176A9DB86EF3B55FF829960CFBE640A67C21D5017531BCBC1BA1DB5459262AA1020FB817C64937C46D83212E1DD86B4E0959907CE732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C7646304402206724A8EDD93852C91EB37F85E1F414EEFF8FCF0919D97E3DF106FDBDC02B5CCA022059B919DE4D2652C7620F9EA4CBF1D1DAECF3878ABEF51CC31E317DAB87C5B7F7" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } + } + }, + "normal": { + "ledger": { + "acroot": "EC42561595C2F73EDDBFB8846F2196D778250257A5A66546BC129D7721A5CB85", + "close": 742337432, + "coins": "99999989999999846", + "cres": 10, + "flags": 0, + "index": 568, + "pclose": 742337431, + "phash": "9D47A8E804AD574EDBD671E1E4323318281C22AF5B297233AD74B1F685F2F7A7", + "txroot": "933EA732C14E0FA3069C0AF83FC2E434E9C58282148AC718C5788DA540DDC267" + }, + "transaction": { + "blob": "12000322000000002400000003201B0000024A201D000053596840000002540BE40073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100991E74BCD1333776078A4D8F59354771DBC06F24F8293A5015C0D6A0F127881802205B3EACB3C8C07CB980CE966061AFC19F8FCE152CD0DB80D0EF66D5B7AC4E9B0C8114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E51100612500000236559B1EBDEB08EADCD1BC3B6EE0A8856DAD2A35A62BDAE3E39112FFC7935B62407D5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000036240000002CB4177EAE1E7220000000024000000042D000000016240000000773593EA8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "F": { + "children": {}, + "hash": "3B052F2DF8949DC8EFFE98297A9FC9F4958ABB181C234E931B25102D4529ABC3", + "key": "FACBD3B8FF31CF176A2DB7A01AB167E9839054D1621D64406C09C4BB6DC98551" + } + }, + "hash": "933EA732C14E0FA3069C0AF83FC2E434E9C58282148AC718C5788DA540DDC267", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000238292C3F2B995120D5C6F937808411ACF69B101DD4E24254D2AC0695087300A1DA792E09B9C73E50171949A5AF75257287032CA57BBD371B28801B7C9E336CD318AE67965AB9119907732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB328075764630440220535F0F80D143C6062927B97533CCB14B57DB5BED70D608BAA827882CAC72969602200E30BE27DD5EF26F7D8BD33A23CC2B366D67D3AEFBAB39412869FFB6C110FC2D", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000238292C3F2B995120D5C6F937808411ACF69B101DD4E24254D2AC0695087300A1DA792E09B9C73E50171949A5AF75257287032CA57BBD371B28801B7C9E336CD318AE67965AB9119907732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C764730450221009B313A59BB9D0E5938E216F421BE23687E19624D36A668F767CB72DFC2ADF42F02202E67939A4A67BD5C68DF6DF809A3DF55F775966A863AF06A5426593A083FFDCF" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } + } + } + }, + "set_regular_key": { + "bob_carol": { + "ledger": { + "acroot": "ED0D800FC4754CBE36C94D5315025B94299B2FA72417B6A0A9387D251AD700CD", + "close": 742363572, + "coins": "99999989999999774", + "cres": 10, + "flags": 0, + "index": 2094, + "pclose": 742363571, + "phash": "FFD9AAE48CFD3D594A02DD889D72E056509A66EA4C154A74000B976E98247056", + "txroot": "7750733E691A2C35770B26D6A5138D83A497BCE7CB2BCCC2531D439F63627C13" + }, + "transaction": { + "blob": "12000522000000002400000002201B00000840201D0000535968400000000000000C732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74463044022037F80F8318D0C87BDCA2F51BC297B251652EB2D0ED96B0FFB52EFCBA7F8511B20220740C475F8127419E5749026D32F9529F9CFAD4756F1B4CE09452B799650559558114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90F8814B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96", + "meta": "201C00000000F8E5110061250000017755B354E5E47BC4D3AA77F77721034F1A761D7B2AD38A918B1A0314409CC430551256DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BFE6220000000024000000026240000000773593F4E1E7220001000024000000032D000000016240000000773593E88114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90F8814B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1E1F1031000", + "proof": { + "children": { + "1": { + "children": {}, + "hash": "963330246DABC0461541E005B55BAE69E3A070CE11FE9324D710916CB39CAD90", + "key": "1F50F59EEFA7B5245249A8D10707FBA776E5A29105B4A9ECF798F7A88BD6F5EF" + } + }, + "hash": "7750733E691A2C35770B26D6A5138D83A497BCE7CB2BCCC2531D439F63627C13", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "2280000001260000082E292C3F91B651C6C9351A5A4F2A9B43E5EA4376FE48636E8A74F2EA7804745A43831F7B034EF35017156B7F2315497560DFED9F439AD21300167036637B4F600FBDE736EA5CC62939732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB3280757646304402200ED6685AD27545F12542AE6B98EFDE47D9C077379C13F6D55AAEE23421492F2D022000A04CBAB43BC9FDFA42C697B8AB1D86B915D3155F413834A4655097893FD9D9", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "2280000001260000082E292C3F91B651C6C9351A5A4F2A9B43E5EA4376FE48636E8A74F2EA7804745A43831F7B034EF35017156B7F2315497560DFED9F439AD21300167036637B4F600FBDE736EA5CC62939732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100C27F7E3A3644A56AD9FDF87CE70CC81EB3B8C4740929E2A03A0C75929344BC6F02207E231935B72CFB2B3D1004539D5CB7DB8D6BC25C1B748D7EF5578B515112FEE3" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } + } + } + }, + "signers_list_set": { + "bob_carol": { + "ledger": { + "acroot": "92DD144DC84EBB91D28CF39E394D22CC49605E98F37659D6FB924B7E94B6C9C2", + "close": 742366630, + "coins": "99999989999999762", + "cres": 10, + "flags": 0, + "index": 3085, + "pclose": 742366623, + "phash": "E1B203AB0C4A46F0FEB4EFF1A226C275ED283A8B0C07E10B284856B567C0F118", + "txroot": "E82EE5DFEA5C555A41DE0A35986EF49B99DE973714C771F0788A06AE0FB7367A" + }, + "transaction": { + "blob": "12000C22000000002400000003201B00000C1F201D0000535920230000000168400000000000000C732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74473045022100D3EB1A9FB348299C8E078C964EA2F48564B8413414E9C6F98227A4B8D0B9C0CE02207C2825FF0CA7CA18DDBCE41334B97286C78E0225C3ED4A0ACBE2C30E7EA220D58114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FF4EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1F1", + "meta": "201C00000000F8E311005356309F2FD343BBD02EB3E4933590BF7DDEFE627925429891E7257BEFD6424A2385E8202300000001F4EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1F1E1E1E511006456A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79CE7220000000058A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C8214F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1E5110061250000082E551F50F59EEFA7B5245249A8D10707FBA776E5A29105B4A9ECF798F7A88BD6F5EF56DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BFE624000000032D000000016240000000773593E8E1E7220001000024000000042D000000046240000000773593DC8114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90F8814B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1E1F1031000", + "proof": { + "children": { + "7": { + "children": {}, + "hash": "DCFF636CB097005A3DEB14EECC7E5AD569A6A03BE29B53AF49386BD89E344779", + "key": "72259AAC8B09558809990D18E5B065775892DAF2CE36603C84E9B3FF8CA670E4" + } + }, + "hash": "E82EE5DFEA5C555A41DE0A35986EF49B99DE973714C771F0788A06AE0FB7367A", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000C0D292C3F9DA55108619820DEDA9F9B137F2230FC87CA09FBACAB5D0691978DEACF53537875D5D3501778D81B6CAC4159F7D2CBE95791F3BE394B5D02B322666FE9D22AE1AC38CC3377732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100D5E57FDEBE2A6D4BDA8BA322E69809A9F01C1D95043CF94449E86537F7064DE602203C032A707349F779BCCDDDEC003FE8ACF9E0A6B6D590BC64C529E28490ED1761", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000C0D292C3F9DA55108619820DEDA9F9B137F2230FC87CA09FBACAB5D0691978DEACF53537875D5D3501778D81B6CAC4159F7D2CBE95791F3BE394B5D02B322666FE9D22AE1AC38CC3377732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100F65AADC0A6C07C4497EB7C8574E4D1CB951666735CFE48CE348569EB205F27B002205C2D26B3FAB1A078E9FB0ACEA3221E358089325422D11D3D920C3EDE14F10FF7" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } + } + } + } +} \ No newline at end of file