From debf178546232a427c66bed40a9b6961ba1b3684 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Tue, 19 Sep 2023 11:26:16 +0200 Subject: [PATCH] Update Import Tests (#99) * add fee multiplier * add warn logs * add unl sequence json * add import sequence tests * Update TER.cpp * remove issuer xpop * Update Import_test.cpp * update max xpop * update/add max & fee change tests * fixup issuer/hook test --- src/ripple/app/tx/impl/Import.cpp | 17 +- src/ripple/protocol/impl/TER.cpp | 1 + src/test/app/Import_json.h | 574 ++++++------ src/test/app/Import_test.cpp | 1344 ++++++++++++++++++----------- 4 files changed, 1164 insertions(+), 772 deletions(-) diff --git a/src/ripple/app/tx/impl/Import.cpp b/src/ripple/app/tx/impl/Import.cpp index 291ddae1429..87213750539 100644 --- a/src/ripple/app/tx/impl/Import.cpp +++ b/src/ripple/app/tx/impl/Import.cpp @@ -134,7 +134,6 @@ Import::preflight(PreflightContext const& ctx) auto& tx = ctx.tx; - if (tx.getFieldVL(sfBlob).size() > (512 * 1024)) { JLOG(ctx.j.warn()) @@ -869,12 +868,19 @@ Import::preclaim(PreclaimContext const& ctx) auto const vlInfo = getVLInfo(*xpop, ctx.j); if (!vlInfo) + { + JLOG(ctx.j.warn()) + << "Import: during preclaim could not parse vlInfo, bailing."; return tefINTERNAL; + } auto const& sleVL = ctx.view.read(keylet::import_vlseq(vlInfo->second)); - if (sleVL && sleVL->getFieldU32(sfImportSequence) > vlInfo->first) + { + JLOG(ctx.j.warn()) + << "Import: import vl sequence already used, bailing."; return tefPAST_IMPORT_VL_SEQ; + } // check master VL key std::string strPk = (*xpop)[jss::validation][jss::unl][jss::public_key].asString(); @@ -883,7 +889,6 @@ Import::preclaim(PreclaimContext const& ctx) found != ctx.app.config().IMPORT_VL_KEYS.end()) return tesSUCCESS; - // not found in our local VL keys auto pkHex = strUnHex(strPk); if (!pkHex) return tefINTERNAL; @@ -903,6 +908,8 @@ Import::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } + JLOG(ctx.j.warn()) + << "Import: import vl key not recognized, bailing."; return telIMPORT_VL_KEY_NOT_RECOGNISED; } @@ -1091,7 +1098,7 @@ Import::doApply() auto const keyletVL = keylet::import_vlseq(infoVL->second); auto sleVL = view().peek(keyletVL); - + if (!sleVL) { // create VL import seq counter @@ -1231,7 +1238,7 @@ Import::doApply() sle->setFieldU64(sfAccountIndex, accIdx); sleFees->setFieldU64(sfAccountCount, accIdx + 1); } - + if (ctx_.tx.getSigningPubKey().empty() || calcAccountID(PublicKey(makeSlice(ctx_.tx.getSigningPubKey()))) != id) { diff --git a/src/ripple/protocol/impl/TER.cpp b/src/ripple/protocol/impl/TER.cpp index 833100c1c15..94adc65a6c5 100644 --- a/src/ripple/protocol/impl/TER.cpp +++ b/src/ripple/protocol/impl/TER.cpp @@ -107,6 +107,7 @@ transResults() MAKE_ERROR(tefNOT_MULTI_SIGNING, "Account has no appropriate list of multi-signers."), MAKE_ERROR(tefPAST_SEQ, "This sequence number has already passed."), MAKE_ERROR(tefPAST_IMPORT_SEQ, "This import sequence number has already been used."), + MAKE_ERROR(tefPAST_IMPORT_VL_SEQ, "This import validator list sequence number has already been used."), MAKE_ERROR(tefWRONG_PRIOR, "This previous transaction does not match."), MAKE_ERROR(tefBAD_AUTH_MASTER, "Auth for unclaimed account needs correct master key."), MAKE_ERROR(tefINVARIANT_FAILED, "Fee claim violated invariants for the transaction."), diff --git a/src/test/app/Import_json.h b/src/test/app/Import_json.h index 6f82c89c8c8..e1a28b14e08 100644 --- a/src/test/app/Import_json.h +++ b/src/test/app/Import_json.h @@ -16,6 +16,9 @@ class ImportTCAccountSet static std::string w_regular_key; static std::string w_signers; static std::string w_flags; + static std::string unl_seq_1_1; + static std::string unl_seq_1_2; + static std::string unl_seq_2_1; }; std::string ImportTCAccountSet::min = R"json({ @@ -61,41 +64,41 @@ std::string ImportTCAccountSet::min = R"json({ })json"; std::string ImportTCAccountSet::max = R"json({ "ledger": { - "acroot": "8A1732AB91953D0093AF5CB7447BD8E7C24805DCB01BB23F79258CF167E16249", - "close": 742324483, - "coins": "99999999998999868", + "acroot": "AD9748D06C5CFD7E48271985A7CAAE3CA4E4E8791AAA2CD0D4B72150808A2288", + "close": 748341281, + "coins": "60200999844", "cres": 10, "flags": 0, - "index": 48, - "pclose": 742324482, - "phash": "F0F51F0E524AC82A25D3ECF11A702C51F6906FB37FBFB029F92CB70D4C10BE84", - "txroot": "BFD49B8622E29F4C62282C4618036EC7BBABB6C18E2F454B58AAC673657FEB9D" + "index": 9, + "pclose": 748341280, + "phash": "F5358D18F5708CE828469F97B41225A16240E99B4DB8AA8D0A8CA19A2F8AFAFA", + "txroot": "5C2F5AF70D7F51CC0F8E71A590B7E28A18F352EA9F584B11C1B3E40618388908" }, "transaction": { - "blob": "12000322000000002400000002201B00000042201D000053596840000000000F424073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100D0A0519C1CC56DF9478BC803C67A06B385FAB1414F73CB0385CCA545CB296BE402206B0844DA18F4209A3F6645C267B4B0A0BEBE9C61A93A707EEBA3666F1F71A3078114AE123A8556F3CF91154711376AFB0F894F832B3D", - "meta": "201C00000000F8E51100612500000017558E1B96AFCA6F571DE01430A2AE8167C812377DB92FF476EA9FF9DD10508428AB5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000773593F4E1E7220000000024000000032D000000016240000000772651B48114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "blob": "12000322000000002400000008201B0000001C201D00005359684163456A5947A3C073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C0527446304402202E394BEFDAAFD9D083498121F868BEB851D38882A2EED5729629D8873B9C3027022030A882219CA0D560B5A5D2DB0AB8BDBAB301CDF6BFAD3DE12CCF27AC4199AF0C8114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E5110061250000000855682B5C8046DEF304ABB58D2993002CA283F8C4D68559A451622C39C0936347665692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE62400000008624163456CAD5387C0E1E7220000000024000000092D000000006240000002540BE4008114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", "proof": { "children": { - "7": { + "F": { "children": {}, - "hash": "B965E3A7DD50B0635B90E1CEF7D2892188C210E4FCE44A153DFB7CFDAB1E8B2E", - "key": "7DD23F399E94A202C2E9FFB17B4EDA044804C35811B0A4532847E8144925383E" + "hash": "169BECC99D93BF88318D9C574443ADEAB63FFB01524447DB430E6D55AC734FEF", + "key": "F20AE25653A55CF7287F2FFF2DD528CE27BE2412598C6449F0E5FB112CCCAF7A" } }, - "hash": "BFD49B8622E29F4C62282C4618036EC7BBABB6C18E2F454B58AAC673657FEB9D", + "hash": "5C2F5AF70D7F51CC0F8E71A590B7E28A18F352EA9F584B11C1B3E40618388908", "key": "0000000000000000000000000000000000000000000000000000000000000000" } }, "validation": { "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000030292C3EF907517FC39D3103A3008D15C0DBF0B06176A9DB86EF3B55FF829960CFBE640A67C21D5017531BCBC1BA1DB5459262AA1020FB817C64937C46D83212E1DD86B4E0959907CE732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100AFD1037DC3C4AC538706675F7D9EC209725B4FFAF302501DE3EA0714514608200220791B694E3FA23187A7A69865FC214CB54B66C730DEF5298DF7EFE6F662BE3F85", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000030292C3EF907517FC39D3103A3008D15C0DBF0B06176A9DB86EF3B55FF829960CFBE640A67C21D5017531BCBC1BA1DB5459262AA1020FB817C64937C46D83212E1DD86B4E0959907CE732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C7646304402206724A8EDD93852C91EB37F85E1F414EEFF8FCF0919D97E3DF106FDBDC02B5CCA022059B919DE4D2652C7620F9EA4CBF1D1DAECF3878ABEF51CC31E317DAB87C5B7F7" + "n9KAuffmgrhXW6wzgk5MGiEDWQX9aCQbbzcbcaYcSbXfw9GiQnuu": "22800000012600000009292C9AC8203A178F121D941E3AF851E6154230E8E34801E8D42430EF5E170C2A5FE8E369EB6DDEE55AD4656AF5BF9A501717579F0EB1A197C2C8091EFAC2DF34A4B7A3D9C635660223362E42F7E7B73ADC5019F5358D18F5708CE828469F97B41225A16240E99B4DB8AA8D0A8CA19A2F8AFAFA732102B8D479C82E3F7874B2936F88732F7AA585AE9B6C32A929E4E9ACDB2811C89BC1764630440220224FA1D78C1F5AE5B60C51286BA0C97177A6E8CF1C8643DA9AB286A7A0BD410902207DBADA8AD594808665822D2853B4A0A717B3160C56240CBE1D25834CAAB9BE7F", + "n9LykUwrJY5Mi6dwiN1hkv44f1nabQiJSTqQs51DezbbvZamtNrY": "22800000012600000009292C9AC8203A8DDAD6398D60092351E6154230E8E34801E8D42430EF5E170C2A5FE8E369EB6DDEE55AD4656AF5BF9A501717579F0EB1A197C2C8091EFAC2DF34A4B7A3D9C635660223362E42F7E7B73ADC5019F5358D18F5708CE828469F97B41225A16240E99B4DB8AA8D0A8CA19A2F8AFAFA73210340B7E828023789BF486E4E5163FDC3863FFF5FBF5BC3BFE7565C3B45AB8202F0764630440220431FEAEF95F4EA8D8A07675F4E844C2A5C8500E8161843B0A46CF736809C1A980220510E0ABAF5D35743627C1C8BE14306D482D1103DD8384BB7BF1FE25F41A12E48" }, "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzUwNjgyMzMyLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDMyRjVBNUFGMkI0NEREM0UyMEQwMEMxNzFBMDhBREU4NTk4NDY3QUEzQjlENEMxRjc5M0U4NzZENjE1NDQ0RTMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUweTlhV3ZLMFRkUGlEUURCY2FDSzNvV1lSbnFqdWRUQjk1UG9kdFlWUkU0M01oQXJqVWVjZ3VQM2gwc3BOdmlITXZlcVdGcnB0c01xa3A1T21zMnlnUnlKdkJka2N3UlFJaEFKbWJhOERUcmxqSSt2ZU11NlhNMjY5RGY0Mkk5aStpRlFsMTNZZitRU0JDQWlCZzNLSGFFbC8yNTlYTWJMWGdrY1hvNXR3dnQycTN6WTdWNWZGajZvaGZsWGNMZG0xaGMzUmxjaTVqYjIxd0VrQ09SUU5SdnQwL0JwQkVHSDNsRGhLYnZNaXlvUXJlOG5QODdCei8yMnp6S2ovdG54SE1FSjFzcHdRMm9yL2thTUhubmREZEhJcStoNmlQdEUyRkVqa0MifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMjM5RTE1NzY3MjA4NTA0QTE3QTFBQ0MxOUJCMThGOTE3ODMxRkFCN0IzRjkzOEQ4MjJFNkM5Rjg0RjFDOTU5MSIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTBqbmhWMmNnaFFTaGVock1HYnNZK1JlREg2dDdQNU9OZ2k1c240VHh5VmtYTWhBMEMzNkNnQ040bS9TRzVPVVdQOXc0WS8vMSsvVzhPLzUxWmNPMFdyZ2dMd2RrY3dSUUloQUw5bExaN2Yvc1VxZ09BUkxhRWc1VDRUT096cHJOQy9OakQ2VUc4cXhZRlNBaUJWL1lRenlrcFJVd2R4emtoOHUzNmZ0ZVVuNzJ1a0tGbDFZSzVBQWw3K2tYY0tkbTV2WkdVeExtTnZiWEFTUUU5QWVOVDdHVXFWSVczZTllQlN3M3EyM0FlZHVNbWNpTVp2YmpwbkpFaVA0VlBYNUR1WVlhWXBtSDl5bjAzNXprYWUxT3d3UEZPYzhvUlErSXFzc3dzPSJ9XX0=", "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "signature": "8ADFD72192F1469DD1421F2B5B28132C01364F8F6E223346640ADF35FEF64340E91EFC2A5C77C38560DB07D1B00A10902D5EE082C8C1F4638A288B458C46C30E", "version": 1 } } @@ -194,127 +197,312 @@ std::string ImportTCAccountSet::w_seed = R"json({ } })json"; std::string ImportTCAccountSet::w_regular_key = R"json({ - "ledger": { - "acroot": "9F5FE56CF5184831882F49386A0BC4458D787A28BD7CE8A1643D8F906647ED85", - "close": 743211212, - "coins": "99999998999999772", - "cres": 10, - "flags": 0, - "index": 75, - "pclose": 743211211, - "phash": "A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156", - "txroot": "E5621FC1C69DCC99BF0D2725D1C731CB8E0C4B5E3D384C6AAE8634BDBEAAD81B" - }, - "transaction": { - "blob": "12000322000000002400000037201B0000005D201D0000535968400000003B9ACA00732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE744630440220406E3B5DE38E89BAC8D507447A8EED8F0D908571EBCBA27026C183A1AD29B58F022032F6490A781E049ACC285ED42331D716DAD492E471D8C155722B8747D178F8068114AE123A8556F3CF91154711376AFB0F894F832B3D", - "meta": "201C00000000F8E5110061250000004955C35E5A5CB0017DF35F7E3E71FC7D907C7BC4B1E05C2654C0603E133B809BD2AA5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000376240000000773593D0E1E7220001000024000000382D0000000162400000003B9AC9D08114AE123A8556F3CF91154711376AFB0F894F832B3D8814F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1F1031000", - "proof": { - "children": { - "D": { - "children": {}, - "hash": "8EABDA380543A871B268C8C3F41A7908EED74A938BF0C3A99D0395D07308B045", - "key": "D0B72E074B5AB4D124CEC2AB05088C848F6055E372122B6AF3E2FA427F4EE9F9" - } - }, - "hash": "E5621FC1C69DCC99BF0D2725D1C731CB8E0C4B5E3D384C6AAE8634BDBEAAD81B", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "validation": { - "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "2280000001260000004B292C4C80CF3A457EFD513990BD2751F9E299171A994EECFBC9B7AFE07F966FEB6F7D1BE06380F8763E343C9C62F1D65017C56E9C540B82F73FF5D0EBC6F0BE8F9848C3BA9A62349E590874ACE5F33A811E5019A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576463044022051AC5B74D72B2F41A625D52C80E0F076FB22F7DB141A7ACADB6D39C83F44D0DB0220281CD6B59CBE7E7C89CF1E71F4FD8D513814CB0B4B7A92646D1AF941E92D34CF", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "2280000001260000004B292C4C80CF3AA298DC129A1557B451F9E299171A994EECFBC9B7AFE07F966FEB6F7D1BE06380F8763E343C9C62F1D65017C56E9C540B82F73FF5D0EBC6F0BE8F9848C3BA9A62349E590874ACE5F33A811E5019A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C7646304402200F5B6BEC28796B308E228C29B47840BDB98DE2DDC91B84E943CA0C1073839D74022054BBD3FE127271586424FDA95D7EBD2EDCA5934EED66B6B557424DDAEE7421B4" +"ledger": { + "acroot": "9F5FE56CF5184831882F49386A0BC4458D787A28BD7CE8A1643D8F906647ED85", + "close": 743211212, + "coins": "99999998999999772", + "cres": 10, + "flags": 0, + "index": 75, + "pclose": 743211211, + "phash": "A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156", + "txroot": "E5621FC1C69DCC99BF0D2725D1C731CB8E0C4B5E3D384C6AAE8634BDBEAAD81B" +}, +"transaction": { + "blob": "12000322000000002400000037201B0000005D201D0000535968400000003B9ACA00732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE744630440220406E3B5DE38E89BAC8D507447A8EED8F0D908571EBCBA27026C183A1AD29B58F022032F6490A781E049ACC285ED42331D716DAD492E471D8C155722B8747D178F8068114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E5110061250000004955C35E5A5CB0017DF35F7E3E71FC7D907C7BC4B1E05C2654C0603E133B809BD2AA5692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000376240000000773593D0E1E7220001000024000000382D0000000162400000003B9AC9D08114AE123A8556F3CF91154711376AFB0F894F832B3D8814F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1F1031000", + "proof": { + "children": { + "D": { + "children": {}, + "hash": "8EABDA380543A871B268C8C3F41A7908EED74A938BF0C3A99D0395D07308B045", + "key": "D0B72E074B5AB4D124CEC2AB05088C848F6055E372122B6AF3E2FA427F4EE9F9" + } }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", - "version": 1 - } + "hash": "E5621FC1C69DCC99BF0D2725D1C731CB8E0C4B5E3D384C6AAE8634BDBEAAD81B", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "2280000001260000004B292C4C80CF3A457EFD513990BD2751F9E299171A994EECFBC9B7AFE07F966FEB6F7D1BE06380F8763E343C9C62F1D65017C56E9C540B82F73FF5D0EBC6F0BE8F9848C3BA9A62349E590874ACE5F33A811E5019A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576463044022051AC5B74D72B2F41A625D52C80E0F076FB22F7DB141A7ACADB6D39C83F44D0DB0220281CD6B59CBE7E7C89CF1E71F4FD8D513814CB0B4B7A92646D1AF941E92D34CF", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "2280000001260000004B292C4C80CF3AA298DC129A1557B451F9E299171A994EECFBC9B7AFE07F966FEB6F7D1BE06380F8763E343C9C62F1D65017C56E9C540B82F73FF5D0EBC6F0BE8F9848C3BA9A62349E590874ACE5F33A811E5019A12F6A295D4860B5615A4B44985C53F9CB2B0EED12962C17DA796E6F0A352156732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C7646304402200F5B6BEC28796B308E228C29B47840BDB98DE2DDC91B84E943CA0C1073839D74022054BBD3FE127271586424FDA95D7EBD2EDCA5934EED66B6B557424DDAEE7421B4" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 } +} })json"; std::string ImportTCAccountSet::w_signers = R"json({ - "ledger": { - "acroot": "F2AA543F4F1D53ECE1B6DC8BAE3C97E201F9403E324C41AB377A0F21BF78A987", - "close": 742912362, - "coins": "99999999999999620", - "cres": 10, - "flags": 0, - "index": 2164, - "pclose": 742912361, - "phash": "16592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE", - "txroot": "FD9DB8855998B60A9260BC3134939BC76D1F3EBCA6047A383423C1C8116C95F4" - }, - "transaction": { - "blob": "1200032200000000240000002F201B00000887201D0000535920210000000768400000000000003073008114AE123A8556F3CF91154711376AFB0F894F832B3DF3E0107321028949021029D5CC87E78BCF053AFEC0CAFD15108EC119EAAFEC466F5C095407BF74473045022100EC791DC3306E1784B813CBE275C9A0E2F467EF795E3571AADB295862F2F316350220668716954E02AF714F119F34D869891C8704A7989BDB0DBA029A7580430BB7138114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1E010732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74473045022100B93117804900BE1E83E5E2B58466427BBFE2138CDEF5F31F566B4AC49A947C300220463AFD847028A76F3FEC997B56FA4C4E6514A57E77D38AC854A6A2A54DD4DB478114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1", - "meta": "201C00000000F8E5110061250000087355380CDBA4ECC47E68F2DECAB962960C4E4AC4B3973F4310409F3D3783E80FEEB35692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE6240000002F624000000077359338E1E7220041000024000000302D000000026240000000773593088114AE123A8556F3CF91154711376AFB0F894F832B3D8814F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1F1031000", - "proof": { - "children": { - "3": { - "children": {}, - "hash": "EF4DBEB8B4750FAA4152E6A6C384A57F5E962166C232A1B90C11B92A16839FBE", - "key": "3367512D81C4B43F038C5069D9B1E523AF3B11DE61F8D86D0494DDDF6883F761" - } - }, - "hash": "FD9DB8855998B60A9260BC3134939BC76D1F3EBCA6047A383423C1C8116C95F4", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "validation": { - "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000874292C47F16C3ABE7DBA64DC5CFC77515F6749A3CADB7B114FE48A356057568412C6BFD40C16A549D82EA2042F3E5E6E50170EB661B5DD6F92B03AA8B0099FE23A744D3960147CD9122EF693C7A233BD284B501916592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB328075764730450221008519C2C04F871244472A769DCC1BAB585B267231DB48AF74017B02986A6B3437022043C20B9D8E8E3A540E0C3CE54FF640A88EF1E3A78E497155A5820C71295502AA", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000874292C47F16C3A382B1DAAB123641B515F6749A3CADB7B114FE48A356057568412C6BFD40C16A549D82EA2042F3E5E6E50170EB661B5DD6F92B03AA8B0099FE23A744D3960147CD9122EF693C7A233BD284B501916592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100CC23AF26752BCCE9E7B4F74C17D5FC214DCE779A052865476843E63250BE7BA5022021257326EBB8D9471928ED6C6EFAFA990CE99948E87601DB8DEBE982B9E967BD" +"ledger": { + "acroot": "F2AA543F4F1D53ECE1B6DC8BAE3C97E201F9403E324C41AB377A0F21BF78A987", + "close": 742912362, + "coins": "99999999999999620", + "cres": 10, + "flags": 0, + "index": 2164, + "pclose": 742912361, + "phash": "16592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE", + "txroot": "FD9DB8855998B60A9260BC3134939BC76D1F3EBCA6047A383423C1C8116C95F4" +}, +"transaction": { + "blob": "1200032200000000240000002F201B00000887201D0000535920210000000768400000000000003073008114AE123A8556F3CF91154711376AFB0F894F832B3DF3E0107321028949021029D5CC87E78BCF053AFEC0CAFD15108EC119EAAFEC466F5C095407BF74473045022100EC791DC3306E1784B813CBE275C9A0E2F467EF795E3571AADB295862F2F316350220668716954E02AF714F119F34D869891C8704A7989BDB0DBA029A7580430BB7138114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1E010732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74473045022100B93117804900BE1E83E5E2B58466427BBFE2138CDEF5F31F566B4AC49A947C300220463AFD847028A76F3FEC997B56FA4C4E6514A57E77D38AC854A6A2A54DD4DB478114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1", + "meta": "201C00000000F8E5110061250000087355380CDBA4ECC47E68F2DECAB962960C4E4AC4B3973F4310409F3D3783E80FEEB35692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE6240000002F624000000077359338E1E7220041000024000000302D000000026240000000773593088114AE123A8556F3CF91154711376AFB0F894F832B3D8814F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1F1031000", + "proof": { + "children": { + "3": { + "children": {}, + "hash": "EF4DBEB8B4750FAA4152E6A6C384A57F5E962166C232A1B90C11B92A16839FBE", + "key": "3367512D81C4B43F038C5069D9B1E523AF3B11DE61F8D86D0494DDDF6883F761" + } }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", - "version": 1 - } + "hash": "FD9DB8855998B60A9260BC3134939BC76D1F3EBCA6047A383423C1C8116C95F4", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000874292C47F16C3ABE7DBA64DC5CFC77515F6749A3CADB7B114FE48A356057568412C6BFD40C16A549D82EA2042F3E5E6E50170EB661B5DD6F92B03AA8B0099FE23A744D3960147CD9122EF693C7A233BD284B501916592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB328075764730450221008519C2C04F871244472A769DCC1BAB585B267231DB48AF74017B02986A6B3437022043C20B9D8E8E3A540E0C3CE54FF640A88EF1E3A78E497155A5820C71295502AA", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000874292C47F16C3A382B1DAAB123641B515F6749A3CADB7B114FE48A356057568412C6BFD40C16A549D82EA2042F3E5E6E50170EB661B5DD6F92B03AA8B0099FE23A744D3960147CD9122EF693C7A233BD284B501916592B0D368ED5FD8AAA5EBE829B2640B383E979E4B65CBD23C18E71106E5EEE732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100CC23AF26752BCCE9E7B4F74C17D5FC214DCE779A052865476843E63250BE7BA5022021257326EBB8D9471928ED6C6EFAFA990CE99948E87601DB8DEBE982B9E967BD" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 } +} })json"; std::string ImportTCAccountSet::w_flags = R"json({ - "ledger": { - "acroot": "54096307B907CB442BD9C1DB57EB2171927E157714462BB72B4C2FEBD25BF73A", - "close": 742411861, - "coins": "99999999999999858", - "cres": 10, - "flags": 0, - "index": 520, - "pclose": 742411860, - "phash": "2DB163BC3CF010694113A1BF438D30B7030F017F2C9DAD73D8700DF2569FFCCB", - "txroot": "F94056C8000957829B909511CC3856095D8877FEB844A776473A64B0FE4E4479" +"ledger": { + "acroot": "54096307B907CB442BD9C1DB57EB2171927E157714462BB72B4C2FEBD25BF73A", + "close": 742411861, + "coins": "99999999999999858", + "cres": 10, + "flags": 0, + "index": 520, + "pclose": 742411860, + "phash": "2DB163BC3CF010694113A1BF438D30B7030F017F2C9DAD73D8700DF2569FFCCB", + "txroot": "F94056C8000957829B909511CC3856095D8877FEB844A776473A64B0FE4E4479" +}, +"transaction": { + "blob": "12000322000000002400000002201B0000021A201D0000535920210000000768400000000000000A73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100CEB2BD79AEC20B65F3067A6CA2578902D9914409A4242AF04F711FC44B6C8EBD022068E22D6E4D0AD5AD6F86E5C4F14D64EDF37AF79BA8F205B53A3733AF979231F58114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E5110061250000006A550CEE5E0852148CD189D5BC4D89B8B0291D604D5035BBA3A34F9E15AADD8549315692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE6220000000024000000026240000000773593F4E1E7220040000024000000032D000000016240000000773593EA8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "1": { + "children": {}, + "hash": "06EC8EA6F8B78F8716EEE610F7E73A262E98CB9A8D55C554B86D6ABF570E6BC0", + "key": "1510A0E13D0AABC30FB87E348E0F54B8CAE279691C7E2E6DD044D767EB9C484F" + } + }, + "hash": "F94056C8000957829B909511CC3856095D8877FEB844A776473A64B0FE4E4479", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000208292C404E545164757CF68364EED084951F45BA9D258E2FF0434B39CBEE2C770281F9A354BF13501712EB34F76381F6931333B5EE46F48C96D554BD44003ADF4182172389504A637A732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100E33FAF1A395642B42306C0D8A8C1E839B82CFAD41B27FB784B7661BBAA8E5D1202207B48A71718D8006B49BB78BFF21E33DC1998A1DEBEFC7F422681F28A1B042FD0", + "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000208292C404E545164757CF68364EED084951F45BA9D258E2FF0434B39CBEE2C770281F9A354BF13501712EB34F76381F6931333B5EE46F48C96D554BD44003ADF4182172389504A637A732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100C9FA07C6143C08ED3D6927ACF1F7E8DEDB825612263D63A838FD8ECE44A906D2022017D5E5956C10A4FF13663AF75BFFB060991B04B18848AC75B9256169CB2003A3" }, - "transaction": { - "blob": "12000322000000002400000002201B0000021A201D0000535920210000000768400000000000000A73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100CEB2BD79AEC20B65F3067A6CA2578902D9914409A4242AF04F711FC44B6C8EBD022068E22D6E4D0AD5AD6F86E5C4F14D64EDF37AF79BA8F205B53A3733AF979231F58114AE123A8556F3CF91154711376AFB0F894F832B3D", - "meta": "201C00000000F8E5110061250000006A550CEE5E0852148CD189D5BC4D89B8B0291D604D5035BBA3A34F9E15AADD8549315692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE6220000000024000000026240000000773593F4E1E7220040000024000000032D000000016240000000773593EA8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "1": { - "children": {}, - "hash": "06EC8EA6F8B78F8716EEE610F7E73A262E98CB9A8D55C554B86D6ABF570E6BC0", - "key": "1510A0E13D0AABC30FB87E348E0F54B8CAE279691C7E2E6DD044D767EB9C484F" - } + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", + "version": 1 + } +} +})json"; +std::string ImportTCAccountSet::unl_seq_1_1 = R"json({ +"ledger": { + "acroot": "A0A93026933F344C144231B6AA775A19F37CB1D11D7BC84D79934E0348EF7CF4", + "close": 748090601, + "coins": "99999998999999868", + "cres": 10, + "flags": 0, + "index": 39, + "pclose": 748090600, + "phash": "31E9B17C9A021CA17D2C25BB39436489B86858427F986B355261AEA94AFE70D9", + "txroot": "A0C313C33539B34FC063558A7657BA5E6CD043C36FEB977F9D38E6EA013A0AE2" +}, +"transaction": { + "blob": "12000322000000002400000027201B0000003A201D0000535968400000003B9ACA0073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052744630440220549E3606CA9930EABE933C43B44C3E397F0027B9995F1AC0A15EB3D04688901402201C3DC2009AD93540B49CC69722B810B8ACEEB2CE374813658A68BAFFFDAEBF9D8114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000006F8E51100612500000027551F91A0D482A2289EF7B2119FE133FB153446477B7CEF4727B77F3013B99E57045692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000276240000002540BE400E1E7220000000024000000282D00000000624000000218711A008114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "0": { + "children": {}, + "hash": "DD71A4EFEC9A376EE8C1379B3BAF0748F2E608B894C35BC42569412D6FC35FEF", + "key": "0EDE7D33EAACC294F3FBE3EB4D4890E77B7A0D61A082C18121B56CA3CE59AB62" + }, + "1": { + "children": {}, + "hash": "EFDA983AC8494C33422AF30B5A618B7A7097448A2E4C9E631810A657ABD72A40", + "key": "1F91A0D482A2289EF7B2119FE133FB153446477B7CEF4727B77F3013B99E5704" + }, + "2": { + "children": {}, + "hash": "6B2012F5CE21BE04DBD27BCB99E9673DD42BE1B669BE9C7E73307DE6F852FB1F", + "key": "2AB2EC4899C0F3124B940CE2B7FD32C70E64882ABC6BF7BCBD2B5E31406E7E09" + }, + "3": { + "children": {}, + "hash": "B0C4C9ECBC14B57E6AFC2EE59D8C0BCD04C4C9CC47CCD7F04B7AFF18480084BA", + "key": "3E6E30DD9A328C785301B07257BFF48D6D521E85DF271FF0072E9B674F008884" + }, + "7": { + "children": {}, + "hash": "007D8FDDE0C1180171838E81CE880E7554826DB5B8CF2FE8976F6D95A1B6F270", + "key": "7A9DE9E2B9E5308874B12771FAB0D4D67A8882141ECB1AE1E0F16B27C8641972" + }, + "8": { + "children": {}, + "hash": "DB201934676117F5C08B0D0C34A3856805C3A70D82C76B0B3E98665AD5AD541C", + "key": "83CD8806C5D50E8670A1DE37A7BB641E94C9C81B2D76A8E70D634793138EFCF0" + }, + "A": { + "children": {}, + "hash": "D8C5D0F29FCFA69D26B1818E45B4A9364A00A4472852D6D12712177EBF4DD2C0", + "key": "A65BE5EC475AC7B0D5D79864F5FC3B4D5A3B521A72216D06B3631991D5CC32E1" }, - "hash": "F94056C8000957829B909511CC3856095D8877FEB844A776473A64B0FE4E4479", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } + "B": { + "children": { + "6": { + "children": {}, + "hash": "0FAE751FCFA7E95CA48EF44FD4365A1904CB02364F6A459DD63D16AD91B1A629", + "key": "B649DC71FC705A5F6542709468557EDBF886A86F6AF25E3A4E34A8FF479A9902" + }, + "D": { + "children": {}, + "hash": "2F252CA18FA427B87B353A5666A9171B10BF594A56BE64A8EA03B22AEC3F3604", + "key": "BDF3A2F78193CE8B8114964D28BDDFC7F4251B03E81D8A08927FD474F7A5528A" + } + }, + "hash": "985CDA883A2C5743C4CFBFB9FC2AE33C6AB92D55A5F1F2815132E7C49DB8A70B", + "key": "B000000000000000000000000000000000000000000000000000000000000000" + }, + "C": { + "children": {}, + "hash": "F2DDDF7840F50D231FB07FAE0952353880B6FEFF64E5B1865AC04BB5B75D10CC", + "key": "C10FE2C3701F0D64C03604B0DFDC758BDDC4E76A901E2B997A80A3F34F36B91F" + }, + "D": { + "children": {}, + "hash": "D22F62DDEBA52EA6BF743FFA6D11E47403AC733E21EC9C83289A346D57821639", + "key": "D15E1FC4DF845DCDF1A88B897A99B13E2AE86E66D184A728B77A2EEB7472199C" + }, + "F": { + "children": {}, + "hash": "E1BA8CEEF95389E107605BC990F6D6FDB8E2A105568171D8316D26864F9BC19B", + "key": "FA8DF4434831D22E61B6EABD5C96DB4CE1079A9410C78F44AB4EDD80B88ACF5E" + } + }, + "hash": "A0C313C33539B34FC063558A7657BA5E6CD043C36FEB977F9D38E6EA013A0AE2", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n9KAuffmgrhXW6wzgk5MGiEDWQX9aCQbbzcbcaYcSbXfw9GiQnuu": "22800000012600000027292C96F4E93A448DE0F0A5AA66A85103C4DDA028525AF1B0B86E5474D82522BC28A63543C71C2510AAB84C8FC7EEFB50175EDCC3F35165FFA9B338F19080D034D7D3285101C3C06D1CAAD28C6BF9FB1114501931E9B17C9A021CA17D2C25BB39436489B86858427F986B355261AEA94AFE70D9732102B8D479C82E3F7874B2936F88732F7AA585AE9B6C32A929E4E9ACDB2811C89BC1764730450221009A30BA2CA1CFB38FA0BB4C136361D622B09339AC60A90548A723087047E9978802201D0A0BF10FEA1E697B81F359BF76B371EE00D6CEEC36AC23445967CC3BBB139C", + "n9LykUwrJY5Mi6dwiN1hkv44f1nabQiJSTqQs51DezbbvZamtNrY": "22800000012600000027292C96F4E93AF6B0DCD3E3885EDB5103C4DDA028525AF1B0B86E5474D82522BC28A63543C71C2510AAB84C8FC7EEFB50175EDCC3F35165FFA9B338F19080D034D7D3285101C3C06D1CAAD28C6BF9FB1114501931E9B17C9A021CA17D2C25BB39436489B86858427F986B355261AEA94AFE70D973210340B7E828023789BF486E4E5163FDC3863FFF5FBF5BC3BFE7565C3B45AB8202F076463044022031EF906508DB1DA8C25F848E006B0F64A6CEADBD6A604D505EC0CC55BC18FFAF022037619CEB5B08357812806784FAABCFCA04FD1CEC22A09FBC53CC3E6432F2DB22" }, - "validation": { - "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "22800000012600000208292C404E545164757CF68364EED084951F45BA9D258E2FF0434B39CBEE2C770281F9A354BF13501712EB34F76381F6931333B5EE46F48C96D554BD44003ADF4182172389504A637A732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100E33FAF1A395642B42306C0D8A8C1E839B82CFAD41B27FB784B7661BBAA8E5D1202207B48A71718D8006B49BB78BFF21E33DC1998A1DEBEFC7F422681F28A1B042FD0", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "22800000012600000208292C404E545164757CF68364EED084951F45BA9D258E2FF0434B39CBEE2C770281F9A354BF13501712EB34F76381F6931333B5EE46F48C96D554BD44003ADF4182172389504A637A732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100C9FA07C6143C08ED3D6927ACF1F7E8DEDB825612263D63A838FD8ECE44A906D2022017D5E5956C10A4FF13663AF75BFFB060991B04B18848AC75B9256169CB2003A3" + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzUwNjgyMzMyLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDMyRjVBNUFGMkI0NEREM0UyMEQwMEMxNzFBMDhBREU4NTk4NDY3QUEzQjlENEMxRjc5M0U4NzZENjE1NDQ0RTMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUweTlhV3ZLMFRkUGlEUURCY2FDSzNvV1lSbnFqdWRUQjk1UG9kdFlWUkU0M01oQXJqVWVjZ3VQM2gwc3BOdmlITXZlcVdGcnB0c01xa3A1T21zMnlnUnlKdkJka2N3UlFJaEFKbWJhOERUcmxqSSt2ZU11NlhNMjY5RGY0Mkk5aStpRlFsMTNZZitRU0JDQWlCZzNLSGFFbC8yNTlYTWJMWGdrY1hvNXR3dnQycTN6WTdWNWZGajZvaGZsWGNMZG0xaGMzUmxjaTVqYjIxd0VrQ09SUU5SdnQwL0JwQkVHSDNsRGhLYnZNaXlvUXJlOG5QODdCei8yMnp6S2ovdG54SE1FSjFzcHdRMm9yL2thTUhubmREZEhJcStoNmlQdEUyRkVqa0MifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMjM5RTE1NzY3MjA4NTA0QTE3QTFBQ0MxOUJCMThGOTE3ODMxRkFCN0IzRjkzOEQ4MjJFNkM5Rjg0RjFDOTU5MSIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTBqbmhWMmNnaFFTaGVock1HYnNZK1JlREg2dDdQNU9OZ2k1c240VHh5VmtYTWhBMEMzNkNnQ040bS9TRzVPVVdQOXc0WS8vMSsvVzhPLzUxWmNPMFdyZ2dMd2RrY3dSUUloQUw5bExaN2Yvc1VxZ09BUkxhRWc1VDRUT096cHJOQy9OakQ2VUc4cXhZRlNBaUJWL1lRenlrcFJVd2R4emtoOHUzNmZ0ZVVuNzJ1a0tGbDFZSzVBQWw3K2tYY0tkbTV2WkdVeExtTnZiWEFTUUU5QWVOVDdHVXFWSVczZTllQlN3M3EyM0FlZHVNbWNpTVp2YmpwbkpFaVA0VlBYNUR1WVlhWXBtSDl5bjAzNXprYWUxT3d3UEZPYzhvUlErSXFzc3dzPSJ9XX0=", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "8ADFD72192F1469DD1421F2B5B28132C01364F8F6E223346640ADF35FEF64340E91EFC2A5C77C38560DB07D1B00A10902D5EE082C8C1F4638A288B458C46C30E", + "version": 1 + } +} +})json"; +std::string ImportTCAccountSet::unl_seq_1_2 = R"json({ +"ledger": { + "acroot": "BCD3709EE7C290CE7766CB0C13E7CEDDE97B9C4452DF995ED22D6B86B85C5F98", + "close": 748090611, + "coins": "99999997999999868", + "cres": 10, + "flags": 0, + "index": 42, + "pclose": 748090610, + "phash": "B453A127FB51BD095C6D82F8F70B6A0529A2A54131C84780CBAB9027F6C5CAED", + "txroot": "49037FBAAC72A18D07EE3A3A78A06AF41999C6307D65BB1F678D181A1DCA3798" +}, +"transaction": { + "blob": "12000322000000002400000028201B0000003C201D0000535968400000003B9ACA0073210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C0527446304402205666442F31EE8C27999D41469118805CFA870BC2A158F37EF1057D849351D86D022000DEB9D2B58EBA34F0E80616EFAF9763A07BA31A54FBB07D4F6A0C43659FF33C8114AE123A8556F3CF91154711376AFB0F894F832B3D", + "meta": "201C00000000F8E5110061250000002755A65BE5EC475AC7B0D5D79864F5FC3B4D5A3B521A72216D06B3631991D5CC32E15692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE62400000028624000000218711A00E1E7220000000024000000292D000000006240000001DCD650008114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", + "proof": { + "children": { + "A": { + "children": {}, + "hash": "76F50CC9A3980F0FD3D6AFD14291ACBC9662BD0A9E958C5602BB7BCDEC9075D4", + "key": "A3EC22851F6C02D444F76051F7260DD1DDF112C1814705AE9F9A7CA944B22CC2" + } + }, + "hash": "49037FBAAC72A18D07EE3A3A78A06AF41999C6307D65BB1F678D181A1DCA3798", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n9KAuffmgrhXW6wzgk5MGiEDWQX9aCQbbzcbcaYcSbXfw9GiQnuu": "2280000001260000002A292C96F4F23A448DE0F0A5AA66A8516C5E32D7E5330A09D33DB875661C15844742B4B390F7D12982C3D837C6B41FC350178F3EDF006D37891D476B966A23B7E1B0A10F5C399C2D4C6CD4BA1BC1AED80CB45019B453A127FB51BD095C6D82F8F70B6A0529A2A54131C84780CBAB9027F6C5CAED732102B8D479C82E3F7874B2936F88732F7AA585AE9B6C32A929E4E9ACDB2811C89BC176463044022055B6A70C121CF9B59500A67092E564D56DD0251336CDC90ED08E5E32A1A4FC9B022047F2CCA17AD2F7B2A397DAB4A7560A88D033AF335419F5833C3A5622A1B8E3F9", + "n9LykUwrJY5Mi6dwiN1hkv44f1nabQiJSTqQs51DezbbvZamtNrY": "2280000001260000002A292C96F4F23AF6B0DCD3E3885EDB516C5E32D7E5330A09D33DB875661C15844742B4B390F7D12982C3D837C6B41FC350178F3EDF006D37891D476B966A23B7E1B0A10F5C399C2D4C6CD4BA1BC1AED80CB45019B453A127FB51BD095C6D82F8F70B6A0529A2A54131C84780CBAB9027F6C5CAED73210340B7E828023789BF486E4E5163FDC3863FFF5FBF5BC3BFE7565C3B45AB8202F076473045022100E4378C656BB0BEBAD8FF947CA2E98C02091B1CF36663FB2C012CF0B997C99CB202205D483DB60925562884914CA9208C0F4C511D4242D7D1B0E01292E0B1B25705A9" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzUwNjgyMzMyLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDMyRjVBNUFGMkI0NEREM0UyMEQwMEMxNzFBMDhBREU4NTk4NDY3QUEzQjlENEMxRjc5M0U4NzZENjE1NDQ0RTMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUweTlhV3ZLMFRkUGlEUURCY2FDSzNvV1lSbnFqdWRUQjk1UG9kdFlWUkU0M01oQXJqVWVjZ3VQM2gwc3BOdmlITXZlcVdGcnB0c01xa3A1T21zMnlnUnlKdkJka2N3UlFJaEFKbWJhOERUcmxqSSt2ZU11NlhNMjY5RGY0Mkk5aStpRlFsMTNZZitRU0JDQWlCZzNLSGFFbC8yNTlYTWJMWGdrY1hvNXR3dnQycTN6WTdWNWZGajZvaGZsWGNMZG0xaGMzUmxjaTVqYjIxd0VrQ09SUU5SdnQwL0JwQkVHSDNsRGhLYnZNaXlvUXJlOG5QODdCei8yMnp6S2ovdG54SE1FSjFzcHdRMm9yL2thTUhubmREZEhJcStoNmlQdEUyRkVqa0MifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMjM5RTE1NzY3MjA4NTA0QTE3QTFBQ0MxOUJCMThGOTE3ODMxRkFCN0IzRjkzOEQ4MjJFNkM5Rjg0RjFDOTU5MSIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTBqbmhWMmNnaFFTaGVock1HYnNZK1JlREg2dDdQNU9OZ2k1c240VHh5VmtYTWhBMEMzNkNnQ040bS9TRzVPVVdQOXc0WS8vMSsvVzhPLzUxWmNPMFdyZ2dMd2RrY3dSUUloQUw5bExaN2Yvc1VxZ09BUkxhRWc1VDRUT096cHJOQy9OakQ2VUc4cXhZRlNBaUJWL1lRenlrcFJVd2R4emtoOHUzNmZ0ZVVuNzJ1a0tGbDFZSzVBQWw3K2tYY0tkbTV2WkdVeExtTnZiWEFTUUU5QWVOVDdHVXFWSVczZTllQlN3M3EyM0FlZHVNbWNpTVp2YmpwbkpFaVA0VlBYNUR1WVlhWXBtSDl5bjAzNXprYWUxT3d3UEZPYzhvUlErSXFzc3dzPSJ9XX0=", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "8ADFD72192F1469DD1421F2B5B28132C01364F8F6E223346640ADF35FEF64340E91EFC2A5C77C38560DB07D1B00A10902D5EE082C8C1F4638A288B458C46C30E", + "version": 1 + } +} +})json"; +std::string ImportTCAccountSet::unl_seq_2_1 = R"json({ +"ledger": { + "acroot": "50ED9A8EE14A78437A063A529D6DFBB821B39A75D429967DE5A38EAEE09759F1", + "close": 748091081, + "coins": "99999994999999748", + "cres": 10, + "flags": 0, + "index": 196, + "pclose": 748091080, + "phash": "05DD2EBB70CFA934EC62BB4BD8EBFB81D47F08A8E2BED9BAE1F93423B3B860C0", + "txroot": "BDFA5F6B1EB07B0703B7F9C7A72588ACD833D9BCC5BB5256DE586CB432BE04BF" +}, +"transaction": { + "blob": "1200032200000000240000002A201B000000D6201D0000535968400000003B9ACA00732102691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74473045022100BBD304C90AC8DAD796EE0610C7086A6D4B63005588F720C38871DA0E691F34B10220277E0321B2561AB4C46D5848168F1CAA5502FDE1863DCA6187B1AC677F75EFBE8114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90F", + "meta": "201C00000000F8E511006125000000AF554AD9B4088DCFB84945C533BF12417250AE80CBB5E66BD5C243D841EDCDF14C6656DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BFE6240000002A6240000001DCD64FF4E1E72200000000240000002B2D000000016240000001A13B85F48114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1E1F1031000", + "proof": { + "children": { + "5": { + "children": {}, + "hash": "DF96863DA9AB538977274EAB8158CA9D00F7EDD98FC9C796838B6AFE0D2A7200", + "key": "5BEB629CDFE90FA55DA9F49DD5DF584948D483E1BB764D3BD1FD46B2F7450111" + } }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", - "version": 1 - } + "hash": "BDFA5F6B1EB07B0703B7F9C7A72588ACD833D9BCC5BB5256DE586CB432BE04BF", + "key": "0000000000000000000000000000000000000000000000000000000000000000" + } +}, +"validation": { + "data": { + "n9KAuffmgrhXW6wzgk5MGiEDWQX9aCQbbzcbcaYcSbXfw9GiQnuu": "228000000126000000C4292C96F6CA3A448DE0F0A5AA66A85118B66D6772C3922B651CD36AA36D4E88986F989769AA54CCEB271C0687772D6D5017D8931C031B0F8C03DDECE5F70DB34841D79A32878FD3B1AEC1013FED9FFAA31D501905DD2EBB70CFA934EC62BB4BD8EBFB81D47F08A8E2BED9BAE1F93423B3B860C0732102B8D479C82E3F7874B2936F88732F7AA585AE9B6C32A929E4E9ACDB2811C89BC1764630440220746D8BBDDB613F4A8FA6E0D6CF4B10552A3A1B377D12B5244589CBF2FE33AE8602201365CB82BCA18ACBB269E14BD17FC3262E0DA4061CD900F95EE4E5F684F91752", + "n9L9E6preWE3VS28ohd3eBUHKMnDEZJsN3EH58pvHm3CSVD1FsFT": "228000000126000000C4292C96F6CA3ACB59B778FE0940465118B66D6772C3922B651CD36AA36D4E88986F989769AA54CCEB271C0687772D6D5017D8931C031B0F8C03DDECE5F70DB34841D79A32878FD3B1AEC1013FED9FFAA31D501905DD2EBB70CFA934EC62BB4BD8EBFB81D47F08A8E2BED9BAE1F93423B3B860C0732102D29CD8E12FBC327C018E74E35C25E501DEEAC8423128A841D85289F67CBBFDB276473045022100CB26CE92EF99A82584A8D24B7372C97776596F7CA6C6073648F86C88076D6AE602201B4100534D0BD7CA0C5F8BD3C48F802DB7C61BFA0531EA5DB090EDF398930FEE", + "n9LykUwrJY5Mi6dwiN1hkv44f1nabQiJSTqQs51DezbbvZamtNrY": "228000000126000000C4292C96F6CA3AF6B0DCD3E3885EDB5118B66D6772C3922B651CD36AA36D4E88986F989769AA54CCEB271C0687772D6D5017D8931C031B0F8C03DDECE5F70DB34841D79A32878FD3B1AEC1013FED9FFAA31D501905DD2EBB70CFA934EC62BB4BD8EBFB81D47F08A8E2BED9BAE1F93423B3B860C073210340B7E828023789BF486E4E5163FDC3863FFF5FBF5BC3BFE7565C3B45AB8202F0764630440220707A59776B5286C454C13D807CD11B71ACD8737DF522E1E933EADB3327072CC202203CC76118169E2E7E3DA4014A2C48D3558E982FD51CE3A13D96E675C29F2A0D89" + }, + "unl": { + "blob": "eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzUwNjgyNDEyLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDMyRjVBNUFGMkI0NEREM0UyMEQwMEMxNzFBMDhBREU4NTk4NDY3QUEzQjlENEMxRjc5M0U4NzZENjE1NDQ0RTMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUweTlhV3ZLMFRkUGlEUURCY2FDSzNvV1lSbnFqdWRUQjk1UG9kdFlWUkU0M01oQXJqVWVjZ3VQM2gwc3BOdmlITXZlcVdGcnB0c01xa3A1T21zMnlnUnlKdkJka2N3UlFJaEFKbWJhOERUcmxqSSt2ZU11NlhNMjY5RGY0Mkk5aStpRlFsMTNZZitRU0JDQWlCZzNLSGFFbC8yNTlYTWJMWGdrY1hvNXR3dnQycTN6WTdWNWZGajZvaGZsWGNMZG0xaGMzUmxjaTVqYjIxd0VrQ09SUU5SdnQwL0JwQkVHSDNsRGhLYnZNaXlvUXJlOG5QODdCei8yMnp6S2ovdG54SE1FSjFzcHdRMm9yL2thTUhubmREZEhJcStoNmlQdEUyRkVqa0MifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMjM5RTE1NzY3MjA4NTA0QTE3QTFBQ0MxOUJCMThGOTE3ODMxRkFCN0IzRjkzOEQ4MjJFNkM5Rjg0RjFDOTU5MSIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTBqbmhWMmNnaFFTaGVock1HYnNZK1JlREg2dDdQNU9OZ2k1c240VHh5VmtYTWhBMEMzNkNnQ040bS9TRzVPVVdQOXc0WS8vMSsvVzhPLzUxWmNPMFdyZ2dMd2RrY3dSUUloQUw5bExaN2Yvc1VxZ09BUkxhRWc1VDRUT096cHJOQy9OakQ2VUc4cXhZRlNBaUJWL1lRenlrcFJVd2R4emtoOHUzNmZ0ZVVuNzJ1a0tGbDFZSzVBQWw3K2tYY0tkbTV2WkdVeExtTnZiWEFTUUU5QWVOVDdHVXFWSVczZTllQlN3M3EyM0FlZHVNbWNpTVp2YmpwbkpFaVA0VlBYNUR1WVlhWXBtSDl5bjAzNXprYWUxT3d3UEZPYzhvUlErSXFzc3dzPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRUQxMzU3MDVBMzlCMUI2MzdBRDA1RDdGMzBCNTZGQzM3QTNBQjM1OUQ5QjY2QUEwQzU1NEIzNkE1RDVEMTM0MTk5IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMFRWd1dqbXh0amV0QmRmekMxYjhONk9yTloyYlpxb01WVXMycGRYUk5CbVhNaEF0S2MyT0V2dkRKOEFZNTA0MXdsNVFIZTZzaENNU2lvUWRoU2lmWjh1LzJ5ZGtjd1JRSWhBSmxlRjhYVU53MTBOaUYvSHJDbHNYSEM5MFFDRVFXbXJNRFF2cHNyM3VZUEFpQlJmYThVc2pGRWF6T05OSVNzQlNISVVmTWI2T014Qk1GVU4yY2dWUENkT0hjS2RtNXZaR1V5TG1OdmJYQVNRUHpWZSt6Q29uSlUyOHdyVG1WQzNObkJVR0hoNldyaHc2Vmh3bFhocmExVUJUeGNDSEZHbUFwSnFrK09KM3VXWitQdkZDT25JUk5QWUEzOGJybzMxUVE9In1dfQ==", + "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", + "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", + "signature": "46B2C2C1E8B1FB7279AB279531A34FC83CABF4AFA7F5D78937482B2AE4444CE2560C5C26B826A0A8684D0321609506A34550B276CDBA25EC1454E2874DA5C301", + "version": 2 } +} })json"; class ImportTCSetRegularKey @@ -1019,142 +1207,6 @@ std::string ImportTCSignersListSet::w_signers_empty = R"json({ } })json"; -class ImportTCNFTokenMint -{ -public: - static std::string w_seed; -}; - -std::string ImportTCNFTokenMint::w_seed = R"json({ -"ledger": { - "acroot": "64F75A08037D9F8ED8A103893401EB2AD726E7D6AAC3EAA249005916A9354892", - "close": 743008501, - "coins": "99999999999999796", - "cres": 10, - "flags": 0, - "index": 195, - "pclose": 743008500, - "phash": "B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218", - "txroot": "F2B4345EB99B8C1218CD4091F5BDF94C1B0F4C5A50E5E6172E5019EE313D9125" -}, -"transaction": { - "blob": "12000C22000000002400000068201B000000D5201D0000535920230000000268400000000000000C73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100C787E22884326C0F81FE36E035299E39A8194AEFCD83E73BEB9371090E84BF9F02206562F878EFF31A2FB7B9F7D2F1B13684E23711D5B5A508170BE1633E0D9C627B8114AE123A8556F3CF91154711376AFB0F894F832B3DF4EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1F1", - "meta": "201C00000001F8E511005356472CD116F1449F280243169C442271168E368750479CC7B20816170EDBDCA4E6E72200010000202300000002202600000000340000000000000000F4EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1E1E1E511006125000000C355A036961DA426E4A237501E1D427C9F58B10CF42C8C146689D99740C9853DE3525692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000686240000000773593E8E1E7220000000024000000692D000000026240000000773593DC8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "4": { - "children": {}, - "hash": "4310DC16BC173D082F080E0950925BB15CAFBFF9476A62182061A67C4D0B58CF", - "key": "49DBC308ADFDD3619973BCF1E20E41DF01DDC69E358FC1D07CAB69E84C894B3C" - }, - "7": { - "children": {}, - "hash": "921340E41762F6EBB8A098CC7F15675F0C8159C419DB7BAC9AD8A1C7098B6B3B", - "key": "75B8B03161693AA5C0B2FAE2E64E6856B5F8940DF965AD51BAB5482644C7E54C" - }, - "8": { - "children": {}, - "hash": "508263DAED69066B90D3DE121BE94E4A381FB700CEBADF8BC02250AC88BEDF34", - "key": "84F10F14731F8649BBF6E5140D9A76381F568005FFDCE6BC11C1D809A41E96B5" - }, - "A": { - "children": {}, - "hash": "02E0D3F0576023B4A8BD57B7A1EFA52D5AD9337C03CB0272895F1A46672ECBAA", - "key": "A036961DA426E4A237501E1D427C9F58B10CF42C8C146689D99740C9853DE352" - }, - "C": { - "children": {}, - "hash": "D74027FE966C0F7FB374490FA31C7B1463E5F8FDAFF54DA69B97D7BC7275AE68", - "key": "C5D825ED84DBEA08F60B7438154C1DBBD3A9F14D2249ED1D67C948C7F1C8A52E" - } - }, - "hash": "F2B4345EB99B8C1218CD4091F5BDF94C1B0F4C5A50E5E6172E5019EE313D9125", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } -}, -"validation": { - "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "228000000126000000C3292C4968F73ACC053D3EFDA612F05119F8DA1F4282FFDE304D8265974621294B926F3DB7F821B73980D650E8CCE4EE50179C81CF2B19F221E9BBCB760060D5989A48EBEAFEAE4FF8497B0BD166105E37EA5019B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100A9FA228C72DACCEE57928112E1E8479497E63CA8E136551A124F94B11AA7DD9D022021957642FBB333FF2BE63E13942DDB839736514CA5D27ACECB2AC48BB76D80E6", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "228000000126000000C3292C4968F73AB3E046630EFCB1DF5119F8DA1F4282FFDE304D8265974621294B926F3DB7F821B73980D650E8CCE4EE50179C81CF2B19F221E9BBCB760060D5989A48EBEAFEAE4FF8497B0BD166105E37EA5019B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100EE745538E9E3E3CEAAF04059C646937AD1D0373D1AE0F07A5F54688DF650311C0220443FE25440C4DE068DA196FAB879E6B55C8F4ED527500A005DEFF16667732956" - }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", - "version": 1 - } -} -})json"; - -class ImportTCPayment -{ -public: - static std::string w_seed; -}; - -std::string ImportTCPayment::w_seed = R"json({ -"ledger": { - "acroot": "64F75A08037D9F8ED8A103893401EB2AD726E7D6AAC3EAA249005916A9354892", - "close": 743008501, - "coins": "99999999999999796", - "cres": 10, - "flags": 0, - "index": 195, - "pclose": 743008500, - "phash": "B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218", - "txroot": "F2B4345EB99B8C1218CD4091F5BDF94C1B0F4C5A50E5E6172E5019EE313D9125" -}, -"transaction": { - "blob": "12000C22000000002400000068201B000000D5201D0000535920230000000268400000000000000C73210388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C05274473045022100C787E22884326C0F81FE36E035299E39A8194AEFCD83E73BEB9371090E84BF9F02206562F878EFF31A2FB7B9F7D2F1B13684E23711D5B5A508170BE1633E0D9C627B8114AE123A8556F3CF91154711376AFB0F894F832B3DF4EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1F1", - "meta": "201C00000001F8E511005356472CD116F1449F280243169C442271168E368750479CC7B20816170EDBDCA4E6E72200010000202300000002202600000000340000000000000000F4EB1300018114B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96E1EB1300018114F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1E1E1E511006125000000C355A036961DA426E4A237501E1D427C9F58B10CF42C8C146689D99740C9853DE3525692FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000686240000000773593E8E1E7220000000024000000692D000000026240000000773593DC8114AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1031000", - "proof": { - "children": { - "4": { - "children": {}, - "hash": "4310DC16BC173D082F080E0950925BB15CAFBFF9476A62182061A67C4D0B58CF", - "key": "49DBC308ADFDD3619973BCF1E20E41DF01DDC69E358FC1D07CAB69E84C894B3C" - }, - "7": { - "children": {}, - "hash": "921340E41762F6EBB8A098CC7F15675F0C8159C419DB7BAC9AD8A1C7098B6B3B", - "key": "75B8B03161693AA5C0B2FAE2E64E6856B5F8940DF965AD51BAB5482644C7E54C" - }, - "8": { - "children": {}, - "hash": "508263DAED69066B90D3DE121BE94E4A381FB700CEBADF8BC02250AC88BEDF34", - "key": "84F10F14731F8649BBF6E5140D9A76381F568005FFDCE6BC11C1D809A41E96B5" - }, - "A": { - "children": {}, - "hash": "02E0D3F0576023B4A8BD57B7A1EFA52D5AD9337C03CB0272895F1A46672ECBAA", - "key": "A036961DA426E4A237501E1D427C9F58B10CF42C8C146689D99740C9853DE352" - }, - "C": { - "children": {}, - "hash": "D74027FE966C0F7FB374490FA31C7B1463E5F8FDAFF54DA69B97D7BC7275AE68", - "key": "C5D825ED84DBEA08F60B7438154C1DBBD3A9F14D2249ED1D67C948C7F1C8A52E" - } - }, - "hash": "F2B4345EB99B8C1218CD4091F5BDF94C1B0F4C5A50E5E6172E5019EE313D9125", - "key": "0000000000000000000000000000000000000000000000000000000000000000" - } -}, -"validation": { - "data": { - "n94QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr": "228000000126000000C3292C4968F73ACC053D3EFDA612F05119F8DA1F4282FFDE304D8265974621294B926F3DB7F821B73980D650E8CCE4EE50179C81CF2B19F221E9BBCB760060D5989A48EBEAFEAE4FF8497B0BD166105E37EA5019B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C37BB32807576473045022100A9FA228C72DACCEE57928112E1E8479497E63CA8E136551A124F94B11AA7DD9D022021957642FBB333FF2BE63E13942DDB839736514CA5D27ACECB2AC48BB76D80E6", - "n9KqAeJTJEJaMZNN35SNrPDbs324rwjDPy6BFHjZ4oM4en4snKjf": "228000000126000000C3292C4968F73AB3E046630EFCB1DF5119F8DA1F4282FFDE304D8265974621294B926F3DB7F821B73980D650E8CCE4EE50179C81CF2B19F221E9BBCB760060D5989A48EBEAFEAE4FF8497B0BD166105E37EA5019B1F162531D442E9D8F0F2EF3EA84261A9B636FFBCCF0D592C8E2808D4F9DC218732102AB4E3B7C53A4265C51952DD9D2CD2829219CDD4F55F63969E38C5C910F3C5F1C76473045022100EE745538E9E3E3CEAAF04059C646937AD1D0373D1AE0F07A5F54688DF650311C0220443FE25440C4DE068DA196FAB879E6B55C8F4ED527500A005DEFF16667732956" - }, - "unl": { - "blob": "eyJzZXF1ZW5jZSI6MSwiZXhwaXJhdGlvbiI6NzY3Nzg0NjQ1LCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDExREMwN0E2REEzRDA3QzAxMkUxOUZGOUFDNjdBQ0U1MzlBMjk1MTQ1QzhEQTM5NjQzN0NBQ0FFQzM2NzA5RjYiLCJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwUjNBZW0yajBId0JMaG4vbXNaNnpsT2FLVkZGeU5vNVpEZkt5dXcyY0o5bk1oQXF0T08zeFRwQ1pjVVpVdDJkTE5LQ2tobk4xUFZmWTVhZU9NWEpFUFBGOGNka2N3UlFJaEFOYlBEZlZLUzdwSWFqejlOMlFNNEY4Q3hhd1dJcmF0c3QyQjd3ZWR5czFGQWlCR0s3L1YwRDRBMlp2VFJEQlVQb0JLUVhpQk83QUV3ckRiOFlvN2RUSTJTWEFTUU9lQTIrVGdGVlRwNzdlN3VFZGpYNU1BYk8yU0t2dk8zOW1POEFyQkNqemRPUElxVmIrWi9QMDJUTmYzNjUrYjVCOGc3V0xEY0x2VkNpZUxjemw4MHcwPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURBMTY0RjRCMzZDMkQ3MzA0NjJENUY3NjJCRkEyODA4QUE1MDkyQUJDRUNFQkIyNzA4OTUyNUQxRDA1NEJFMzNCIiwibWFuaWZlc3QiOiJKQUFBQUFGeEllMmhaUFN6YkMxekJHTFY5Mksvb29DS3BRa3F2T3pyc25DSlVsMGRCVXZqTzNNaEEveXBSNmZ3aXhSa1Y3NzVXdkRQZkRxL0RRbk5IY0FnbWZjWVhEZTdNb0IxZGtjd1JRSWhBTjRldTFvSGV0bFVDUmZmZ2FaeTkvTWJrQ0prWlFZdlJoMFVJZWFCaVZodkFpQWhGWXZKTXBPeVFpNGxFdzdzM0pTVTBMRm5FckRWVlRnK3NYUVk0c3Zta25BU1FCSGswakIweG1yL1UwbnkyajNrRmVvdEJUVEExVzdXcHBKbXFvYmR4SXkyR0w0QXBRaEpPcm5aRy93bXZqeFJCNXV4Y05FNUdUR1NZekQ3azhhVEx3bz0ifV19", - "manifest": "JAAAAAFxIe101ANsZZGkvfnFTO+jm5lqXc5fhtEf2hh0SBzp1aHNwXMh7TN9+b62cZqTngaFYU5tbGpYHC8oYuI3G3vwj9OW2Z9gdkAnUjfY5zOEkhq31tU4338jcyUpVA5/VTsANFce7unDo+JeVoEhfuOb/Y8WA3Diu9XzuOD4U/ikfgf9SZOlOGcBcBJAw44PLjH+HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+IILJIiIKU/+1Uxx0FRpQbMDA==", - "public_key": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1", - "signature": "77809A0938EA47F3A03BA0B71DD2C6879416F06574F6B5DC0041C9D806D3D5971282EF99D9EF911F8F37B56DA7016679744EF042C7A98ED425EFFFC6CC8AEA05", - "version": 1 - } -} -})json"; - class ImportTCHalving { public: diff --git a/src/test/app/Import_test.cpp b/src/test/app/Import_test.cpp index 934e5098b28..22506cae322 100644 --- a/src/test/app/Import_test.cpp +++ b/src/test/app/Import_test.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 XRPLF + Copyright (c) 2023 XRPL Labs Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -17,9 +17,10 @@ */ //============================================================================== - -#include #include +#include +#include +#include #include #include #include @@ -27,9 +28,8 @@ #include #include #include -#include #include -#include +#include #define BEAST_REQUIRE(x) \ { \ @@ -44,13 +44,30 @@ namespace test { class Import_test : public beast::unit_test::suite { + std::vector const keys = { + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1"}; + std::unique_ptr makeNetworkConfig(uint32_t networkID) { using namespace jtx; - std::vector const keys = { - "ED74D4036C6591A4BDF9C54CEFA39B996A" - "5DCE5F86D11FDA1874481CE9D5A1CDC1"}; + return envconfig([&](std::unique_ptr cfg) { + cfg->NETWORK_ID = networkID; + Section config; + config.append( + {"reference_fee = 10", + "account_reserve = 1000000", + "owner_reserve = 200000"}); + auto setup = setup_FeeVote(config); + cfg->FEES = setup; + return cfg; + }); + } + + std::unique_ptr + makeNetworkVLConfig(uint32_t networkID, std::vector keys) + { + using namespace jtx; return envconfig([&](std::unique_ptr cfg) { cfg->NETWORK_ID = networkID; Section config; @@ -81,19 +98,16 @@ class Import_test : public beast::unit_test::suite } std::unique_ptr - makeMaxFeeConfig(uint32_t networkID) + makeMaxFeeConfig(uint32_t networkID, std::vector keys) { using namespace jtx; - std::vector const keys = { - "ED74D4036C6591A4BDF9C54CEFA39B996A" - "5DCE5F86D11FDA1874481CE9D5A1CDC1"}; return envconfig([&](std::unique_ptr cfg) { cfg->NETWORK_ID = networkID; Section config; config.append( {"reference_fee = 50", - "account_reserve = 1000000", - "owner_reserve = 200000"}); + "account_reserve = 10000000", + "owner_reserve = 2000000"}); auto setup = setup_FeeVote(config); cfg->FEES = setup; @@ -135,6 +149,13 @@ class Import_test : public beast::unit_test::suite return {k.key, view.read(k)}; } + static std::pair> + feesKeyAndSle(ReadView const& view) + { + auto const k = keylet::fees(); + return {k.key, view.read(k)}; + } + static std::pair> signersKeyAndSle(ReadView const& view, jtx::Account const& account) { @@ -155,7 +176,8 @@ class Import_test : public beast::unit_test::suite // If the string is empty, return an empty Json::Value if (content.empty()) { - std::cout << "JSON string was empty" << "\n"; + std::cout << "JSON string was empty" + << "\n"; return {}; } @@ -165,6 +187,37 @@ class Import_test : public beast::unit_test::suite return jsonValue; } + static std::uint32_t + importVLSequence(jtx::Env const& env, PublicKey const& pk) + { + auto const sle = env.le(keylet::import_vlseq(pk)); + if (sle->isFieldPresent(sfImportSequence)) + return (*sle)[sfImportSequence]; + return 0; + } + + STTx + createUNLReportTx( + LedgerIndex seq, + PublicKey const& importKey, + PublicKey const& valKey) + { + auto fill = [&](auto& obj) { + obj.setFieldU32(sfLedgerSequence, seq); + obj.set(([&]() { + auto inner = std::make_unique(sfActiveValidator); + inner->setFieldVL(sfPublicKey, valKey); + return inner; + })()); + obj.set(([&]() { + auto inner = std::make_unique(sfImportVLKey); + inner->setFieldVL(sfPublicKey, importKey); + return inner; + })()); + }; + return STTx(ttUNL_REPORT, fill); + } + void testComputeStartingBalance(FeatureBitset features) { @@ -173,8 +226,8 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + // old fee XRPAmount const value = Import::computeStartingBonus(*env.current()); BEAST_EXPECT(value == drops(2000000)); @@ -243,7 +296,7 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const alice = Account("alice"); env.fund(XRP(1000), alice); @@ -349,7 +402,7 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // blob empty { @@ -1452,7 +1505,7 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; std::string strJson = R"json({ "ledger": { @@ -1540,14 +1593,15 @@ class Import_test : public beast::unit_test::suite testcase("enabled"); using namespace jtx; using namespace std::literals::chrono_literals; - for (bool const withImport : {false, true}) { // If the Import amendment is not enabled, you should not be able // to import. auto const amend = withImport ? features : features - featureImport; - Env env{*this, makeNetworkConfig(21337), amend}; + Env env{*this, makeNetworkVLConfig(21337, keys), amend}; + + auto const feeDrops = env.current()->fees().base; // setup env auto const alice = Account("alice"); @@ -1561,12 +1615,12 @@ class Import_test : public beast::unit_test::suite auto const txResult = withImport ? ter(tesSUCCESS) : ter(temDISABLED); - auto const ownerDir = withImport ? 1 : 0; // IMPORT - Account Set - env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), txResult); + env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + fee(feeDrops * 10), + txResult); env.close(); - } } @@ -1578,7 +1632,7 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // burn 1000 xrp auto const master = Account("masterpassphrase"); @@ -1594,12 +1648,17 @@ class Import_test : public beast::unit_test::suite //---------------------------------------------------------------------- // preflight - // temDISABLED - disabled - CHECKED IN ENABLED - // return ret; - preflight1 no success + // temDISABLED - disabled + // !ctx.rules.enabled(featureImport) + + // temDISABLED - disabled + // r!ctx.rules.enabled(featureHooksUpdate1) && + // ctx.tx.isFieldPresent(sfIssuer) // telINSUF_FEE_P - sfFee cannot be 0 { - Json::Value tx = import(alice, loadXpop(ImportTCAccountSet::w_seed)); + Json::Value tx = + import(alice, loadXpop(ImportTCAccountSet::w_seed)); STAmount const& fee = XRP(0); tx[jss::Fee] = fee.getJson(JsonOptions::none); env(tx, ter(telINSUF_FEE_P)); @@ -1616,7 +1675,8 @@ class Import_test : public beast::unit_test::suite // temMALFORMED - sfAmount field must be in drops { - Json::Value tx = import(alice, loadXpop(ImportTCAccountSet::w_seed)); + Json::Value tx = + import(alice, loadXpop(ImportTCAccountSet::w_seed)); STAmount const& amount = XRP(-1); tx[jss::Amount] = amount.getJson(JsonOptions::none); env(tx, ter(temMALFORMED)); @@ -1626,7 +1686,7 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation] = {}; // one of many ways to throw error - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1634,7 +1694,7 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation][jss::unl][jss::public_key] = "not a hex"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1645,7 +1705,7 @@ class Import_test : public beast::unit_test::suite tmpXpop[jss::validation][jss::unl][jss::public_key] = "0084D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" "CDC1"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1663,7 +1723,7 @@ class Import_test : public beast::unit_test::suite Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::transaction][jss::blob] = "DEADBEEF"; tmpXpop[jss::transaction][jss::meta] = "DEADBEEF"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1685,7 +1745,7 @@ class Import_test : public beast::unit_test::suite "1954F6A7225A8BAADF5A3042016BFB87355D1D0AFEDBAA8FB22F98355D745F" "398EEE9E6B294BBE6A5681A31A6107243D19384E277B5A7B1F23B8C83DE78A" "14AE123A8556F3CF91154711376AFB0F894F832B3DE1"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1698,7 +1758,7 @@ class Import_test : public beast::unit_test::suite "D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000" "773593F4E1E7220000000024000000032D0000000162400000003B9AC9F481" "14AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F1"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1712,15 +1772,15 @@ class Import_test : public beast::unit_test::suite "D7795C91BFB0831355BDFDA177E86C8BF997985FE624000000026240000000" "773593F4E1E7220000000024000000032D0000000162400000003B9AC9F481" "14AE123A8556F3CF91154711376AFB0F894F832B3DE1E1F103103C"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // temMALFORMED - Import: import and txn inside xpop must be signed by // the same account { - Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); - Json::Value tx = import(bob, tmpXpop); + Json::Value const tmpXpop = loadXpop(ImportTCAccountSet::w_seed); + Json::Value const tx = import(bob, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1735,7 +1795,7 @@ class Import_test : public beast::unit_test::suite "0F67C7FFBF0287756D324DFBADCEDE2B23782C02207BE1B1294F1A1D5AC219" "90740B78F9C0693431237D6E07FE84228082986E50FF8114AE123A8556F3CF" "91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1749,7 +1809,7 @@ class Import_test : public beast::unit_test::suite "747440549A370E68DBB1947419D4CCDF90CAE0BCA9121593ECC21B3C79EF0F" "232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF3EC206AD3C51" "77C519560F8114AE123A8556F3CF91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1764,7 +1824,7 @@ class Import_test : public beast::unit_test::suite "C21B3C79EF0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF" "3EC206AD3C5177C519560F8114AE123A8556F3CF91154711376AFB0F894F83" "2B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(telWRONG_NETWORK)); } @@ -1779,7 +1839,7 @@ class Import_test : public beast::unit_test::suite "C21B3C79EF0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF" "3EC206AD3C5177C519560F8114AE123A8556F3CF91154711376AFB0F894F83" "2B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1797,7 +1857,7 @@ class Import_test : public beast::unit_test::suite "C21B3C79EF0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF" "3EC206AD3C5177C519560F8114AE123A8556F3CF91154711376AFB0F894F83" "2B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1808,7 +1868,7 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation][jss::unl][jss::manifest] = "YmFkSnNvbg=="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1823,7 +1883,7 @@ class Import_test : public beast::unit_test::suite "ikfgf9SZOlOGcBcBJAw44PLjH+" "HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+" "IILJIiIKU/+1Uxx0FRpQbMDA=="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1837,7 +1897,7 @@ class Import_test : public beast::unit_test::suite "ikfgf9SZOlOGcBcBJAw34PLjH+" "HUtEnwX45lIRmo0x5aINFMvZsBpE9QteSDBXKwYzLdnSW4e1bs21o+" "IILJIiIKU/+1Uxx0FRpQbMDA=="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1848,7 +1908,7 @@ class Import_test : public beast::unit_test::suite "949F6B8DA6E11C213B561659C16F13D35385E8EA9E775483ADC84578F6D578" "943DE5EB681584B2C03EFFFDFD216F9E0B21576E482F941C7195893B72B5B1" "F70D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1856,7 +1916,7 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation][jss::unl][jss::signature] = "not a hex"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1866,7 +1926,7 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1901,7 +1961,7 @@ class Import_test : public beast::unit_test::suite "2B3C0ECB63C82454522188337354C480693A9BCD64E776B4DBAD4C61B9E72D" "D4CC1DC237B06891E57C623C38506FE8E01B1914C9413471BCC160111E2829" "7606"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1932,7 +1992,7 @@ class Import_test : public beast::unit_test::suite "FA82662A23EC78E9644C65F752B7A58F61F35AC36C260F9E9D5CAC7D53D16D" "5D615A02A6462F2618C162D089AD2E3BA7D656728392180517A81B4C47F86A" "640D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1963,7 +2023,7 @@ class Import_test : public beast::unit_test::suite "9CCA07A3EDD1334D5ADCB3730D8F3F9BD1E0C338100384C7B15B6A910F96BE" "4F46E3052B37E9FE2E7DC9918BD85B9E871923AE1BDD7144EE2A92F625064C" "570C"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1980,7 +2040,7 @@ class Import_test : public beast::unit_test::suite [jss::children]["7"][jss::hash] = "12D47E7D543E15F1EDBA91CDF335722727851BDDA8C2FF8924772AD" "C6B522A29"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -1996,7 +2056,7 @@ class Import_test : public beast::unit_test::suite [jss::hash] = "22D47E7D543E15F1EDBA91CDF335722727851BDDA8C2FF8924772AD" "C6B522A29"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -2023,7 +2083,7 @@ class Import_test : public beast::unit_test::suite "WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUj" "ZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9D" "dFNBND0ifV19="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -2055,7 +2115,7 @@ class Import_test : public beast::unit_test::suite valData["n94at1vSdHSBEun25yT4ZfgqD1tVQNsx1nqRZG3T6ygbuvwgcMZN"] = "not a hex"; tmpXpop[jss::validation][jss::data] = valData; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -2073,7 +2133,7 @@ class Import_test : public beast::unit_test::suite "02203B131B68D3C5B6C5482312CC7D90D2CE131A9C46458967F2F98688B726" "C16719"; tmpXpop[jss::validation][jss::data] = valData; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // temMALFORMED - Import: validation inside xpop was not signed with a @@ -2090,7 +2150,7 @@ class Import_test : public beast::unit_test::suite "02203B131B68D3C5B6C5482312CC7D90D2CE131A9C46458967F2F98688B726" "C16719"; tmpXpop[jss::validation][jss::data] = valData; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // temMALFORMED - Import: validation inside xpop was not correctly @@ -2107,7 +2167,7 @@ class Import_test : public beast::unit_test::suite "02203B131B68D3C5B6C5482312CC7D90D2CE131A9C46458967F2F98688B726" "C16719"; tmpXpop[jss::validation][jss::data] = valData; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -2124,7 +2184,7 @@ class Import_test : public beast::unit_test::suite valData["n9KXYzdZD8YpsNiChtMjP6yhvQAhkkh5XeSTbvYyV1waF8wkNnBT"] = ""; tmpXpop[jss::validation][jss::data] = valData; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } @@ -2138,7 +2198,7 @@ class Import_test : public beast::unit_test::suite "6C747440549A370E68DBB1947419D4CCDF90CAE0BCA9121593ECC21B3C79EF" "0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF3EC206AD3C" "5177C519560F8114AE123A8556F3CF91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // No Fee @@ -2150,7 +2210,7 @@ class Import_test : public beast::unit_test::suite "549A370E68DBB1947419D4CCDF90CAE0BCA9121593ECC21B3C79EF0F232EB4" "375F95F1EBCED78B94D09838B5E769D43F041019ADEF3EC206AD3C5177C519" "560F8114AE123A8556F3CF91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // Bad Fee - TODO @@ -2164,34 +2224,49 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - auto const alice = Account("alice"); - auto const bob = Account("bob"); + // ---------------------------------------------------------------------- + // preclaim - env.fund(XRP(1000), alice, bob); - env.close(); + // temDISABLED + { + test::jtx::Env env{ + *this, + makeNetworkVLConfig(21337, keys), + features - featureImport}; - // burn 1000 xrp - auto const master = Account("masterpassphrase"); - env(noop(master), fee(1'000'000'000), ter(tesSUCCESS)); - env.close(); + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); - //---------------------------------------------------------------------- - // preclaim + env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + ter(temDISABLED)); + } - // temDISABLED - disabled - CHECKED IN ENABLED - // tefINTERNAL/temMALFORMED - during preclaim could not parse xpop, - // bailing. + // tefINTERNAL + // during preclaim could not parse xpop, bailing. { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); - tmpXpop[jss::validation] = {}; // one of many ways to throw error - Json::Value tx = import(alice, tmpXpop); + tmpXpop[jss::validation] = {}; + Json::Value const tx = import(alice, tmpXpop); + // DA: Sanity Check - tefINTERNAL(preclaim) env(tx, ter(temMALFORMED)); } - // tefINTERNAL/temMALFORMED - during preclaim could not find - // importSequence, bailing. + + // tefINTERNAL + // during preclaim could not find importSequence, bailing. { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::transaction][jss::blob] = "1200632200000000201B0000006C201D0000535968400000003B9ACA007321" @@ -2199,39 +2274,125 @@ class Import_test : public beast::unit_test::suite "6C747440549A370E68DBB1947419D4CCDF90CAE0BCA9121593ECC21B3C79EF" "0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF3EC206AD3C" "5177C519560F8114AE123A8556F3CF91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); + // DA: Sanity Check - tefINTERNAL(preclaim) env(tx, ter(temMALFORMED)); } - // tefPAST_IMPORT_SEQ - - // { - // env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), - // ter(tesSUCCESS)); - // env(import(alice, loadXpop(ImportTCAccountSet::min)), - // ter(tefPAST_IMPORT_SEQ)); - // } - // // tefINTERNAL/temMALFORMED - !vlInfo - // { - // Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); - // 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, loadXpop(ImportTCAccountSet::w_seed)); env(tx, ter(tefPAST_IMPORT_SEQ)); - // } + // tefPAST_IMPORT_SEQ + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; - // telIMPORT_VL_KEY_NOT_RECOGNISED - Import: (fromchain) key does not - // match (tochain) key - // { - // Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); - // tmpXpop[jss::validation][jss::unl][jss::public_key] = - // "ED84D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" - // "CDC1"; - // Json::Value tx = import(alice, tmpXpop); - // env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); - // } + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + ter(tesSUCCESS)); + env(import(alice, loadXpop(ImportTCAccountSet::min)), + ter(tefPAST_IMPORT_SEQ)); + } + + // temBAD_FEE + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const alice = Account("alice"); + env.memoize(alice); + Json::Value tx = + import(alice, loadXpop(ImportTCAccountSet::w_seed)); + tx[jss::Sequence] = 0; + tx[jss::Fee] = 10; + env(tx, ter(temBAD_FEE)); + } + + // tefINTERNAL + // during preclaim could not parse vlInfo, bailing. + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); + tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; + Json::Value const tx = import(alice, tmpXpop); + // DA: Sanity Check - tefINTERNAL(preclaim) + env(tx, ter(temMALFORMED)); + } + + // tefPAST_IMPORT_VL_SEQ + // import vl sequence already used, bailing. + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + std::string const pkString = + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + "CDC1"; + auto const pkHex = strUnHex(pkString); + PublicKey const pk{makeSlice(*pkHex)}; + + auto const alice = Account("alice"); + auto const bob = Account("bob"); + env.fund(XRP(1000), alice, bob); + env.close(); + + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + Json::Value const xpop1_1 = + loadXpop(ImportTCAccountSet::unl_seq_1_1); + Json::Value const tx_1_1 = import(alice, xpop1_1); + env(tx_1_1, ter(tesSUCCESS)); + + BEAST_EXPECT(importVLSequence(env, pk) == 1); + + Json::Value const xpop2_1 = + loadXpop(ImportTCAccountSet::unl_seq_2_1); + Json::Value const tx_2_1 = import(bob, xpop2_1); + env(tx_2_1, ter(tesSUCCESS)); + + BEAST_EXPECT(importVLSequence(env, pk) == 2); + + Json::Value const xpop1_2 = + loadXpop(ImportTCAccountSet::unl_seq_1_2); + Json::Value const tx_1_2 = import(alice, xpop1_2); + env(tx_1_2, ter(tefPAST_IMPORT_VL_SEQ)); + } + + // tesSUCCESS + // DA: testImportSequence + + // tefINTERNAL + // DA: Impossible Test + + // tefINTERNAL + // DA: Impossible Test + + // tesSUCCESS + // DA: testImportSequence + + // telIMPORT_VL_KEY_NOT_RECOGNISED + // import vl key not recognized, bailing. + { + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + Json::Value const tmpXpop = loadXpop(ImportTCAccountSet::w_seed); + Json::Value const tx = import(alice, tmpXpop); + env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + } } void @@ -2242,7 +2403,7 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const alice = Account("alice"); auto const bob = Account("bob"); @@ -2258,8 +2419,7 @@ class Import_test : public beast::unit_test::suite //---------------------------------------------------------------------- // doApply - // temDISABLED - disabled - // DA: Sanity Check + // temDISABLED // tefINTERNAL/temMALFORMED - ctx_.tx.isFieldPresent(sfBlob) { @@ -2273,12 +2433,12 @@ class Import_test : public beast::unit_test::suite { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation] = {}; // one of many ways to throw error - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } - // tefINTERNAL/temMALFORMED - during apply could not find importSequence - // or fee, bailing. + // tefINTERNAL/temMALFORMED + // during apply could not find importSequence or fee, bailing. // No Fee { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); @@ -2288,26 +2448,30 @@ class Import_test : public beast::unit_test::suite "6C747440549A370E68DBB1947419D4CCDF90CAE0BCA9121593ECC21B3C79EF" "0F232EB4375F95F1EBCED78B94D09838B5E769D43F041019ADEF3EC206AD3C" "5177C519560F8114AE123A8556F3CF91154711376AFB0F894F832B3D"; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } // No Sequence - // tefINTERNAL - initBal <= beast::zero + // tefINTERNAL + // initBal <= beast::zero // Sanity Check - // tefINTERNAL - ImportSequence passed + // tefINTERNAL + // ImportSequence passed // Sanity Check (tefPAST_IMPORT_SEQ) - // tefINTERNAL/temMALFORMED - !infoVL + // tefINTERNAL/temMALFORMED + // !infoVL { Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed); tmpXpop[jss::validation][jss::unl][jss::blob] = "YmFkSnNvbg=="; - Json::Value tx = import(alice, tmpXpop); + Json::Value const tx = import(alice, tmpXpop); env(tx, ter(temMALFORMED)); } - // tefINTERNAL - current > infoVL->first + // tefINTERNAL + // current > infoVL->first // Sanity Check (tefPAST_IMPORT_VL_SEQ) } @@ -2321,12 +2485,10 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne (bad signer) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - auto const feeDrops = env.current()->fees().base; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2335,7 +2497,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2374,12 +2536,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2388,7 +2550,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2404,7 +2566,8 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT(preAlice == XRP(0)); // import tx - Json::Value tx = import(alice, loadXpop(ImportTCAccountSet::w_seed)); + Json::Value tx = + import(alice, loadXpop(ImportTCAccountSet::w_seed)); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; env(tx, alice, ter(tesSUCCESS)); @@ -2431,12 +2594,10 @@ class Import_test : public beast::unit_test::suite // w/ regular key other -> dne (bad signer) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - auto const feeDrops = env.current()->fees().base; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2445,7 +2606,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2484,12 +2645,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2498,7 +2659,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2547,12 +2708,12 @@ class Import_test : public beast::unit_test::suite // w/ signers list -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2561,7 +2722,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2583,12 +2744,7 @@ class Import_test : public beast::unit_test::suite Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; - env( - tx, - alice, - msig(bob, carol), - ter(tesSUCCESS) - ); + env(tx, alice, msig(bob, carol), ter(tesSUCCESS)); env.close(); // total burn = burn drops - feeDrops @@ -2612,18 +2768,20 @@ class Import_test : public beast::unit_test::suite env.close(); // alice cannnot sign - env(noop(alice), sig(alice), fee(feeDrops), - ter(tefMASTER_DISABLED)); + env(noop(alice), + sig(alice), + fee(feeDrops), + ter(tefMASTER_DISABLED)); } // w/ seed -> funded { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10,000 xrp @@ -2632,7 +2790,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -2641,17 +2799,18 @@ class Import_test : public beast::unit_test::suite // confirm env auto const preCoins = env.current()->info().drops; - BEAST_EXPECT(preCoins == burnCoins - (2 * feeDrops)); + BEAST_EXPECT(preCoins == burnCoins - (2 * feeDrops)); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); // import tx env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + fee(10 * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - feeDrops - auto const totalBurn = XRP(1000) - feeDrops; + auto const totalBurn = XRP(1000) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -2670,12 +2829,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> funded { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2684,7 +2843,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2695,18 +2854,18 @@ class Import_test : public beast::unit_test::suite // confirm env auto const preCoins = env.current()->info().drops; - BEAST_EXPECT(preCoins == burnCoins - (4 * feeDrops)); + BEAST_EXPECT(preCoins == burnCoins - (4 * feeDrops)); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); // import tx auto const xpopJson = loadXpop(ImportTCAccountSet::w_regular_key); - Json::Value tx = import(alice, xpopJson); - env(tx, alice, sig(bob), ter(tesSUCCESS)); + Json::Value const tx = import(alice, xpopJson); + env(tx, alice, sig(bob), fee(10 * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - feeDrops - auto const totalBurn = XRP(1000) - feeDrops; + auto const totalBurn = XRP(1000) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -2727,12 +2886,12 @@ class Import_test : public beast::unit_test::suite // w/ signers -> funded { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2741,7 +2900,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2753,22 +2912,22 @@ class Import_test : public beast::unit_test::suite // confirm env auto const preCoins = env.current()->info().drops; - BEAST_EXPECT(preCoins == burnCoins - (6 * feeDrops)); + BEAST_EXPECT(preCoins == burnCoins - (6 * feeDrops)); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); // import tx auto const xpopJson = loadXpop(ImportTCAccountSet::w_signers); - Json::Value tx = import(alice, xpopJson); + Json::Value const tx = import(alice, xpopJson); env(tx, alice, msig(bob, carol), - fee(3 * feeDrops), + fee((3 * feeDrops) * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - feeDrops - auto const totalBurn = drops(48) - (3 * feeDrops); + auto const totalBurn = drops(48) - ((3 * feeDrops) * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -2802,12 +2961,12 @@ class Import_test : public beast::unit_test::suite // account set flags not migrated { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2816,7 +2975,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -2825,17 +2984,18 @@ class Import_test : public beast::unit_test::suite // confirm env auto const preCoins = env.current()->info().drops; - BEAST_EXPECT(preCoins == burnCoins - (2 * feeDrops)); + BEAST_EXPECT(preCoins == burnCoins - (2 * feeDrops)); auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); // import tx env(import(alice, loadXpop(ImportTCAccountSet::w_flags)), + fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(10) - feeDrops; + auto const totalBurn = drops(10) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -2863,12 +3023,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm env - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2876,7 +3036,7 @@ class Import_test : public beast::unit_test::suite env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); env.close(); - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2899,7 +3059,7 @@ class Import_test : public beast::unit_test::suite env(tx, alice, ter(tesSUCCESS)); env.close(); - // total burn = burn drops - fee drops + // total burn = burn drops + reward amount auto const totalBurn = drops(12) + XRP(2); // confirm fee was minted @@ -2919,12 +3079,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm env - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2932,7 +3092,7 @@ class Import_test : public beast::unit_test::suite env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); env.close(); - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -2950,7 +3110,8 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT(preAlice == XRP(0)); // import tx - auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_regular_key); + auto const xpopJson = + loadXpop(ImportTCSetRegularKey::w_regular_key); Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; @@ -2959,7 +3120,7 @@ class Import_test : public beast::unit_test::suite // total burn = burn drops - initial value auto const totalBurn = drops(12) + XRP(2); - + // confirm fee was minted auto const postAlice = env.balance(alice); BEAST_EXPECT(postAlice == preAlice + totalBurn); @@ -2977,12 +3138,12 @@ class Import_test : public beast::unit_test::suite // w/ signers -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm env - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -2990,7 +3151,7 @@ class Import_test : public beast::unit_test::suite env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); env.close(); - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -3014,15 +3175,10 @@ class Import_test : public beast::unit_test::suite Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; - env( - tx, - alice, - msig(bob, carol), - ter(tesSUCCESS) - ); + env(tx, alice, msig(bob, carol), ter(tesSUCCESS)); env.close(); - // total burn = burn drops - fee drops + // total burn = burn drops + reward amount auto const totalBurn = drops(48) + XRP(2); // confirm fee was minted @@ -3038,27 +3194,30 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT(env.current()->read(k) == nullptr); // confirm regular key - auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); - BEAST_EXPECT(acctSle && acctSle->isFieldPresent(sfRegularKey) && acctSle->getAccountID(sfRegularKey) == dave.id()); + auto const [acct, acctSle] = + accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT( + acctSle && acctSle->isFieldPresent(sfRegularKey) && + acctSle->getAccountID(sfRegularKey) == dave.id()); env(noop(alice), sig(dave), fee(feeDrops), ter(tesSUCCESS)); } // w/ seed -> funded { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm env - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp auto const master = Account("masterpassphrase"); env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); env.close(); - - auto burnCoins = env.current()->info().drops; + + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3074,11 +3233,11 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_seed); - env(import(alice, xpopJson), ter(tesSUCCESS)); + env(import(alice, xpopJson), fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - feeDrops - auto const totalBurn = drops(12) - feeDrops; + auto const totalBurn = drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3097,12 +3256,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> funded (update regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3111,7 +3270,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3139,11 +3298,14 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_seed); - env(import(alice, xpopJson), sig(alice), ter(tesSUCCESS)); + env(import(alice, xpopJson), + fee(feeDrops * 10), + sig(alice), + ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(12) - feeDrops; + auto const totalBurn = drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3162,12 +3324,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> funded (update regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3176,7 +3338,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3204,12 +3366,16 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT(preAlice == envAlice - (2 * feeDrops)); // import tx - auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_regular_key); - env(import(alice, xpopJson), sig(bob), ter(tesSUCCESS)); + auto const xpopJson = + loadXpop(ImportTCSetRegularKey::w_regular_key); + env(import(alice, xpopJson), + fee(feeDrops * 10), + sig(bob), + ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(12) - feeDrops; + auto const totalBurn = drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3228,12 +3394,12 @@ class Import_test : public beast::unit_test::suite // w/ signers list -> funded (update regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3242,7 +3408,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3274,12 +3440,12 @@ class Import_test : public beast::unit_test::suite auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_signers); env(import(alice, xpopJson), msig(bob, carol), - fee(3 * feeDrops), + fee((3 * feeDrops) * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(48) - (3 * feeDrops); + auto const totalBurn = drops(48) - ((3 * feeDrops) * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3302,12 +3468,12 @@ class Import_test : public beast::unit_test::suite // seed -> funded (empty regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3316,7 +3482,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3344,11 +3510,14 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_seed_empty); - env(import(alice, xpopJson), sig(alice), ter(tesSUCCESS)); + env(import(alice, xpopJson), + fee(feeDrops * 10), + sig(alice), + ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(12) - feeDrops; + auto const totalBurn = drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3366,12 +3535,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> funded (empty regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3380,7 +3549,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3409,11 +3578,14 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_regular_key_empty); - env(import(alice, xpopJson), sig(bob), ter(tesSUCCESS)); + env(import(alice, xpopJson), + fee(feeDrops * 10), + sig(bob), + ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(12) - feeDrops; + auto const totalBurn = drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3434,12 +3606,12 @@ class Import_test : public beast::unit_test::suite // w/ signers -> funded (empty regular key) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3448,7 +3620,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3480,12 +3652,12 @@ class Import_test : public beast::unit_test::suite loadXpop(ImportTCSetRegularKey::w_signers_empty); env(import(alice, xpopJson), msig(bob, carol), - fee(3 * feeDrops), + fee((3 * feeDrops) * 10), ter(tesSUCCESS)); env.close(); // total burn = burn drops - fee drops - auto const totalBurn = drops(48) - (3 * feeDrops); + auto const totalBurn = drops(48) - ((3 * feeDrops) * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3516,9 +3688,7 @@ class Import_test : public beast::unit_test::suite // dne -> dont set flag { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - auto const feeDrops = env.current()->fees().base; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // burn 10'000 xrp auto const master = Account("masterpassphrase"); @@ -3542,12 +3712,13 @@ class Import_test : public beast::unit_test::suite auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); BEAST_EXPECT( - (acctSle->getFieldU32(sfFlags) & lsfPasswordSpent) == lsfPasswordSpent); + (acctSle->getFieldU32(sfFlags) & lsfPasswordSpent) == + lsfPasswordSpent); } // funded -> set flag { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; @@ -3563,15 +3734,14 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSetRegularKey::w_seed_zero); - env(import(alice, xpopJson), ter(tesSUCCESS)); + env(import(alice, xpopJson), fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); // confirm lsfPasswordSpent is not set auto const [acct, acctSle] = accountKeyAndSle(*env.current(), alice); BEAST_EXPECT( - (acctSle->getFieldU32(sfFlags) & lsfPasswordSpent) == - 0); + (acctSle->getFieldU32(sfFlags) & lsfPasswordSpent) == 0); } } @@ -3585,12 +3755,10 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne w/ seed (Bad Fee) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - auto const feeDrops = env.current()->fees().base; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3599,7 +3767,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -3630,12 +3798,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne w/ seed { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3644,7 +3812,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -3675,13 +3843,12 @@ class Import_test : public beast::unit_test::suite // confirm fee was minted auto const postAlice = env.balance(alice); BEAST_EXPECT(postAlice == preAlice + totalBurn); - + // confirm fee was minted auto const postCoins = env.current()->info().drops; BEAST_EXPECT(postCoins == preCoins + totalBurn); // confirm signers set - auto const k = keylet::signers(alice); auto const [signers, signersSle] = signersKeyAndSle(*env.current(), alice); auto const signerEntries = @@ -3709,12 +3876,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3723,7 +3890,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -3743,7 +3910,8 @@ class Import_test : public beast::unit_test::suite // import tx auto const burnAmt = XRP(2); - auto const xpopJson = loadXpop(ImportTCSignersListSet::w_regular_key); + auto const xpopJson = + loadXpop(ImportTCSignersListSet::w_regular_key); Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; @@ -3756,13 +3924,12 @@ class Import_test : public beast::unit_test::suite // confirm fee was minted auto const postAlice = env.balance(alice); BEAST_EXPECT(postAlice == preAlice + totalBurn); - + // confirm fee was minted auto const postCoins = env.current()->info().drops; BEAST_EXPECT(postCoins == preCoins + totalBurn); // confirm signers set - auto const k = keylet::signers(alice); auto const [signers, signersSle] = signersKeyAndSle(*env.current(), alice); auto const signerEntries = @@ -3772,7 +3939,8 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT( signerEntries[0u].getAccountID(sfAccount) == dave.id()); BEAST_EXPECT(signerEntries[1u].getFieldU16(sfSignerWeight) == 1); - BEAST_EXPECT(signerEntries[1u].getAccountID(sfAccount) == carol.id()); + BEAST_EXPECT( + signerEntries[1u].getAccountID(sfAccount) == carol.id()); // confirm multisign tx env.close(); @@ -3793,12 +3961,12 @@ class Import_test : public beast::unit_test::suite // w/ signers -> dne { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 100,000 xrp @@ -3807,7 +3975,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); // init env @@ -3833,21 +4001,21 @@ class Import_test : public beast::unit_test::suite Json::Value tx = import(alice, xpopJson); tx[jss::Sequence] = 0; tx[jss::Fee] = 0; - env(tx, - alice, - msig(bob, carol), - ter(tesSUCCESS)); + env(tx, alice, msig(bob, carol), ter(tesSUCCESS)); env.close(); // confirm signers set - auto const k = keylet::signers(alice); - auto const [signers, signersSle] = signersKeyAndSle(*env.current(), alice); - auto const signerEntries = signersSle->getFieldArray(sfSignerEntries); + auto const [signers, signersSle] = + signersKeyAndSle(*env.current(), alice); + auto const signerEntries = + signersSle->getFieldArray(sfSignerEntries); BEAST_EXPECT(signerEntries.size() == 2); BEAST_EXPECT(signerEntries[0u].getFieldU16(sfSignerWeight) == 1); - BEAST_EXPECT(signerEntries[0u].getAccountID(sfAccount) == dave.id()); + BEAST_EXPECT( + signerEntries[0u].getAccountID(sfAccount) == dave.id()); BEAST_EXPECT(signerEntries[1u].getFieldU16(sfSignerWeight) == 1); - BEAST_EXPECT(signerEntries[1u].getAccountID(sfAccount) == elsa.id()); + BEAST_EXPECT( + signerEntries[1u].getAccountID(sfAccount) == elsa.id()); // confirm multisign tx env.close(); @@ -3868,12 +4036,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> funded { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3882,7 +4050,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3899,11 +4067,11 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSignersListSet::w_seed); - env(import(alice, xpopJson), ter(tesSUCCESS)); + env(import(alice, xpopJson), fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); // total burn = (burn drops + burn fee drops) - fee drops - auto const totalBurn = XRP(2) + drops(12) - feeDrops; + auto const totalBurn = XRP(2) + drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -3941,12 +4109,12 @@ class Import_test : public beast::unit_test::suite // w/ seed (empty) -> funded (has entries) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; - + // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -3955,7 +4123,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -3985,12 +4153,13 @@ class Import_test : public beast::unit_test::suite BEAST_EXPECT(preAlice == envAlice - (4 * feeDrops)); // import tx - auto const xpopJson = loadXpop(ImportTCSignersListSet::w_seed_empty); - env(import(alice, xpopJson), ter(tesSUCCESS)); + auto const xpopJson = + loadXpop(ImportTCSignersListSet::w_seed_empty); + env(import(alice, xpopJson), fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); // total burn = (burn drops + burn fee drops) - fee drops - auto const totalBurn = XRP(2) + drops(12) - feeDrops; + auto const totalBurn = XRP(2) + drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -4010,12 +4179,12 @@ class Import_test : public beast::unit_test::suite // w/ regular key (empty) -> funded (has entries) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -4024,7 +4193,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -4061,11 +4230,14 @@ class Import_test : public beast::unit_test::suite // import tx auto const xpopJson = loadXpop(ImportTCSignersListSet::w_regular_key_empty); - env(import(alice, xpopJson), sig(bob), ter(tesSUCCESS)); + env(import(alice, xpopJson), + fee(feeDrops * 10), + sig(bob), + ter(tesSUCCESS)); env.close(); // total burn = (burn drops + burn fee drops) - fee drops - auto const totalBurn = XRP(2) + drops(12) - feeDrops; + auto const totalBurn = XRP(2) + drops(12) - (feeDrops * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -4091,12 +4263,12 @@ class Import_test : public beast::unit_test::suite // w/ signers (empty) -> funded (has entries) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -4105,7 +4277,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -4139,12 +4311,12 @@ class Import_test : public beast::unit_test::suite loadXpop(ImportTCSignersListSet::w_signers_empty); env(import(alice, xpopJson), msig(bob, carol), - fee(3 * feeDrops), + fee((3 * feeDrops) * 10), ter(tesSUCCESS)); env.close(); // total burn = (burn drops + burn fee drops) - fee drops - auto const totalBurn = XRP(2) + drops(48) - (3 * feeDrops); + auto const totalBurn = XRP(2) + drops(48) - ((3 * feeDrops) * 10); // confirm fee was minted auto const postAlice = env.balance(alice); @@ -4164,23 +4336,19 @@ class Import_test : public beast::unit_test::suite } void - testHookIssuer(FeatureBitset features) + testAccountCount(FeatureBitset features) { - testcase("hook issuer tx"); + testcase("account count"); using namespace test::jtx; using namespace std::literals; - - // tt NFTokenMint - // tt URITokenMint - // w/ seed -> dne w/ seed - { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -4189,55 +4357,118 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); 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(ImportTCNFTokenMint::w_seed)), + env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); - // confirm fee was minted - auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000) - feeDrops); + // confirm account index was set + auto const [acct, acctSle] = + accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT((*acctSle)[sfAccountIndex] == 0); - env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), - ter(tefPAST_IMPORT_SEQ)); - env.close(); - auto const failedAlice = env.balance(alice); - BEAST_EXPECT(failedAlice == postAlice); + // confirm account count was set + auto const [fee, feeSle] = feesKeyAndSle(*env.current()); + BEAST_EXPECT((*feeSle)[sfAccountCount] == 1); } - // tt Payment - // tt Payment + } + + void + testHookIssuer(FeatureBitset features) + { + testcase("hook issuer tx"); + + using namespace test::jtx; + using namespace std::literals; + + // Test that hook can reject and does NOT mint the funds. { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; + // confirm total coins header + auto const initCoins = env.current()->info().drops; + BEAST_EXPECT(initCoins == 100'000'000'000'000'000); + + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + // confirm total coins header + auto const burnCoins = env.current()->info().drops; + BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); + auto const alice = Account("alice"); - env.fund(XRP(1000), alice); + auto const issuer = Account("issuer"); + env.fund(XRP(10000), alice, issuer); env.close(); - auto preAlice = env.balance(alice); - BEAST_EXPECT(preAlice == XRP(1000)); - env(import(alice, loadXpop(ImportTCPayment::w_seed)), - ter(tesSUCCESS)); + std::string const createCodeHex = + "0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F" + "017F60017F017E02250303656E76057472616365000003656E7608726F6C6C" + "6261636B000103656E76025F670002030201030503010002062B077F0141C0" + "88040B7F004180080B7F0041BE080B7F004180080B7F0041C088040B7F0041" + "000B7F0041010B07080104686F6F6B00030AC3800001BF800001017F230041" + "106B220124002001200036020C41940841154180084114410010001A41AA08" + "4114420A10011A41012200200010021A200141106A240042000B0B44010041" + "80080B3D526F6C6C6261636B2E633A2043616C6C65642E0022526F6C6C6261" + "636B2E633A2043616C6C65642E2200526F6C6C6261636B3A20526F6C6C6261" + "636B21"; + std::string ns_str = + "CAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECAFECA" + "FE"; + Json::Value jv = + ripple::test::jtx::hook(issuer, {{hso(createCodeHex)}}, 0); + jv[jss::Hooks][0U][jss::Hook][jss::HookNamespace] = ns_str; + jv[jss::Hooks][0U][jss::Hook][jss::HookOn] = + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFBFFF" + "FF"; + env(jv, fee(1'000'000)); env.close(); - // confirm fee was minted + auto const preAlice = env.balance(alice); + auto const preCoins = env.current()->info().drops; + + auto tx = import(alice, loadXpop(ImportTCAccountSet::w_seed)); + tx[sfIssuer.jsonName] = issuer.human(); + env(tx, fee(1'000'000), ter(tecHOOK_REJECTED)); + env.close(); + + // confirm fee was burned but no mint auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + XRP(1000) - feeDrops); + BEAST_EXPECT(postAlice == preAlice - XRP(1)); + + // confirm total coins header + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == preCoins - XRP(1)); + // resubmit import without issuer - no trigger hook env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), - ter(tefPAST_IMPORT_SEQ)); + fee(feeDrops * 10), + ter(tesSUCCESS)); + env.close(); + + // total burn = (burn drops + burn fee drops) - fee drops + auto const totalBurn = XRP(1000) - (feeDrops * 10); + + // confirm fee was minted + auto const postAlice2 = env.balance(alice); + BEAST_EXPECT(postAlice2 == postAlice + totalBurn); + + // confirm total coins header + auto const postCoins2 = env.current()->info().drops; + BEAST_EXPECT(postCoins2 == postCoins + totalBurn); + env.close(); - auto const failedAlice = env.balance(alice); - BEAST_EXPECT(failedAlice == postAlice); } } @@ -4249,14 +4480,17 @@ class Import_test : public beast::unit_test::suite using namespace test::jtx; using namespace std::literals; - // test tefPAST_IMPORT_SEQ + // test bad IMPORT_VL_KEYS no UNLReport { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + std::vector const badVLKeys = { + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + "CDC2"}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, badVLKeys)}; auto const feeDrops = env.current()->fees().base; // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -4265,7 +4499,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto burnCoins = env.current()->info().drops; + auto const burnCoins = env.current()->info().drops; BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); auto const alice = Account("alice"); @@ -4275,21 +4509,120 @@ class Import_test : public beast::unit_test::suite auto preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(1000)); env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + fee(feeDrops * 10), + ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + env.close(); + } + + // test good IMPORT_VL_KEYS no UNLReport + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const feeDrops = env.current()->fees().base; + + // confirm total coins header + auto const initCoins = env.current()->info().drops; + BEAST_EXPECT(initCoins == 100'000'000'000'000'000); + + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + // confirm total coins header + auto const burnCoins = env.current()->info().drops; + BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); + + 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(ImportTCAccountSet::w_seed)), + fee(feeDrops * 10), ter(tesSUCCESS)); env.close(); + } - // total burn = burn drops - fee drops - auto const totalBurn = XRP(1000) - feeDrops; + // test bad IMPORT_VL_KEYS has UNLReport + { + std::vector const badVLKeys = { + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + "CDC2"}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, badVLKeys)}; - // confirm fee was minted - auto const postAlice = env.balance(alice); - BEAST_EXPECT(postAlice == preAlice + totalBurn); + auto const feeDrops = env.current()->fees().base; + + // confirm total coins header + auto const initCoins = env.current()->info().drops; + BEAST_EXPECT(initCoins == 100'000'000'000'000'000); + + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + // confirm total coins header + auto const burnCoins = env.current()->info().drops; + BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000); + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + auto preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(1000)); + + // ADD UNL REPORT + std::vector const _ivlKeys = { + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + "CDC1", + "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" + "CDC2", + }; + + std::vector ivlKeys; + for (auto const& strPk : _ivlKeys) + { + auto pkHex = strUnHex(strPk); + ivlKeys.emplace_back(makeSlice(*pkHex)); + } + + std::vector const _vlKeys = { + "ED8E43A943A174190BA2FAE91F44AC6E2D1D8202EFDCC2EA3DBB39814576D6" + "90F7", + "ED45D1840EE724BE327ABE9146503D5848EFD5F38B6D5FEDE71E80ACCE5E6E" + "738B"}; + + std::vector vlKeys; + for (auto const& strPk : _vlKeys) + { + auto pkHex = strUnHex(strPk); + vlKeys.emplace_back(makeSlice(*pkHex)); + } + + // insert a ttUNL_REPORT pseudo into the open ledger + env.app().openLedger().modify( + [&](OpenView& view, beast::Journal j) -> bool { + STTx tx = createUNLReportTx( + env.current()->seq() + 1, ivlKeys[0], vlKeys[0]); + uint256 txID = tx.getTransactionID(); + auto s = std::make_shared(); + tx.add(*s); + env.app().getHashRouter().setFlags(txID, SF_PRIVATE2); + view.rawTxInsert(txID, std::move(s), nullptr); + return true; + }); + + // close the ledger + env.close(); + // Test Import env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), - ter(tefPAST_IMPORT_SEQ)); + fee(feeDrops * 10), + ter(tesSUCCESS)); env.close(); - auto const failedAlice = env.balance(alice); - BEAST_EXPECT(failedAlice == postAlice); } } @@ -4303,9 +4636,8 @@ class Import_test : public beast::unit_test::suite // burn 100'000 coins { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; - auto const feeDrops = env.current()->fees().base; auto const envCoins = env.current()->info().drops; BEAST_EXPECT(envCoins == 100'000'000'000'000'000); // 100'000'000'000'000'000 - drops @@ -4318,13 +4650,13 @@ class Import_test : public beast::unit_test::suite auto const preCoins = env.current()->info().drops; BEAST_EXPECT(preCoins == envCoins - drops(100'000'000'000)); - + auto const alice = Account("alice"); env.memoize(alice); - auto preAlice = env.balance(alice); + auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(0)); - + STAmount burnFee = XRP(1000) + XRP(2); auto const xpopJson = loadXpop(ImportTCAccountSet::w_seed); Json::Value tx = import(alice, xpopJson); @@ -4341,15 +4673,16 @@ class Import_test : public beast::unit_test::suite // burn all coins { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; - auto const feeDrops = env.current()->fees().base; auto const envCoins = env.current()->info().drops; BEAST_EXPECT(envCoins == 100'000'000'000'000'000); // burn all but 1,000 xrp auto const master = Account("masterpassphrase"); - env(noop(master), fee(envCoins - drops(1'000'000'000)), ter(tesSUCCESS)); + env(noop(master), + fee(envCoins - drops(1'000'000'000)), + ter(tesSUCCESS)); env.close(); auto const preCoins = env.current()->info().drops; @@ -4358,9 +4691,9 @@ class Import_test : public beast::unit_test::suite auto const alice = Account("alice"); env.memoize(alice); - auto preAlice = env.balance(alice); + auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(0)); - + STAmount burnFee = XRP(1000) + XRP(2); auto const xpopJson = loadXpop(ImportTCAccountSet::w_seed); Json::Value tx = import(alice, xpopJson); @@ -4368,7 +4701,7 @@ class Import_test : public beast::unit_test::suite tx[jss::Fee] = 0; env(tx, alice, ter(tesSUCCESS)); env.close(); - + auto const postAlice = env.balance(alice); BEAST_EXPECT(postAlice == preAlice + burnFee); auto const postCoins = env.current()->info().drops; @@ -4377,7 +4710,7 @@ class Import_test : public beast::unit_test::suite // burn no coins { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; auto const envCoins = env.current()->info().drops; @@ -4389,9 +4722,9 @@ class Import_test : public beast::unit_test::suite auto const alice = Account("alice"); env.memoize(alice); - auto preAlice = env.balance(alice); + auto const preAlice = env.balance(alice); BEAST_EXPECT(preAlice == XRP(0)); - + STAmount burnFee = XRP(1000) + XRP(2); auto const xpopJson = loadXpop(ImportTCAccountSet::w_seed); Json::Value tx = import(alice, xpopJson); @@ -4399,7 +4732,7 @@ class Import_test : public beast::unit_test::suite tx[jss::Fee] = 0; env(tx, alice, ter(tefINTERNAL)); env.close(); - + auto const postAlice = env.balance(alice); BEAST_EXPECT(postAlice == preAlice); auto const postCoins = env.current()->info().drops; @@ -4417,12 +4750,12 @@ class Import_test : public beast::unit_test::suite // w/ seed -> dne (min) { - test::jtx::Env env{*this, makeNetworkConfig(21337)}; + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; auto const feeDrops = env.current()->fees().base; - + // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 100'000'000'000'000'000); // burn 10'000 xrp @@ -4431,7 +4764,7 @@ class Import_test : public beast::unit_test::suite env.close(); // confirm total coins header - auto preCoins = env.current()->info().drops; + auto const preCoins = env.current()->info().drops; BEAST_EXPECT(preCoins == initCoins - 10'000'000'000); // init env @@ -4450,7 +4783,7 @@ class Import_test : public beast::unit_test::suite env(tx, alice, ter(tesSUCCESS)); env.close(); - // total burn = burn drops - fee drops + // total burn = burn drops + reward amount auto const totalBurn = drops(10) + XRP(2); // confirm fee was minted @@ -4468,45 +4801,112 @@ class Import_test : public beast::unit_test::suite env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); } - // // w/ seed -> dne (max) - // { - // test::jtx::Env env{*this, makeNetworkConfig(21337)}; - - // auto const feeDrops = env.current()->fees().base; - // auto const envCoins = env.current()->info().drops; - // auto const totalCoins = drops(100'000'000'000'000'000); - - // // init env - // auto const alice = Account("alice"); - // env.memoize(alice); - - // // confirm env - // auto const preCoins = env.current()->info().drops; - // BEAST_EXPECT(preCoins == totalCoins); - // auto const preAlice = env.balance(alice); - // BEAST_EXPECT(preAlice == XRP(0)); - - // // import tx - // auto const xpopJson = loadXpop(ImportTCAccountSet::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; - // BEAST_EXPECT(postCoins == 999'999'999'999'900'000); - // // std::cout << "POST COINS: " << postCoins << "\n"; - - // // confirm account exists - // auto const [acct, acctSle] = - // accountKeyAndSle(*env.current(), alice); - // BEAST_EXPECT(acctSle != nullptr); - // env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); - // } + // w/ seed -> dne (min) (Reserve/Reference/Fee) + // Owner Fee = 20 xrp + { + test::jtx::Env env{*this, makeMaxFeeConfig(21337, keys)}; + + auto const feeDrops = env.current()->fees().base; + + // confirm total coins header + auto const initCoins = env.current()->info().drops; + BEAST_EXPECT(initCoins == 100'000'000'000'000'000); + + // burn 10'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); + env.close(); + + // confirm total coins header + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == initCoins - 10'000'000'000); + + // init env + auto const alice = Account("alice"); + env.memoize(alice); + + // confirm env + auto const preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(0)); + + // import tx + auto const xpopJson = loadXpop(ImportTCAccountSet::min); + Json::Value tx = import(alice, xpopJson); + tx[jss::Sequence] = 0; + tx[jss::Fee] = 0; + env(tx, alice, ter(tesSUCCESS)); + env.close(); + + // total burn = burn drops + reward amount + auto const totalBurn = drops(10) + XRP(20); + + // confirm fee was minted + auto const postAlice = env.balance(alice); + BEAST_EXPECT(postAlice == preAlice + totalBurn); + + // confirm total coins header + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == preCoins + totalBurn); + + // confirm account exists + auto const [acct, acctSle] = + accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT(acctSle != nullptr); + env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); + } + + // w/ seed -> dne (max) + { + test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + + auto const feeDrops = env.current()->fees().base; + + // confirm total coins header + auto const initCoins = env.current()->info().drops; + BEAST_EXPECT(initCoins == 100'000'000'000'000'000); + + // burn 99'999'998'000 xrp + auto const master = Account("masterpassphrase"); + env(noop(master), fee(99'999'998'000'000'000), ter(tesSUCCESS)); + env.close(); + + // confirm total coins header + auto const preCoins = env.current()->info().drops; + BEAST_EXPECT(preCoins == initCoins - 99'999'998'000'000'000); + + // init env + auto const alice = Account("alice"); + env.memoize(alice); + + // confirm env + auto const preAlice = env.balance(alice); + BEAST_EXPECT(preAlice == XRP(0)); + + // import tx + auto const xpopJson = loadXpop(ImportTCAccountSet::max); + Json::Value tx = import(alice, xpopJson); + tx[jss::Sequence] = 0; + tx[jss::Fee] = 0; + env(tx, alice, ter(tesSUCCESS)); + env.close(); + + // total burn = burn drops + reward amount + auto const totalBurn = drops(99'999'939'799'000'000) + XRP(2); + + // confirm fee was minted + auto const postAlice = env.balance(alice); + BEAST_EXPECT(postAlice == preAlice + totalBurn); + + // confirm total coins header + auto const postCoins = env.current()->info().drops; + BEAST_EXPECT(postCoins == preCoins + totalBurn); + + // confirm account exists + auto const [acct, acctSle] = + accountKeyAndSle(*env.current(), alice); + BEAST_EXPECT(acctSle != nullptr); + env(noop(alice), fee(feeDrops), ter(tesSUCCESS)); + } } std::unique_ptr @@ -4529,13 +4929,15 @@ class Import_test : public beast::unit_test::suite Json::Reader reader; reader.parse(ImportTCHalving::base_genesis, jsonValue); - foreachFeature(features, [&](uint256 const& feature) { + foreachFeature(features, [&](uint256 const& feature) { std::string featureName = featureToName(feature); - std::optional featureHash = getRegisteredFeature(featureName); + std::optional featureHash = + getRegisteredFeature(featureName); if (featureHash.has_value()) { std::string hashString = to_string(featureHash.value()); - jsonValue["ledger"]["accountState"][1]["Amendments"].append(hashString); + jsonValue["ledger"]["accountState"][1]["Amendments"].append( + hashString); } }); @@ -4550,8 +4952,8 @@ class Import_test : public beast::unit_test::suite Section config; config.append( {"reference_fee = " + fee, - "account_reserve = " + a_res, - "owner_reserve = " + o_res}); + "account_reserve = " + a_res, + "owner_reserve = " + o_res}); auto setup = setup_FeeVote(config); cfg->FEES = setup; @@ -4587,22 +4989,13 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 1999998 - ), - features - }; + features, 21337, "10", "1000000", "200000", 1999998), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 1'999'999); // init env @@ -4638,23 +5031,14 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 1999998 - ), - features - }; + features, 21337, "10", "1000000", "200000", 1999998), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); env.close(); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 2'000'000); // init env @@ -4690,24 +5074,15 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 1999998 - ), - features - }; + features, 21337, "10", "1000000", "200000", 1999998), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); env.close(); env.close(); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 2'000'001); // init env @@ -4743,22 +5118,13 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 4999999 - ), - features - }; + features, 21337, "10", "1000000", "200000", 4999999), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 5'000'000); // init env @@ -4794,22 +5160,13 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 19999999 - ), - features - }; + features, 21337, "10", "1000000", "200000", 19999999), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 20'000'000); // init env @@ -4845,22 +5202,13 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 29999998 - ), - features - }; + features, 21337, "10", "1000000", "200000", 29999998), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 29'999'999); // init env @@ -4896,23 +5244,14 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 29999998 - ), - features - }; + features, 21337, "10", "1000000", "200000", 29999998), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); env.close(); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 30'000'000); // init env @@ -4948,22 +5287,13 @@ class Import_test : public beast::unit_test::suite test::jtx::Env env{ *this, makeGenesisConfig( - features, - 21337, - "10", - "1000000", - "200000", - 50000000 - ), - features - }; + features, 21337, "10", "1000000", "200000", 50000000), + features}; - auto const feeDrops = env.current()->fees().base; - // confirm total coins header - auto initCoins = env.current()->info().drops; + auto const initCoins = env.current()->info().drops; BEAST_EXPECT(initCoins == 0); - auto initSeq = env.current()->info().seq; + auto const initSeq = env.current()->info().seq; BEAST_EXPECT(initSeq == 50'000'001); // init env @@ -5024,6 +5354,8 @@ class Import_test : public beast::unit_test::suite testSetRegularKey(features); testSetRegularKeyFlags(features); testSignersListSet(features); + testAccountCount(features); + testHookIssuer(features); testImportSequence(features); testMaxSupply(features); testMinMax(features);