diff --git a/.clang-format b/.clang-format index 043b98792b..abb99d417b 100644 --- a/.clang-format +++ b/.clang-format @@ -94,6 +94,7 @@ PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Left +QualifierAlignment: Right ReflowComments: true SortIncludes: true SortUsingDeclarations: true diff --git a/.claude/skills/adding-a-new-skill/SKILL.md b/.claude/skills/adding-a-new-skill/SKILL.md new file mode 100644 index 0000000000..c9e38c8fd9 --- /dev/null +++ b/.claude/skills/adding-a-new-skill/SKILL.md @@ -0,0 +1,64 @@ +--- +name: adding-a-skill +description: extending yourself with a new reusable skill by interviewing the user +--- + +If the user wants to add a new skill, you can help them with this: + +1. Ask the user for a short name and description of the skill. The name should be + something that can be rendered as a short (10-30 character) descriptive sequence + of words separated by hyphens. The description should be a line of text that is + focused on conveying to a future agent when the skill would be appropriate to + use and roughly what it does. + +2. Ask the user for details. You can build up an idea of what the skill should do + over multiple rounds of questioning. You want to find out: + + - If the skill should involve any key thoughts or considerations. + - If the skill has an order of steps, or is an unordered set of tasks. + - If the skill involves running sub-agents and if so how many. + - **If the skill involves a lot of work** that might benefit from splitting + into subagent tasks (see below for considerations). + - If the skill should include commands to run. + - If the skill should include code to write. + - If for code or commands to there is specific text or more of a + sketch or template of text _like_ some example to include. + - Any hard rules that an agent doing the skill should ALWAYS or NEVER do. + - A set of conditions for stopping, looping/extending, or resetting/restarting. + - How the result of applying the skill should be conveyed to the user. + + **Subagent considerations** + + Skills that involve a lot of work may benefit from splitting into pieces and + running each piece as a subagent. This keeps each subagent focused on a + moderate amount of work so it doesn't get lost or wander off track. If the + skill might use subagents, identify: + + - How the work could be split into moderate-sized pieces + - What information each subagent needs to do its piece + - The skill file should have an "Inputs" section listing what's needed + - The skill should suggest a format for the subagent prompt + +3. Once you have learned this information from the user, assemble it into a + file in the repository. Add a file named `.claude/skills//SKILL.md` + with the following structure: + + - YAML frontmatter with the fields `name` and `description` drawn from + the name and description. + - An introductory paragraph or two describing the goal of the skill and + any thoughts or special considerations to perform, as well as any + description of the meta-parameters like how to split work among subagents + and how to stop/loop/restart. If the skill involves a lot of work, + suggest how it might be split into moderate-sized subagent tasks. + - **If the skill might use subagents**: An "Inputs" section that lists + what information is needed for each piece, and suggests a format for the + subagent prompt. This section comes right after the overview. + - Either a sequential list of steps or an unordered list of tasks. + - Any code or commands in either specific or example form. + - Any of the ALWAYS/NEVER conditions. + - A "Completion" section describing how to summarize the work, noting that + if invoked as a subagent, the summary should be passed back to the + invoking agent. + +When you're done, save that file and then present the user with a link to it +so they can open it and review it. \ No newline at end of file diff --git a/.claude/skills/adding-tests/SKILL.md b/.claude/skills/adding-tests/SKILL.md new file mode 100644 index 0000000000..44d3fd2647 --- /dev/null +++ b/.claude/skills/adding-tests/SKILL.md @@ -0,0 +1,215 @@ +--- +name: adding-tests +description: analyzing a change to determine what tests are needed and adding them to the test suite +--- + +# Overview + +This skill is for analyzing a code change and adding appropriate test coverage. +It covers both unit tests and randomized/fuzz tests, ensuring that new +functionality is tested and bug fixes include regression tests. + +This skill involves a fair amount of work. Consider splitting it into pieces and +running each piece as a subagent (e.g., one for analyzing test needs, one for +writing unit tests, one for randomized tests). Keep each subagent focused on a +moderate amount of work so it doesn't get lost or wander off track. + +The output is either confirmation that tests were added (with details), or +confirmation that no additional tests are needed. + +# Inputs + +Before starting the analysis, gather the following information (if running as a +subagent, the invoking agent should provide these; otherwise, determine them +yourself or ask the user): + +1. **Git range**: The git command to get the diff (e.g., `git diff master...HEAD`). + +2. **Type of change**: Is this a new feature, bug fix, refactor, or performance + change? + +3. **Bug/issue reference** (if applicable): For bug fixes, the issue number or + description of what was broken. + +4. **Specific test requirements** (optional): Any specific testing requirements + the user has mentioned. + +If invoking as a subagent, the prompt should include: "Analyze and add tests +for: . Get the diff using ``. " + +# Analyzing Test Needs + +## Step 1: Understand the Change + +Get the diff using the command provided by the invoking agent: + +Categorize the change: +- **New feature**: Adding new functionality +- **Bug fix**: Correcting incorrect behavior +- **Refactor**: Changing implementation without changing behavior +- **Performance**: Optimizing existing code + +## Step 2: Find Existing Tests + +Locate tests related to the changed code: + +1. Look for test files with similar names (e.g., `Foo.cpp` → `FooTests.cpp`) +2. Search for tests that reference the modified functions/classes +3. Check if there are integration tests that exercise this code path + +```bash +# Find test files +find src -name "*Tests.cpp" | xargs grep -l "FunctionName" +``` + +## Step 3: Determine What Tests Are Needed + +### For New Features + +- Unit tests for each new public function/method +- Tests for expected behavior with valid inputs +- Tests for edge cases (empty input, max values, etc.) +- Tests for error handling with invalid inputs +- Integration tests if the feature involves multiple components + +### For Bug Fixes + +- A regression test that would have failed before the fix +- The test should exercise the exact condition that caused the bug +- Include a comment referencing the issue/bug number if available + +### For Refactors + +- Existing tests should still pass (no new tests typically needed) +- If existing test coverage is inadequate, add tests before refactoring + +### For Performance Changes + +- Ensure functional tests still pass +- Consider adding benchmark tests if appropriate +- Consider adding metrics or tracy ZoneScoped annotations to help + quantify performance +- Consider adding a `LogSlowExecution` wrapper that will flag any + long-running units of work on the IO service + +### Some Special Cases + +- Write fee bump tests to go along with any new regular transaction tests or any + logic changes to transaction processing and application. + +## Step 4: Check for Randomized Test Needs + +For changes affecting: +- Transaction processing +- Consensus/SCP +- Ledger state management +- Serialization/deserialization +- Any protocol-critical code + +Consider whether randomized testing is appropriate: +- Fuzz targets for parsing/deserialization +- Property-based tests for invariants +- Simulation tests for distributed behavior + +# Writing Tests + +## Unit Test Patterns + +Find existing tests in the same area and follow their patterns. Common patterns +in this codebase: + +1. **Test fixture setup**: Look for how test fixtures are created +2. **Assertion style**: Match the assertion macros used elsewhere +3. **Test naming**: Follow the naming convention of nearby tests +4. **Helper functions**: Reuse existing test helpers rather than creating new ones +5. **Test Strictness**: Ensure tests are strict and fail on any unexpected behavior, + check: + - [ ] Do my tests have timeouts? (no infinite hangs) + - [ ] Do my tests assert on failure? (no silent failures or early returns) + - [ ] Am I using logging where I should use assert/panic? + +## Test File Organization + +- Tests typically live in `src/` alongside the code they test, in a `test/` + subdirectory. +- Test files are usually named `*Tests.cpp` +- There are often "test utility" helper files named `*TestUtils.cpp` +- Tests are organized into test suites by component +- There are also some general testing utility files in `src/test` +- The unit test framework is "Catch2", a common C++ framework. + +## Adding a Unit Test + +1. Find the appropriate test file (or create one following conventions) +2. Add the test case following existing patterns +3. Ensure the test is self-contained and doesn't depend on external state +4. Run the new test in isolation to verify it works + +## Adding a Fuzz Target + +If adding a fuzz target: + +1. Check existing fuzz targets in the codebase for patterns +2. Create a target that exercises the specific code path +3. Ensure the target can handle arbitrary input without crashing (except for + intentional assertion failures) +4. Document what the fuzz target is testing + +# Output Format + +Report what was done: + +``` +## Tests Added + +### Unit Tests + +1. **src/ledger/LedgerManagerTests.cpp**: `processEmptyTransaction` + - Tests that empty transactions are rejected with appropriate error + - Regression test for issue #1234 + +2. **src/ledger/LedgerManagerTests.cpp**: `processTransactionWithMaxOps` + - Tests boundary condition at maximum operation count + +### Randomized Tests + +1. **src/fuzz/FuzzTransactionFrame.cpp**: Extended to cover new transaction type + - Added generation of the new transaction variant + +## No Additional Tests Needed + +[If applicable, explain why existing coverage is sufficient] +``` + +# ALWAYS + +- ALWAYS find and follow existing test patterns in the same area +- ALWAYS include regression tests for bug fixes +- ALWAYS test both success and failure paths +- ALWAYS test edge cases and boundary conditions +- ALWAYS run new tests to verify they pass +- ALWAYS run new tests with the bug still present (if a regression test) to verify they would have caught it +- ALWAYS reuse existing test helpers and fixtures +- ALWAYS keep tests focused and independent + +# NEVER + +- NEVER add tests that depend on external state or ordering +- NEVER add tests that are flaky or timing-dependent +- NEVER duplicate existing test coverage +- NEVER write tests that test implementation details rather than behavior +- NEVER add tests without running them +- NEVER skip randomized test consideration for protocol-critical code +- NEVER create new test helpers when suitable ones exist + +# Completion + +Summarize your work as follows: + +1. Summary of tests added (count and type) +2. Details of each test added +3. Confirmation that new tests pass +4. Any notes about test coverage that might still be lacking + +If invoked as a subagent, pass this summary back to the invoking agent. diff --git a/.claude/skills/configuring-the-build/SKILL.md b/.claude/skills/configuring-the-build/SKILL.md new file mode 100644 index 0000000000..13dec62ae2 --- /dev/null +++ b/.claude/skills/configuring-the-build/SKILL.md @@ -0,0 +1,70 @@ +--- +name: configuring-the-build +description: modifying build configuration to enable/disable variants, switch compilers or flags, or otherwise prepare for a build +--- + +# Overview + +The build works like this: + - We start by running `./autogen.sh` + - `autogen.sh` runs `autoconf` to turn `configure.ac` into `configure` + - `autogen.sh` also runs `automake` to turn `Makefile.am` into `Makefile.in` and `src/Makefile.am` into `src/Makefile.in` + - We then run `./configure` + - `configure` turns `Makefile.in` into `Makefile` and `src/Makefile.in` into `src/Makefile` + - `configure` also turns `config.h.in` into `config.h` that contains some variables + - `configure` also writes `config.log`, if there are errors they will be there + +- ALWAYS run `./autogen.sh` and `./configure` from top-level, never a subdirectory +- ALWAYS configure with `--enable-ccache` for caching +- ALWAYS configure with `--enable-sdfprefs` to inhibit noisy build output +- NEVER edit `configure` directly, only ever edit `configure.ac` +- NEVER edit `Makefile` or `Makefile.in` directly, only ever edit `Makefile.am` + +To change configuration settings, re-run `./configure` with new flags. + +You can see the existing configuration flags by looking at the head of `config.log` + +## Configuration variables + +To change compiler from clang to gcc, switch the value you pass for CC and CXX. +For example run `CXX=g++ CC=gcc ./configure ...` to configure with gcc. We want +builds to always work with gcc _and_ clang. + +To alter compile flags (say turn on or off optimization, or debuginfo) change +CXXFLAGS. For example run `CXXFLAGS='-O0 -g' ./configure ...` to build +non-optimized and with debuginfo. Normally you should not have to change these. + +Sometimes you will need to change to a different implementation of the C++ +standard library. To do this, pass `-stdlib=libc++` or `-stdlib=libstdc++` +in `CXXFLAGS` explicitly. But again, normally you don't need to do this. + +## Configuration flags + +Here are some common configuration flags you might want to change: + + - `--disable-tests` turns off `BUILD_TESTS`, which excludes unit tests and all + test-support infrastructure from core. We want this build variant to work + since it is the one we ship, but it is uncommon when doing development. + + - `--disable-postgres` turns off postgresql backend support in core, leaving + only sqlite. tests will run faster, and also this is a configuration we want + to work (we will remove postgres entirely someday). + +There are also some flags that turn on compile-time instrumentation for +different sorts of testing. Turn these on if doing specific diagnostic tests, +and/or to check for "anything breaking by accident". If you turn any on, you +will need to do a clean build -- the object files will have the wrong content. + + - `--enable-asan` turns on address sanitizer. + - `--enable-threadsanitizer` same, but for thread sanitizer. + - `--enable-memcheck` same, but for memcheck. + - `--enable-undefinedcheck` same, but for undefined-behaviour sanitizer. + - `--enable-extrachecks` turns on C++ stdlib debugging, slows things down. + - `--enable-fuzz` builds core with fuzz instrumentation, plus fuzz targets. + +There is more you can learn by reading `configure.ac` directly but the +instructions above ought to suffice for 99% of tasks. Try not to do anything +too strange with the configuration. + +When in doubt, or if things get stuck, you can always re-run `./autogen.sh` +and `./configure`. \ No newline at end of file diff --git a/.claude/skills/high-level-code-review/SKILL.md b/.claude/skills/high-level-code-review/SKILL.md new file mode 100644 index 0000000000..83f9c5acec --- /dev/null +++ b/.claude/skills/high-level-code-review/SKILL.md @@ -0,0 +1,217 @@ +--- +name: high-level-code-review +description: reviewing a change for semantic correctness, simplicity, design consistency, and completeness +--- + +# Overview + +This skill is for performing a high-level code review that requires +understanding the purpose and context of a change. Unlike low-level review +(which catches mechanical mistakes), high-level review evaluates whether the +change is correct in its intent and approach. + +This skill involves a fair amount of work. Consider splitting it into pieces and +running each piece as a subagent (e.g., one subagent per review criterion, or +one per file/component). Keep each subagent focused on a moderate amount of work +so it doesn't get lost or wander off track. + +The output is a **worklist** of issues to address, or confirmation that no +issues were found. + +# Inputs + +Before starting the review, gather the following information (if running as a +subagent, the invoking agent should provide these; otherwise, determine them +yourself or ask the user): + +1. **Goal of the change**: What is the change trying to accomplish? This could + come from an issue description, PR description, commit message, or user + explanation. This is **required** for high-level review. + +2. **Git range**: The git command to get the diff (e.g., `git diff master...HEAD`). + +3. **Any specific concerns** (optional): Areas the user wants extra attention on. + +If invoking as a subagent, the prompt should include: "Review the change for: +. Get the diff using ``. " + +# Obtaining Context + +Before reviewing, gather sufficient context: + +1. **Understand the goal**: Use the goal description provided by the invoking + agent. + +2. **Get the diff**: Use the git command provided by the invoking agent. + +3. **Build an understanding of context**. Use LSP tools to get lists of symbols + and call graphs and type hierarchies as necessary. For each modified file, + read enough of the surrounding code to understand the context (at minimum, + the entire function or class being modified). + +4. **Question your assumptions and seek absolute clarity**: Ask yourself + - Am I assuming requirements, constraints, or behavior? → ASK FIRST + - Am I guessing how something works instead of reading code/docs? → READ FIRST + +4. **Find similar patterns**: Search the codebase for similar functionality to + understand established patterns. + +# Review Criteria + +Evaluate the change against each of these criteria: + +## Correctness + +- Does the change accomplish its stated goal? +- Does it handle all the cases it claims to handle? +- Are the algorithms and logic correct? +- Are boundary conditions handled properly? +- Is arithmetic correct (especially with different integer types)? + +## Completeness + +- Are there edge cases not handled? +- Are error paths handled appropriately? +- If adding a feature, is it fully implemented or partially? +- Are there blocks of code missing with "TODO" or "FIXME" or + "later" or "for now" or "the real version will do..." +- Are all code paths tested or testable? +- Is there sufficient debug logging? +- If you see TransactionFrame being touched, always check if + FeeBumpTransactionFrame support was also added. + +## Performance + +- Are any algorithms of a higher complexity class than they should be? For + example, are there quadratic algorithms where there should be linear or linear + where there should be logarithmic or constant? +- Are appropriate types of containers being used in all cases? +- Are large data structures copied unnecessarily? +- Are copy constructors used where move constructors might work (without + making the logic hard to read)? +- Are any long running blocking operations running on a thread that needs to + remain responsive? For example, are there any unbounded IO operations on the + main thread? Any slow cryptography? +- If it is reasonable to have metrics, are there metrics that track the behavior + of the new code? +- If it is reasonable to have Tracy's ZoneScoped annotations for tracing, are + they present? + +## Consistency + +- Is the approach consistent with how similar things are done elsewhere in the + codebase? +- Does it follow established patterns for this type of change? +- Are naming conventions followed? +- Is the code organization consistent with surrounding code? +- Are new/modified interfaces used correctly everywhere? + +## Safety + +- Could the change have unintended side effects? +- Are invariants maintained? +- Is thread safety preserved (if applicable)? +- Is there any new risk of data inconsistency? +- Is there any new risk of non-determinism? is the global deterministic + pseudo-random number generator used consistently anywhere where + pseudo-non-determinism is desired? +- Are any containers unordered when they should be ordered, or vice versa? +- If there are unanticipated errors, does the code fail safely? +- Are resources properly managed (no leaks, no use-after-free)? +- Is input validation sufficient? +- Will the program recover safely from a crash, or can data be corrupted or lost? +- What forms of partial failure are possible, and are they handled safely? +- Are state changes made atomically and consistently? + +## Error Handling + +- Are errors detected and reported appropriately? +- Are error messages clear and actionable? +- Is error recovery handled correctly? +- Are exceptions used appropriately (if at all)? + +## Minimality + +- Is the change minimal, or does it include unnecessary modifications? +- Are there changes that should be split into separate commits/PRs? +- Is there dead code or debugging code that should be removed? +- Does the change add files it doesn't need to add? +- Does it add classes or functions that it doesn't need to add? +- Is anything duplicated that shouldn't be duplicated? +- Does it add unnecessary wrappers or layers of indirection? +- Does it add unnecessary backwards compatibility code? + +## Documentation + +- Are complex algorithms or non-obvious code explained in comments? +- Are public APIs documented? +- Do comments accurately reflect what the code does? +- Are the comments too verbose? Do they detract from clarity? +- Are any documentation files (README, docs/ etc.) updated if needed? + +# Output Format + +Produce a structured report as output. For each issue found: + +1. **File path** and **line number(s)** +2. **Category** (from the criteria above) +3. **Severity**: Critical / Major / Minor / Suggestion +4. **Description** of the issue +5. **Recommendation** for how to address it + +Example format: + +``` +## Issues Found + +### src/ledger/LedgerManager.cpp:142-150 — Completeness (Major) +**Issue:** The new `processTransaction` path does not handle the case where +the transaction has no operations. +**Recommendation:** Add a check for empty operations and return an appropriate +error code, similar to how `processPayment` handles this at line 89. + +### src/ledger/LedgerManager.cpp:200 — Consistency (Minor) +**Issue:** Variable named `txResult` but similar variables elsewhere use +`transactionResult`. +**Recommendation:** Rename to `transactionResult` for consistency. +``` + +If no issues are found: + +``` +## No Issues Found + +The change appears correct and complete. Observations: +- [Any positive observations or notes for the record] +``` + +# ALWAYS + +- ALWAYS understand the stated goal before reviewing +- ALWAYS read enough context to understand what the code is doing +- ALWAYS check for similar patterns in the codebase before flagging inconsistency +- ALWAYS distinguish between "definitely wrong" and "could be improved" +- ALWAYS provide specific, actionable recommendations +- ALWAYS cite file and line numbers +- ALWAYS consider whether apparent issues might be intentional +- ALWAYS prioritize correctness issues over style issues + +# NEVER + +- NEVER review without understanding what the change is trying to do +- NEVER flag style issues that are consistent with surrounding code +- NEVER suggest refactoring unrelated code +- NEVER recommend changes outside the scope of the current work +- NEVER assume something is wrong just because you would do it differently +- NEVER report issues without a concrete recommendation +- NEVER conflate personal preference with objective problems + +# Completion + +Summarize your work as follows: + +1. Summary: number of issues by severity +2. The detailed issue list (or confirmation of no issues) +3. Overall assessment: Ready to proceed / Needs attention / Major concerns + +If invoked as a subagent, pass this summary back to the invoking agent. diff --git a/.claude/skills/low-level-code-review/SKILL.md b/.claude/skills/low-level-code-review/SKILL.md new file mode 100644 index 0000000000..1cadaeab6c --- /dev/null +++ b/.claude/skills/low-level-code-review/SKILL.md @@ -0,0 +1,179 @@ +--- +name: low-level-code-review +description: reviewing a git diff for small localized coding mistakes that can be fixed without high-level understanding +--- + +# Overview + +This skill is for performing a low-level code review on a git diff, looking for +small, localized coding mistakes that can be identified and fixed without any +high-level understanding of the codebase. These are the kinds of mistakes that +could occur in any codebase, in any language, and are purely mechanical in +nature. + +For larger diffs, consider splitting the review into pieces and running each +piece as a subagent (e.g., one subagent per file or directory). Keep each +subagent focused on a moderate amount of work so it doesn't get lost or wander +off track. + +The output is a **worklist** of issues to fix. + +# Inputs + +Before starting the review, gather the following information (if running as a +subagent, the invoking agent should provide these; otherwise, determine them +yourself or ask the user): + +1. **Git range**: Determine which diff to review: + - Check if there are uncommitted changes (`git diff` and `git diff --cached`) + - If no uncommitted changes, check if current branch differs from `master` + - If neither applies, ask the user for a specific git range + +2. **Context about the change** (optional but helpful): A brief description of + what the change is intended to do, if known. + +If invoking as a subagent, the prompt should include: "Review the diff from +``. " + +# Obtaining the Diff + +Run the git diff command provided by the invoking agent to obtain the diff, +then analyze it. + +# Issues to Look For + +Focus only on issues that are clearly mistakes and can be fixed with confidence. +Do not flag anything that requires understanding the broader system design. + +## Definite Bugs + +- **Numeric overflow/underflow**: Operations on integer types that could exceed + their bounds (e.g., adding two `uint32_t` values near max). +- **Off-by-one errors**: Loop bounds, array indices, range calculations. +- **Null/nullptr dereference risk**: Dereferencing a pointer without checking if + it could be null, especially after operations that might return null. +- **Uninitialized variables**: Variables used before being assigned a value. +- **Resource leaks**: Memory, file handles, or other resources acquired but not + released on all code paths. +- **Use-after-free/move**: Using a resource after it has been freed or moved. +- **Double-free**: Freeing or deleting a resource twice. +- **Boolean logic errors**: Wrong operator precedence, De Morgan's law mistakes, + inverted conditions. +- **String formatting mismatches**: Format specifier doesn't match argument type + (e.g., `%d` for a `size_t`). + +## ACID-semantics violations (on disk) + +- Look for write-to-temp + rename patterns +- Verify temp file is fsynced before rename +- Verify directory is fsynced after rename +- Check: what happens if crash occurs between steps? +**Questions to ask:** +- If power is lost mid-operation, what state is on disk? +- Can the operation be resumed/retried after crash? +- Are there ordering dependencies between file writes? + +## ACID-semantics violations (in memory) +- Look for non-atomic state changes that could leave the system in an inconsistent state if interrupted +- Check for proper locking around shared state +- Check for proper error handling that rolls back or compensates for partial failures +**Questions to ask:** +- If an exception is thrown or an error occurs mid-operation, could the system be left in an inconsistent state? +- Are state changes made atomically, or could they be interrupted leaving partial updates? +- Are there any critical sections that lack proper locking? + +## Likely Mistakes + +- **Copy-paste errors**: Duplicated code blocks with subtle inconsistencies that + suggest a copy-paste where something wasn't updated. +- **Typos in identifiers**: Variable or function names that are almost but not + quite right (especially in new code that mirrors existing patterns). +- **Wrong variable used**: Using a similarly-named variable by mistake. +- **Missing `break` in switch**: Fall-through that appears unintentional. +- **Comparison instead of assignment** (or vice versa): `if (x = y)` vs `if (x == y)`. +- **Signed/unsigned comparison**: Comparing signed and unsigned integers in ways + that could produce unexpected results. +- **Use of raw pointers**: Use smart pointers, optionals or references. +- **Manual cleanup paths**: Use RAII guards. +- **Common C++ stdlib misuse**: Using the wrong container, algorithm, or utility + function for a task, calling container methods or constructors incorrectly, + introducing known UB, performance antipatterns, etc. + +## Style Issues (Only if Clearly Wrong) + +- **Typos in comments**: Misspelled words in comments or documentation. +- **Inconsistent naming**: New code that doesn't follow the naming pattern of + immediately surrounding code. +- **Missing `const`**: Parameters or variables that could clearly be const but + aren't. +- **Unused variables**: Variables declared but never used. +- **Unused includes**: Headers included but nothing from them appears to be used + in the changed code. +- **Dead code**: Code that can never execute (after unconditional return, etc.). +- **West const**: const should go to the right of the constant thing ("east const"). +- **Old idioms**: We are on C++20, so you should lean into features that help with + correctness and clarity when appropriate. + +# Output Format + +Produce a structured worklist as output. Each item should contain: + +1. **File path** and **line number** (from the diff) +2. **Issue type** (from the categories above) +3. **Original code** (the exact problematic code) +4. **Suggested fix** (the specific edit to make) +5. **Brief explanation** (why this is a problem, one sentence) + +Group issues by file. Example format: + +``` +## src/foo/Bar.cpp + +### Line 142: Numeric overflow risk +**Original:** `uint32_t total = count1 + count2;` +**Fix:** `uint64_t total = static_cast(count1) + count2;` +**Why:** Both operands are uint32_t and their sum could exceed UINT32_MAX. + +### Line 287: Typo in comment +**Original:** `// Calcualte the checksum` +**Fix:** `// Calculate the checksum` +**Why:** Misspelled "Calculate". +``` + +# ALWAYS + +- ALWAYS cite the exact line number from the diff +- ALWAYS quote the original code exactly as it appears +- ALWAYS provide a specific, concrete fix (not just "fix this") +- ALWAYS explain why it's a problem in one sentence +- ALWAYS focus only on changed lines in the diff (lines starting with `+`) +- ALWAYS group issues by file for easier processing +- ALWAYS consider whether an issue might be intentional before reporting +- ALWAYS prioritize potential runtime errors over style issues +- ALWAYS check if a correctness condition is actually checked earlier in the same function before reporting +- ALWAYS verify the issue exists in the new code, not just the removed code + +# NEVER + +- NEVER change logic or behavior beyond the minimal fix required +- NEVER suggest refactoring, redesign, or architectural changes +- NEVER flag issues that require understanding the broader codebase or system design +- NEVER report style preferences that aren't clearly inconsistent with surrounding code +- NEVER suggest changes to lines that weren't modified in the diff +- NEVER make assumptions about programmer intent for ambiguous cases +- NEVER report the same mechanical issue more than 3 times; instead note "and N similar occurrences in this file" +- NEVER flag intentional patterns (e.g., don't flag `if (auto* p = getPtr())` as "assignment in condition") +- NEVER report issues in test code that are clearly intentional (e.g., testing error paths) +- NEVER spend time on issues that a compiler warning would catch (assume the build has warnings enabled) + +# Completion + +Summarize your work as follows: + +- Present the worklist of issues found +- If no issues were found, report that explicitly: "No low-level issues found in + the diff." +- If the diff is very large (more than ~500 lines of additions), suggest + splitting the review by file or directory to ensure thoroughness. + +If invoked as a subagent, pass this summary back to the invoking agent. diff --git a/.claude/skills/running-make-to-build/SKILL.md b/.claude/skills/running-make-to-build/SKILL.md new file mode 100644 index 0000000000..8c85dcb1e2 --- /dev/null +++ b/.claude/skills/running-make-to-build/SKILL.md @@ -0,0 +1,64 @@ +--- +name: running-make-to-build +description: how to run make correctly to get a good build, and otherwise understand the build system +--- + +# Overview + +The build is a recursive make structure, with several projects vendored in to +`lib` that use their own Makefiles and also one primary `src/Makefile.am` that +defines most of the build. + +- ALWAYS run `make -j $(nproc)` to get full parallelism +- ALWAYS run from the top level directory +- ALWAYS run with `2>&1 | tail -N` to limit output +- ALWAYS run `git add && ./make-mks` after adding `` to + ensure it is included in the build. +- NEVER run from a subdirectory +- NEVER run with `make -C ` for any other directory +- NEVER run `cargo` manually, let `make` run it +- NEVER edit `Makefile` or `Makefile.in`, only ever edit `Makefile.am` + +## Targets + +The main targets are: + + - `all` -- the implicit target, builds `src/stellar-core` + - `check` -- builds `all` then runs unit and integration tests + - `clean` -- removes build artifacts + - `format` -- auto-formats source code with standard rules + +If anything goes wrong or is confusing in the build, start by running `make +clean` and trying again. You should have configured with `--enable-ccache` which +means that rebuilding will typically be very cheap. Especially if you run with +`make -j $(nproc)` + +## Rust build + +The `src/Makefile.am` also delegates to `cargo` to build the rust components +of stellar-core in `src/rust` as well as all the submodules in `src/rust/soroban`. +The integration is quite subtle. You should always let `src/Makefile.am` handle +invoking `cargo`. + +## Generated files + +Several source files are generated. All .x files in `src/protocol-{curr,next}` +are turned into .cpp and .h files by the `xdrpp` code-generator in `lib/xdrpp`. + +Parts of the XDR query system in `src/util/xdrquery` are built by `flex` and +`bison`. + +Files like `src/main/StellarCoreVersion.cpp` bake the current version +information into a string constant in stellar-core. + +And finally the rust bridge `src/rust/RustBridge.{cpp,h}` is generated by the +`cxxbridge` tool from `src/rust/bridge.rs`. + +## Editing the makefiles + +Most of the time you won't need to edit `Makefile.am` or `src/Makefile.am` at all. + +Files included in the build are driven by the script `./make-mks` which +lists files tracked by git and defines makefile variables based on them. +As soon as you add a .cpp or .h file to git and re-run `./make-mks` +it will be added to the build. diff --git a/.claude/skills/running-tests/SKILL.md b/.claude/skills/running-tests/SKILL.md new file mode 100644 index 0000000000..c62bf6da5c --- /dev/null +++ b/.claude/skills/running-tests/SKILL.md @@ -0,0 +1,385 @@ +--- +name: running-tests +description: running tests at various levels from smoke tests to full suite to randomized tests +--- + +# Overview + +This skill is for running tests systematically, starting with fast/focused tests +and progressing to slower/broader tests. This ordering allows failures to be +caught early, minimizing wasted time. + +This skill is designed to be run as a **subagent** to avoid cluttering the +invoking agent's context. The output is either confirmation that all tests +passed, or a report of failures. + +# Required Inputs (Before Launching Subagent) + +Since subagents cannot ask for clarification, the **invoking agent must gather +this information before launching**: + +1. **Changed files/modules**: Which files or modules were changed, so the + subagent can identify appropriate smoke tests and focused tests. + +2. **Test levels to run**: Which levels to execute. Options: + - "smoke only" - just Level 1 + - "through focused" - Levels 1-2 + - "through full suite" - Levels 1-3 (usually sufficient for small changes) + - "through full suite with tx-meta" - Levels 1-3 plus tx-meta baseline check + - "through sanitizers" - Levels 1-4 (for memory/concurrency-sensitive code) + +The subagent prompt should include: "Run tests for changes in ." + +# Test Output Control + +To reduce noise and keep agent context manageable, always use these flags: + +```bash +# Recommended flags for quiet output +--ll fatal # Only log fatal errors (not info/debug messages) +-r simple # Use simple reporter (minimal output) +--disable-dots # Don't print progress dots +--abort # Stop on first failure (don't run remaining tests) +``` + +Example: +```bash +./stellar-core test --ll fatal -r simple --disable-dots --abort "test name" +``` + +Note that if you ever do need information about a test when trying to diagnose +what went wrong with it, you might want to turn the log level up from fatal to +info, debug or even trace, using `--ll debug` or `--ll trace` for example. + +# Protocol Versions + +Many tests are protocol-specific and can behave differently across protocol +versions. Use these flags to control which protocol versions are tested: + +```bash +--version # Run tests for a specific protocol version +--all-versions # Run tests for all supported protocol versions +``` + +For focused testing during development, test with the current protocol version, +which is the default. The full test suite should eventually be run with +`--all-versions`. + +# Deterministic Random Number Generator + +Tests use a deterministic PRNG. By default, the seed varies, but you can set +a specific seed for reproducibility: + +```bash +--rng-seed # Use a specific RNG seed for reproducibility +``` + +This is useful for reproducing failures or for baseline checks that require +consistent output. + +# Test Levels + +Tests are run in order of increasing cost. Stop at the first failure. + +## Level 1: Smoke Tests + +Run 2-3 specific tests that are most likely to catch breakage in the changed +code. These should complete in seconds. + +To identify smoke tests: +1. Find tests in the same file/module as the changed code +2. Pick tests that directly exercise the modified functions +3. Prefer fast tests over slow ones + +```bash +# Run a specific test by name (use quotes for exact match) +./stellar-core test --ll fatal -r simple --abort "exact test name" +``` + +## Level 2: Focused Unit Tests + +Run all tests in the test file(s) related to the change. This typically takes +a few minutes. + +```bash +# Run tests matching a tag pattern +./stellar-core test --ll fatal -r simple --abort "[ModuleName*]" + +# Run tests from a specific area +./stellar-core test --ll fatal -r simple --abort "[ledgertxn]" + +# Combine tags (AND logic - must match all) +./stellar-core test --ll fatal -r simple --abort "[tx][soroban]" +``` + +### Example Test Names by Area + +**Ledger/Transaction tests:** +- `"[ledgertxn]"` - LedgerTxn operations +- `"[tx][payment]"` - Payment transaction tests +- `"[tx][createaccount]"` - CreateAccount tests +- `"[tx][offers]"` - Offer/DEX tests +- `"[tx][soroban]"` - Soroban (smart contract) transaction tests + +**Bucket/BucketList tests:** +- `"[bucket]"` - General bucket tests +- `"[bucketlist]"` - BucketList specific tests +- `"[bucketmergemap]"` - Bucket merge map tests + +**Herder tests:** +- `"[herder]"` - General herder tests +- `"[txset]"` - Transaction set tests +- `"[transactionqueue]"` - Transaction queue tests +- `"[quorumintersection]"` - Quorum intersection tests +- `"[upgrades]"` - Protocol upgrade tests + +**Overlay/Network tests:** +- `"[overlay]"` - Overlay network tests +- `"[flood]"` - Transaction flooding tests +- `"[PeerManager]"` - Peer management tests + +**Crypto/Utility tests:** +- `"[crypto]"` - Cryptography tests +- `"[decoder]"` - Base32/64 encoding tests +- `"[timer]"` - VirtualClock timer tests +- `"[cache]"` - Cache implementation tests + +**Soroban-specific tests:** +- `"[soroban]"` - All Soroban tests +- `"[soroban][archival]"` - State archival tests +- `"[soroban][upgrades]"` - Soroban upgrade tests + +## Level 3: Full Unit Test Suite + +Run the complete unit test suite. This may take 10-30 minutes. + +### Basic Execution + +```bash +make check +``` + +Or directly with quiet output: + +```bash +./stellar-core test --ll fatal -r simple --disable-dots --abort +``` + +### Parallel Execution (faster) + +For faster execution, use parallel partitions via `make check`: + +```bash +# Run with partitions equal to CPU cores +NUM_PARTITIONS=$(nproc) make check +``` + +### Full Protocol Coverage + +The full test suite should be run with all protocol versions: + +```bash +ALL_VERSIONS=1 NUM_PARTITIONS=$(nproc) make check +``` + +### SQLite-Only Testing (No Postgres) + +To test with SQLite only (faster, no Postgres dependency): + +```bash +./configure --disable-postgres --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +NUM_PARTITIONS=$(nproc) make check +``` + +## Level 3b: Transaction Metadata Baseline Check + +This validates that transaction test execution produces the same metadata hashes +as fixed baselines stored in the repository. This catches unintended changes to +transaction semantics. + +**Important**: Always use `--rng-seed 12345` for baseline checks to ensure +deterministic results. + +```bash +# Check transaction tests against current protocol baseline +./stellar-core test "[tx]" --all-versions --rng-seed 12345 --ll fatal \ + --abort -r simple --check-test-tx-meta test-tx-meta-baseline-current +``` + +For next-protocol testing (when preparing protocol upgrades): + +```bash +./stellar-core test "[tx]" --all-versions --rng-seed 12345 --ll fatal \ + --abort -r simple --check-test-tx-meta test-tx-meta-baseline-next +``` + +If baselines need updating after intentional changes, the test will fail and +indicate which baselines differ. + +## Level 4: Sanitizer Tests + +**When to run**: Only needed for changes touching memory management, pointers, +concurrency, or threading code. Skip for simple logic changes, config changes, +or test-only changes. + +Run tests with sanitizers enabled to catch memory errors and undefined behavior. +This requires reconfiguring and rebuilding. + +### Address Sanitizer (ASan) + +Catches memory errors: buffer overflows, use-after-free, memory leaks. + +```bash +./configure --enable-asan --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +./stellar-core test --ll fatal -r simple --disable-dots --abort +``` + +### Thread Sanitizer (TSan) + +Catches data races and threading issues. + +```bash +./configure --enable-threadsanitizer --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +./stellar-core test --ll fatal -r simple --disable-dots --abort +``` + +### Undefined Behavior Sanitizer (UBSan) + +Catches undefined behavior like integer overflow, null pointer dereference. + +```bash +./configure --enable-undefinedcheck --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +./stellar-core test --ll fatal -r simple --disable-dots --abort +``` + +## Level 5: Extra Checks Build + +**When to run**: Only for changes to core data structures or when Level 4 +sanitizers found something suspicious. Usually overkill. + +Run with C++ standard library debugging enabled. Slower but catches more issues. + +```bash +./configure --enable-extrachecks --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +./stellar-core test --ll fatal -r simple --disable-dots --abort +``` + +# Build Verification + +Before running tests at Levels 4-6, also verify the build succeeds with +`--disable-tests` (the production configuration): + +```bash +./configure --disable-tests --enable-ccache --enable-sdfprefs +make clean && make -j $(nproc) +``` + +This doesn't run tests but ensures the production build works. + +# Interpreting Failures + +When a test fails: + +1. **Identify the failing test**: Note the exact test name and file +2. **Capture the failure output**: Save the error message and stack trace +3. **Determine if it's a real failure**: Check if the test is flaky or if this + is a genuine regression +4. **Locate the relevant code**: Find where in the changed code the failure + originates + +## Common Failure Patterns + +- **Assertion failure**: A test assertion didn't hold; check the condition +- **Crash/segfault**: Memory error; run with ASan for more details +- **Timeout**: Test took too long; may indicate infinite loop or deadlock +- **Sanitizer error**: Memory or threading bug; the sanitizer output shows where + +# Output Format + +Report the results: + +``` +## Test Results: PASS + +All test levels completed successfully: +- Level 1 (Smoke): 3 tests, 2.1s +- Level 2 (Focused): 47 tests, 1m 12s +- Level 3 (Full Suite): 1,234 tests, 18m 45s +- Level 3b (TX Meta Baseline): OK + +Build verification: +- --disable-tests: OK +``` + +Or on failure: + +``` +## Test Results: FAIL + +Failed at Level 2 (Focused Unit Tests) + +**Failing test:** `LedgerManagerTests.processTransactionRejectsEmpty` +**File:** src/ledger/LedgerManagerTests.cpp:142 +**Error:** + REQUIRE( result == TRANSACTION_REJECTED ) + with expansion: + TRANSACTION_SUCCESS == TRANSACTION_REJECTED + +**Analysis:** The test expects empty transactions to be rejected, but the +new code path is allowing them through. See LedgerManager.cpp:98 where the +empty check appears to be missing. + +Levels completed before failure: +- Level 1 (Smoke): 3 tests, 2.1s ✓ +``` + +# Choosing the Right Test Level + +**For most changes** (logic fixes, new features, refactors): +- Run through Level 3 (full suite) with `--all-versions` +- Run Level 3b (tx-meta baseline) for transaction-related changes +- Skip Levels 4-5 unless the change touches memory/threading + +**For memory-sensitive changes** (pointers, allocations, C++ containers): +- Run through Level 4 (at least ASan) + +**For concurrency changes** (threading, async, locks): +- Run through Level 4 (especially TSan) + +**For test-only changes** or documentation: +- Level 1-2 is usually sufficient + +# ALWAYS + +- ALWAYS run tests in order of increasing cost +- ALWAYS stop at the first failure (use `--abort` flag) +- ALWAYS use `--ll fatal -r simple --disable-dots` for quiet output +- ALWAYS capture and report failure details +- ALWAYS run full suite with `--all-versions` before considering complete +- ALWAYS use `--rng-seed 12345` for tx-meta baseline checks +- ALWAYS report timing for each level +- ALWAYS identify the specific test and location of failures + +# NEVER + +- NEVER skip smoke tests and go straight to full suite +- NEVER continue to later levels after a failure +- NEVER report "tests failed" without specifics +- NEVER assume a test failure is flaky without evidence +- NEVER run verbose output that floods the context +- NEVER run tests without having built first +- NEVER run sanitizers (Level 4-5) for trivial changes (it's overkill) + +# Completion + +Report to the invoking agent: + +1. Overall result: PASS or FAIL +2. For PASS: Summary of all levels completed with timing +3. For FAIL: Detailed failure report with analysis +4. Any observations (slow tests, warnings, etc.) diff --git a/.claude/skills/validating-a-change/SKILL.md b/.claude/skills/validating-a-change/SKILL.md new file mode 100644 index 0000000000..af128430bd --- /dev/null +++ b/.claude/skills/validating-a-change/SKILL.md @@ -0,0 +1,164 @@ +--- +name: validating-a-change +description: comprehensive validation of a change to ensure it is correct and ready for a pull request +--- + +# Overview + +This skill is for validating that a change is correct, complete, and ready for +a pull request. It orchestrates several other skills to systematically check +formatting, review code, ensure test coverage, and run tests. + +This skill involves a lot of work. Consider splitting it into pieces and running +each step as a subagent. Keep each subagent focused on a moderate amount of work +so it doesn't get lost or wander off track. + +**Critical principle**: Each step must fully resolve its own issues before +proceeding to the next step. There is no need to restart from the beginning +when issues are found—fix them in place and continue forward. + +The ordering prioritizes: +1. Code reviews first (catches design and semantic issues early) +2. Adding any missing tests +3. Running tests +4. Multiple configurations (catches config-specific issues) +5. Formatting last (mechanical cleanup) + +# Inputs + +Before starting validation, gather the following information (if running as a +subagent, the invoking agent should provide these; otherwise, determine them +yourself or ask the user): + +1. **Goal of the change**: What is the change trying to accomplish? This is + needed for high-level code review. + +2. **Type of change**: Is this a new feature, bug fix, refactor, or performance + change? This is needed for the adding-tests step. + +3. **Bug/issue reference** (if applicable): For bug fixes, the issue number. + +4. **Any specific concerns** (optional): Areas wanting extra attention. + +If invoking as a subagent, the prompt should include: "Validate change for: +. Change type: . " + +# Prerequisites + +This skill composes several other skills: +- `low-level-code-review` - for mechanical code review +- `high-level-code-review` - for semantic code review +- `adding-tests` - for analyzing and adding test coverage +- `running-tests` - for running tests at all levels +- `running-make-to-build` - for building correctly +- `configuring-the-build` - for setting up different configurations + +# Validation Steps + +Execute these steps in order. Each step should fully resolve any issues it +finds before proceeding to the next step. + +## Step 1: High-Level Code Review + +Consider running as a subagent using the `high-level-code-review` skill. + +Before launching, determine the git range: +- If uncommitted changes exist, use `git diff` and `git diff --cached` +- Otherwise, use `git diff master...HEAD` + +Launch with prompt: "Review the change for: . Get the diff +using ``. " + +This reviews the change for semantic correctness, design consistency, and +completeness. The subagent will return a report of issues by severity. + +If any Critical or Major issues are found, run a subagent to fix them before +proceeding. Minor issues and Suggestions can be addressed or deferred at your +discretion. + +## Step 2: Low-Level Code Review + +Consider running as a subagent using the `low-level-code-review` skill. + +Launch with prompt: "Review the diff from ``" + +This reviews the diff for small, mechanical coding mistakes that don't require +high-level understanding. The subagent will return a worklist of issues. + +If any issues are found, run a subagent to fix them before proceeding. + +## Step 3: Add Tests + +Consider running as a subagent using the `adding-tests` skill. + +Launch with prompt: "Analyze and add tests for: . +Get the diff using ``. " + +This analyzes the change to determine what tests are needed and adds them. +The subagent will return a report of tests added. + +## Step 4: Run Tests + +Consider running as a subagent using the `running-tests` skill. + +Before launching, identify the changed files/modules from the diff. + +Launch with prompt: "Run tests through full suite for changes in ." + +This runs tests at levels 1-3: smoke tests, focused tests, and the full unit +test suite. The subagent will return a detailed report of results. + +If any tests fail, run a subagent to fix the issues before proceeding. + +## Step 5: Build and Test with Multiple Configurations + +Consider running as a subagent using the `running-tests` skill with extended levels. + +Launch with prompt: "Run tests through sanitizers for changes in . +Include fuzz tests if protocol-critical code was changed." + +This runs tests at levels 4-6: sanitizer builds (ASan, TSan, UBSan), extra +checks build, and randomized/fuzz tests. See the `configuring-the-build` skill +for details on configuration options. + +Also verify the build succeeds with `--disable-tests` (the production config). + +If any configuration fails to build or any tests fail, run a subagent to fix +the issues before proceeding. + +## Step 6: Format the Code + +Run `make format` to auto-format all source code and verify formatting is clean. + +# ALWAYS + +- ALWAYS consider running long-running steps as subagents to keep them focused +- ALWAYS fully resolve issues within a step before proceeding to the next step +- ALWAYS wait for each subagent to complete before proceeding +- ALWAYS run high-level review before low-level review + +# NEVER + +- NEVER run multiple subagents in parallel (they may conflict) +- NEVER skip any step, even if you think it's unnecessary +- NEVER consider validation complete until all configurations pass +- NEVER skip high-level review just because you want to get to tests faster + +# Completion + +When all steps pass without requiring any code edits, the change is validated +and ready for a pull request. Summarize your work as follows: + +1. Summary of what was validated +2. Configurations tested +3. Test coverage added (if any) +4. Any observations or minor concerns that didn't require changes + +If validation cannot be completed (e.g., stuck in a loop), report: + +1. Which step keeps failing +2. What issues keep recurring +3. Whether the fundamental approach may need reconsideration + +If invoked as a subagent, pass this summary back to the invoking agent. diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f9715efc81..7cb4c30488 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -7,11 +7,11 @@ FROM ubuntu:noble # Avoid warnings by switching to noninteractive ENV DEBIAN_FRONTEND=noninteractive -# This Dockerfile adds a non-root 'vscode' user with sudo access. However, for Linux, +# This Dockerfile adds a non-root 'dev' user with sudo access. However, for Linux, # this user's GID/UID must match your local user UID/GID to avoid permission issues # with bind mounts. Update USER_UID / USER_GID if yours is not 1000. See # https://aka.ms/vscode-remote/containers/non-root-user for details. -ARG USERNAME=vscode +ARG USERNAME=dev ARG USER_UID=1000 ARG USER_GID=$USER_UID @@ -65,14 +65,8 @@ RUN apt-get update && \ libpq-dev parallel curl ccache bear \ cpp-14 gcc-14 g++-14 libstdc++-14-dev \ clang-20 llvm-20 libc++-20-dev clang-format-20 clangd-20 libc++abi-20-dev libclang-rt-20-dev \ - postgresql - -# rust -ENV PATH "/root/.cargo/bin:$PATH" - -# clang by default -ENV CC=clang-20 -ENV CXX=clang++-20 + postgresql \ + jq ripgrep vim emacs-nox uftrace # Set up locale RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ @@ -83,6 +77,36 @@ RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ # using leading to random crashes: https://reviews.llvm.org/D148280 RUN sysctl vm.mmap_rnd_bits=28 +### Finished root-user-requiring stuff, rest is non-root-user +USER ${USERNAME} +WORKDIR /home/${USERNAME} + +# rust +ENV PATH=/home/${USERNAME}/.local/bin:/home/${USERNAME}/.cargo/bin:$PATH + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +RUN rustup component add clippy rustfmt rust-src rust-analyzer llvm-tools +RUN rustup target add wasm32-unknown-unknown wasm32v1-none + +# fuzzer support +RUN rustup toolchain install nightly +RUN rustup component add rust-src --toolchain nightly + +# rust-based packages (using binstall to get binaries when possible) +RUN cargo install --locked cargo-binstall +RUN cargo binstall -y --locked cargo-llvm-cov lcov-summary cargo-acl cargo-hack cargo-deny cargo-semver-checks cargo-fuzz sccache + +# clang by default +ENV CC=clang-20 +ENV CXX=clang++-20 + +# install namespace CLI +RUN curl -fsSL https://get.namespace.so/cloud/install.sh | sh + +# install opencode and claude code +RUN curl -fsSL https://opencode.ai/install | bash +RUN curl -fsSL https://claude.ai/install.sh | bash + ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7fd2810019..17fec4c7b5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,7 +8,7 @@ "APT_MIRROR": "${localEnv:APT_MIRROR}" } }, - "onCreateCommand": "./install-rust.sh", + "remoteUser": "dev", // The optional 'runArgs' property can be used to specify additional runtime arguments. "runArgs": [ // Uncomment these lines if you will use a ptrace-based debugger like C++, Go, and Rust. @@ -23,7 +23,7 @@ // new files getting created as root, but you may need to update the USER_UID // and USER_GID in .devcontainer/Dockerfile to match your user if not 1000. "-u", - "vscode" + "dev" ], // We previously had `features.docker-from-docker` enabled here to allow diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 5a0adb3613..0105161259 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,8 +1,68 @@ -## Additional Code Review Guidelines -Write fee bump tests to go along with any new regular transaction tests or any logic changes to transaction processing and application. +# Overview -If you see TransactionFrame being touched, always check if FeeBumpTransactionFrame support was also added, and report if changes are potentially missing. +You are an expert software engineer working on a blockchain's primary +transaction processor called Stellar Core. -Report any numeric operations that may cause overflow or underflow (e.g., adding two `uint32_t`s near their maximum value). +It is written in C++ and Rust, is open source, hosted at github at +github.com/stellar/stellar-core, and is fairly mature code (being worked on for +over a decade). There is a lot of old code and a lot of tests. There is a team +of skilled engineers working on it. The code is also live, and handling real +monetary transactions. Correctness is of paramount importance. Testing is +extensive but not perfect. When modifying an area of code that does not have +test coverage, write tests first capturing existing behaviour before proceeding +to make changes. Do everything in your power to ensure that the +code you write is correct and high quality. Write code sparingly and only when +you are _sure_ of what to do. Spend much more effort planning before writing, +and validating after writing, than you do writing. Stop and ask for help when in +doubt. There are multiple skills available to help with this task. -Report any typos in comments. +## Basic configuration, building and testing: + +ALWAYS limit noisy build output by passing `--enable-sdfprefs` to configure. +ALWAYS enable ccache by passing `--enable-ccache` to configure. +ALWAYS build with parallelism by passing `-j $(nproc)` to make. +ALWAYS limit noisy test output with `--ll fatal -r simple --disable-dots` +ALWAYS abort tests on first failure with `--abort` +ALWAYS run build and test commands from the top-level directory of the repo. +ALWAYS run build and test commands with ` 2>&1 | tail -N` to limit output. +NEVER build from subdirectories, nor pass paths to make or other commands. +NEVER run cargo manually. + +```sh +# to run autoconf (needed before configure) +$ ./autogen.sh + +# to run configure (needed before build) +$ ./configure --enable-ccache --enable-sdfprefs + +# to build (with parallelism) +$ make -j $(nproc) + +# to run a single test +$ ./src/stellar-core test --ll fatal -r simple --abort --disable-dots "TestName" + +# to run all tests with a given tag (eg. [tx], [bucket], [overlay] or [soroban]) +$ ./src/stellar-core test --ll fatal -r simple --abort --disable-dots "[tag]" + +# to run the whole testsuite (with parallelism) +$ NUM_PARTITIONS=$(nproc) STELLAR_CORE_TEST_PARAMS='--ll fatal -r simple --abort --disable-dots' make check +``` + + +## Tools, subagents and skills + +You will know if you are running "as an agent" in vscode if you have access to +the `run_in_terminal` or `create_and_run_task` tools. + +If you are an agent running in vscode then: + + 1. You should also have access to a bunch of skills in blocks in your + context. If you don't, ask the user to enable them. The setting in vscode + is `"chat.useAgentSkills": true`. + + 2. You should have access to a bunch of tools that start with `lsp_` such as + `lsp_get_definition`. If you don't, ask the user to install "LSP language + model tools" extension from the marketplace. Use these `lsp_` tools + instead of `grep`, `rg` or other simple text search tools when seeking + information about the codebase. Especially use `lsp_document_symbols` + for an overview of any given file. diff --git a/.github/workflows/build-private.yml b/.github/workflows/build-private.yml index 05af7dc4ef..18091d841a 100644 --- a/.github/workflows/build-private.yml +++ b/.github/workflows/build-private.yml @@ -62,8 +62,10 @@ jobs: - uses: actions/checkout@v4 with: + token: ${{ secrets.SUBMODULE_TOKEN }} fetch-depth: 200 submodules: true + persist-credentials: false - name: install core packages run: | sudo apt-get update diff --git a/.gitignore b/.gitignore index 4ceeefe9bc..ca644aa080 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.lib *.user *.xdr +!test-lcm/**/*.xdr *.cache *.tlog *.lastbuildstate @@ -42,12 +43,15 @@ compile_commands.json .deps .dirstamp +/AUTHORS /INSTALL +/ChangeLog /src/archtmp-* /src/main/StellarCoreVersion.cpp /src/main/XDRFilesSha256.cpp /src/rust/soroban/tmp +/src/rust/.soroban-revs /src/rust/src/dep-trees/*-actual.txt /src/testdata/* @@ -91,6 +95,10 @@ compile_commands.json /scripts/*.graphml /scripts/*.json +# tracy binaries +/tracy-capture +/tracy-gui + # test output stellar-core-test-* test-partitions.* diff --git a/.gitmodules b/.gitmodules index 3a3f864b07..20affef707 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,6 +46,7 @@ [submodule "src/rust/soroban/p25"] path = src/rust/soroban/p25 url = https://github.com/stellar/rs-soroban-env.git + branch = internal/v25.2.0 [submodule "src/rust/soroban/p26"] path = src/rust/soroban/p26 url = https://github.com/stellar/rs-soroban-env.git diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Builds/VisualStudio/build_rust.bat b/Builds/VisualStudio/build_rust.bat index 752ef4d791..2e0b6c9208 100644 --- a/Builds/VisualStudio/build_rust.bat +++ b/Builds/VisualStudio/build_rust.bat @@ -33,30 +33,121 @@ setlocal EnableDelayedExpansion rem -- range to use for stable host envs set MIN_P=21 -set MAX_P=24 +set MAX_P=26 rem -- version of the latest WIP protocol -set LATEST_P=25 +set LATEST_P=26 rem ---- Accumulators for final rustc link flags ---- set "EXTERNS=" set "LPATHS=" +set "ALL_REVS=" +set "SOURCE_STAMP=.source-rev" -rem ---- Build historical protocols MIN_P..MAX_P (no %features%) ---- +rem ---- Build protocols MIN_P..MAX_P ---- +rem When "next" is passed and LATEST_P falls within this range, skip it here +rem (it will be built once below with --features next). for /l %%P in (%MIN_P%,1,%MAX_P%) do ( - %set_linker_flags% & pushd "%project_dir%\src\rust\soroban\p%%P" & (set RUSTFLAGS=-Cmetadata=p%%P) & cargo +%version% build %release_profile% --package soroban-env-host --locked --target-dir "%out_dir%\soroban-p%%P-target" & popd + set "proto_dir=%project_dir%\src\rust\soroban\p%%P" + set "proto_target=%out_dir%\soroban-p%%P-target" - set "EXTERNS=!EXTERNS! --extern soroban_env_host_p%%P=%out_dir%\soroban-p%%P-target\%2\libsoroban_env_host.rlib" - set "LPATHS=!LPATHS! -L dependency=%out_dir%\soroban-p%%P-target\%2\deps" + rem -- Resolve current submodule rev -- + set "current_rev=" + for /f %%R in ('git -C "!proto_dir!" rev-parse HEAD 2^>nul') do set "current_rev=%%R" + set "ALL_REVS=!ALL_REVS!p%%P-!current_rev:~0,12!_" + + rem -- Compare stamp to decide if cargo needs to run -- + set "stamp_ok=" + if not "!current_rev!"=="" ( + if exist "!proto_target!\%SOURCE_STAMP%" ( + set "saved_rev=" + set /p saved_rev=<"!proto_target!\%SOURCE_STAMP%" + if /I "!saved_rev!"=="!current_rev!" set "stamp_ok=1" + ) + ) + + rem -- Decide whether to skip building this protocol in the loop -- + set "skip_build=" + if defined features if %%P==%LATEST_P% set "skip_build=1" + + if not defined skip_build ( + if defined stamp_ok ( + echo p%%P: up to date, skipping. + ) else ( + echo p%%P: building soroban-env-host... + %set_linker_flags% & pushd "!proto_dir!" & (set RUSTFLAGS=-Cmetadata=p%%P-!current_rev:~0,12!) & cargo +%version% build %release_profile% --package soroban-env-host --locked --target-dir "!proto_target!" & popd + if errorlevel 1 exit /b 1 + if not "!current_rev!"=="" ( + if not exist "!proto_target!" mkdir "!proto_target!" + >"!proto_target!\%SOURCE_STAMP%" echo(!current_rev! + ) + ) + ) + + if not defined skip_build ( + set "EXTERNS=!EXTERNS! --extern soroban_env_host_p%%P=%out_dir%\soroban-p%%P-target\%2\libsoroban_env_host.rlib" + set "LPATHS=!LPATHS! -L dependency=%out_dir%\soroban-p%%P-target\%2\deps" + ) ) -echo rem ---- Build latest protocol (passes --features) ---- -%set_linker_flags% & pushd %project_dir%\src\rust\soroban\p%LATEST_P% & (set RUSTFLAGS=-Cmetadata=p%LATEST_P%) & cargo +%version% build %release_profile% --package soroban-env-host --locked %features% --target-dir %out_dir%\soroban-p%LATEST_P%-target & popd +rem ---- Build LATEST_P with features (only when "next" is passed) ---- +if defined features ( + set "latest_proto_dir=%project_dir%\src\rust\soroban\p%LATEST_P%" + set "latest_proto_target=%out_dir%\soroban-p%LATEST_P%-target" + + set "latest_rev=" + for /f %%R in ('git -C "!latest_proto_dir!" rev-parse HEAD 2^>nul') do set "latest_rev=%%R" + + set "latest_stamp_ok=" + if not "!latest_rev!"=="" ( + if exist "!latest_proto_target!\%SOURCE_STAMP%" ( + set "saved_latest_rev=" + set /p saved_latest_rev=<"!latest_proto_target!\%SOURCE_STAMP%" + if /I "!saved_latest_rev!"=="!latest_rev!" set "latest_stamp_ok=1" + ) + ) -set "EXTERNS=%EXTERNS% --extern soroban_env_host_p%LATEST_P%=%out_dir%\soroban-p%LATEST_P%-target\%2\libsoroban_env_host.rlib" -set "LPATHS=%LPATHS% -L dependency=%out_dir%\soroban-p%LATEST_P%-target\%2\deps" + if defined latest_stamp_ok ( + echo p%LATEST_P% ^(latest^): up to date, skipping. + ) else ( + echo p%LATEST_P% ^(latest^): building soroban-env-host with %features%... + %set_linker_flags% & pushd "!latest_proto_dir!" & (set RUSTFLAGS=-Cmetadata=p%LATEST_P%-!latest_rev:~0,12!) & cargo +%version% build %release_profile% --package soroban-env-host --locked %features% --target-dir "!latest_proto_target!" & popd + if errorlevel 1 exit /b 1 + if not "!latest_rev!"=="" ( + if not exist "!latest_proto_target!" mkdir "!latest_proto_target!" + >"!latest_proto_target!\%SOURCE_STAMP%" echo(!latest_rev! + ) + ) + + set "EXTERNS=!EXTERNS! --extern soroban_env_host_p%LATEST_P%=!latest_proto_target!\%2\libsoroban_env_host.rlib" + set "LPATHS=!LPATHS! -L dependency=!latest_proto_target!\%2\deps" +) + +rem ---- Final stellar-core compile ---- +rem Clear RUSTFLAGS so that metadata from soroban-protocol builds above does +rem not leak into the stellar-core build and cause cargo to invalidate its +rem fingerprints on the next run (where the soroban builds may be skipped). +set "RUSTFLAGS=" + +rem Write submodule revisions to a file that build.rs watches via +rem cargo:rerun-if-changed. Only update the file when content actually +rem changes so that the mtime (which cargo uses for freshness) stays +rem stable across no-op builds. +set "REVS_FILE=%project_dir%\src\rust\.soroban-revs" +set "revs_changed=" +if exist "!REVS_FILE!" ( + set "saved_revs=" + set /p saved_revs=<"!REVS_FILE!" + if not "!saved_revs!"=="!ALL_REVS!" set "revs_changed=1" +) else ( + set "revs_changed=1" +) +if defined revs_changed >"!REVS_FILE!" echo(!ALL_REVS! -rem ---- Final stellar-core compile linking all protocol libs ---- -cd /d "%project_dir%" & cargo +%version% rustc %release_profile% --package stellar-core --locked %features% --target-dir "%out_dir%\target" -- %EXTERNS% %LPATHS% +rem Always invoke cargo here: cargo's own incremental-build tracking will +rem no-op quickly when nothing changed, and the .soroban-revs file +rem (tracked via build.rs) forces a rebuild when submodules change. +echo Building stellar-core Rust library... +%set_linker_flags% & cd /d "%project_dir%" & cargo +%version% rustc %release_profile% --package stellar-core --locked %features% --target-dir "%out_dir%\target" -- %EXTERNS% %LPATHS% endlocal diff --git a/Builds/VisualStudio/libmedida/libmedida.vcxproj b/Builds/VisualStudio/libmedida/libmedida.vcxproj index 834f837d0a..1e8b4426d9 100644 --- a/Builds/VisualStudio/libmedida/libmedida.vcxproj +++ b/Builds/VisualStudio/libmedida/libmedida.vcxproj @@ -151,6 +151,7 @@ false _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true @@ -168,6 +169,7 @@ false _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true @@ -199,6 +201,7 @@ ..\..\..\lib\libmedida\src;..\..\..\lib\tracy\public\tracy _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true diff --git a/Builds/VisualStudio/libsoci/libsoci.vcxproj b/Builds/VisualStudio/libsoci/libsoci.vcxproj index 94fc400ddf..286abc5d2f 100644 --- a/Builds/VisualStudio/libsoci/libsoci.vcxproj +++ b/Builds/VisualStudio/libsoci/libsoci.vcxproj @@ -222,6 +222,7 @@ MultiThreadedDebugDLL %(AdditionalIncludeDirectories) false + stdcpp20 true @@ -241,6 +242,7 @@ MultiThreadedDebugDLL %(AdditionalIncludeDirectories) false + stdcpp20 true @@ -274,6 +276,7 @@ %(AdditionalIncludeDirectories) false _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) + stdcpp20 true diff --git a/Builds/VisualStudio/libsoci_postgresql/libsoci_postgresql.vcxproj b/Builds/VisualStudio/libsoci_postgresql/libsoci_postgresql.vcxproj index 0f97d1770c..5428a5cd8a 100644 --- a/Builds/VisualStudio/libsoci_postgresql/libsoci_postgresql.vcxproj +++ b/Builds/VisualStudio/libsoci_postgresql/libsoci_postgresql.vcxproj @@ -161,6 +161,7 @@ _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) MultiThreadedDebugDLL false + stdcpp20 true @@ -181,6 +182,7 @@ _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) MultiThreadedDebugDLL false + stdcpp20 true @@ -215,6 +217,7 @@ _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false ..\..\..\lib\soci\src\core;c:\Program Files\PostgreSQL\15\include + stdcpp20 true diff --git a/Builds/VisualStudio/libsoci_sqlite3/libsoci_sqlite3.vcxproj b/Builds/VisualStudio/libsoci_sqlite3/libsoci_sqlite3.vcxproj index b3971b907d..16bb05dc36 100644 --- a/Builds/VisualStudio/libsoci_sqlite3/libsoci_sqlite3.vcxproj +++ b/Builds/VisualStudio/libsoci_sqlite3/libsoci_sqlite3.vcxproj @@ -166,6 +166,7 @@ true MultiThreadedDebugDLL false + stdcpp20 true @@ -187,6 +188,7 @@ true MultiThreadedDebugDLL false + stdcpp20 true @@ -222,6 +224,7 @@ _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false true + stdcpp20 true diff --git a/Builds/VisualStudio/libsqlite/libsqlite.vcxproj b/Builds/VisualStudio/libsqlite/libsqlite.vcxproj index b8082f39fa..7a83bc1eeb 100644 --- a/Builds/VisualStudio/libsqlite/libsqlite.vcxproj +++ b/Builds/VisualStudio/libsqlite/libsqlite.vcxproj @@ -154,6 +154,7 @@ %(AdditionalIncludeDirectories) SQLITE_WIN32_GETVERSIONEX=0;SQLITE_CORE;SQLITE_OMIT_LOAD_EXTENSION=1;_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true @@ -171,6 +172,7 @@ %(AdditionalIncludeDirectories) SQLITE_WIN32_GETVERSIONEX=0;SQLITE_CORE;SQLITE_OMIT_LOAD_EXTENSION=1;_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true @@ -205,6 +207,7 @@ %(AdditionalIncludeDirectories) SQLITE_WIN32_GETVERSIONEX=0;SQLITE_CORE;SQLITE_OMIT_LOAD_EXTENSION=1;_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) false + stdcpp20 true diff --git a/Builds/VisualStudio/stellar-core.vcxproj b/Builds/VisualStudio/stellar-core.vcxproj index c2556530ad..3f5efd7e2b 100644 --- a/Builds/VisualStudio/stellar-core.vcxproj +++ b/Builds/VisualStudio/stellar-core.vcxproj @@ -124,19 +124,19 @@ Level4 Disabled true - CEREAL_THREAD_SAFE;USE_POSTGRES;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + CEREAL_THREAD_SAFE;_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;USE_POSTGRES;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) src;../../src;../../lib;../../lib/tracy/public/tracy;../../lib/spdlog/include;../../lib/libmedida/src;../../lib/soci/src/core;../../lib/autocheck/include;../../lib/cereal/include;../../lib/asio/asio/include;../../lib/xdrpp;../../lib/libsodium/src/libsodium/include;../../lib/fmt/include;../../lib/util;../..;src/$(Configuration)/generated;src/generated;../../lib/sqlite;c:\Program Files\PostgreSQL\15\include;%(AdditionalIncludeDirectories) true false - 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592 + 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592;5054 MultiThreadedDebugDLL false false ProgramDatabase - /bigobj /Zc:__cplusplus /Zc:lambda %(AdditionalOptions) - stdcpp17 + /bigobj /Zc:__cplusplus /utf-8 %(AdditionalOptions) + stdcpp20 DebugFastLink @@ -187,19 +187,19 @@ exit /b 0 Level4 Disabled true - CEREAL_THREAD_SAFE;USE_POSTGRES;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + CEREAL_THREAD_SAFE;_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;USE_POSTGRES;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) src;../../src;../../lib;../../lib/tracy/public/tracy;../../lib/spdlog/include;../../lib/libmedida/src;../../lib/soci/src/core;../../lib/autocheck/include;../../lib/cereal/include;../../lib/asio/asio/include;../../lib/xdrpp;../../lib/libsodium/src/libsodium/include;../../lib/fmt/include;../../lib/util;../..;src/$(Configuration)/generated;src/generated;../../lib/sqlite;c:\Program Files\PostgreSQL\15\include;%(AdditionalIncludeDirectories) true false - 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592 + 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592;5054 MultiThreadedDebugDLL false false ProgramDatabase - /bigobj /Zc:__cplusplus /Zc:lambda %(AdditionalOptions) - stdcpp17 + /bigobj /Zc:__cplusplus /utf-8 %(AdditionalOptions) + stdcpp20 DebugFastLink @@ -251,19 +251,19 @@ exit /b 0 Level4 Disabled true - CEREAL_THREAD_SAFE;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + CEREAL_THREAD_SAFE;_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) src;../../src;../../lib;../../lib/tracy/public/tracy;../../lib/spdlog/include;../../lib/libmedida/src;../../lib/soci/src/core;../../lib/autocheck/include;../../lib/cereal/include;../../lib/asio/asio/include;../../lib/xdrpp;../../lib/libsodium/src/libsodium/include;../../lib/fmt/include;../../lib/util;../..;src/$(Configuration)/generated;src/generated;../../lib/sqlite;c:\Program Files\PostgreSQL\15\include;%(AdditionalIncludeDirectories) true false - 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592 + 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592;5054 MultiThreadedDebugDLL false false ProgramDatabase - /bigobj /Zc:__cplusplus /Zc:lambda %(AdditionalOptions) - stdcpp17 + /bigobj /Zc:__cplusplus /utf-8 %(AdditionalOptions) + stdcpp20 DebugFastLink @@ -319,14 +319,14 @@ exit /b 0 true true true - CEREAL_THREAD_SAFE;USE_POSTGRES;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;TRACY_ENABLE;TRACY_ON_DEMAND;TRACY_NO_BROADCAST;TRACY_ONLY_LOCALHOST;TRACY_DELAYED_INIT;USE_TRACY;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + CEREAL_THREAD_SAFE;_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;USE_POSTGRES;ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION=1;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;TRACY_ENABLE;TRACY_ON_DEMAND;TRACY_NO_BROADCAST;TRACY_ONLY_LOCALHOST;TRACY_DELAYED_INIT;USE_TRACY;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) src;../../src;../../lib;../../lib/tracy/public/tracy;../../lib/spdlog/include;../../lib/libmedida/src;../../lib/soci/src/core;../../lib/autocheck/include;../../lib/cereal/include;../../lib/asio/asio/include;../../lib/xdrpp;../../lib/libsodium/src/libsodium/include;../../lib/fmt/include;../../lib/util;../..;src/$(Configuration)/generated;src/generated;../../lib/sqlite;c:\Program Files\PostgreSQL\15\include;%(AdditionalIncludeDirectories) false true - 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592 + 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592;5054 false - /bigobj /Zc:__cplusplus /Zc:lambda %(AdditionalOptions) - stdcpp17 + /bigobj /Zc:__cplusplus /utf-8 %(AdditionalOptions) + stdcpp20 false @@ -382,14 +382,14 @@ exit /b 0 true true true - CEREAL_THREAD_SAFE;USE_POSTGRES;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;TRACY_ENABLE;TRACY_ON_DEMAND;TRACY_NO_BROADCAST;TRACY_ONLY_LOCALHOST;TRACY_DELAYED_INIT;USE_TRACY;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + CEREAL_THREAD_SAFE;_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;USE_POSTGRES;USE_SPDLOG;FMT_HEADER_ONLY=1;BUILD_TESTS;WIN32_LEAN_AND_MEAN;NOMINMAX;ASIO_STANDALONE;_WINSOCK_DEPRECATED_NO_WARNINGS;SODIUM_STATIC;ASIO_SEPARATE_COMPILATION;ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept;TRACY_ENABLE;TRACY_ON_DEMAND;TRACY_NO_BROADCAST;TRACY_ONLY_LOCALHOST;TRACY_DELAYED_INIT;USE_TRACY;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WIN32;_MBCS;_CRT_NONSTDC_NO_DEPRECATE;YY_NO_UNISTD_H;%(PreprocessorDefinitions) src;../../src;../../lib;../../lib/tracy/public/tracy;../../lib/spdlog/include;../../lib/libmedida/src;../../lib/soci/src/core;../../lib/autocheck/include;../../lib/cereal/include;../../lib/asio/asio/include;../../lib/xdrpp;../../lib/libsodium/src/libsodium/include;../../lib/fmt/include;../../lib/util;../..;src/$(Configuration)/generated;src/generated;../../lib/sqlite;c:\Program Files\PostgreSQL\15\include;%(AdditionalIncludeDirectories) false true - 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592 + 4060;4100;4127;4324;4408;4510;4512;4582;4583;4592;5054 false - /bigobj /Zc:__cplusplus /Zc:lambda %(AdditionalOptions) - stdcpp17 + /bigobj /Zc:__cplusplus /utf-8 %(AdditionalOptions) + stdcpp20 false @@ -577,6 +577,7 @@ exit /b 0 + @@ -624,6 +625,7 @@ exit /b 0 + @@ -722,6 +724,7 @@ exit /b 0 + @@ -759,6 +762,7 @@ exit /b 0 + @@ -852,7 +856,6 @@ exit /b 0 - @@ -1044,6 +1047,7 @@ exit /b 0 + @@ -1083,6 +1087,7 @@ exit /b 0 + @@ -1177,6 +1182,7 @@ exit /b 0 + @@ -1198,7 +1204,6 @@ exit /b 0 - @@ -1292,9 +1297,7 @@ exit /b 0 - - @@ -2032,7 +2035,7 @@ exit /b 0 Document - bison --defines=../../src/util/xdrquery/XDRQueryParser.h --output=../../src/util/xdrquery/XDRQueryParser.cpp ../../src/util/xdrquery/XDRQueryParser.yy + wsl bison --defines=../../src/util/xdrquery/XDRQueryParser.h --output=../../src/util/xdrquery/XDRQueryParser.cpp ../../src/util/xdrquery/XDRQueryParser.yy running bison for XDRQueryParser.yy ../../src/util/xdrquery/XDRQueryParser.h true @@ -2044,7 +2047,7 @@ exit /b 0 Document - flex --outfile=../../src/util/xdrquery/XDRQueryScanner.cpp ../../src/util/xdrquery/XDRQueryScanner.ll + wsl flex --outfile=../../src/util/xdrquery/XDRQueryScanner.cpp ../../src/util/xdrquery/XDRQueryScanner.ll running flex for XDRQueryScanner.ll ../../src/util/xdrquery/XDRQueryScanner.cpp true diff --git a/Builds/VisualStudio/stellar-core.vcxproj.filters b/Builds/VisualStudio/stellar-core.vcxproj.filters index 09a3e07f62..f31ec8cbf7 100644 --- a/Builds/VisualStudio/stellar-core.vcxproj.filters +++ b/Builds/VisualStudio/stellar-core.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -408,9 +408,6 @@ main - - main - main @@ -846,6 +843,9 @@ invariant + + invariant + invariant @@ -1320,7 +1320,6 @@ ledger - main @@ -1420,6 +1419,28 @@ invariant + + invariant + + + ledger + + + util + + + util + + + lib\tracy + + + + main + + + util + @@ -1662,9 +1683,6 @@ main - - main - main @@ -2067,6 +2085,9 @@ invariant + + invariant + invariant @@ -2518,10 +2539,29 @@ invariant + + invariant + + + ledger + + + util + + + util + + + + + + main + + + util + - - diff --git a/Cargo.lock b/Cargo.lock index 98d9b480ad..373a429099 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1518,7 +1518,7 @@ dependencies = [ "soroban-env-macros 25.0.1", "soroban-wasmi", "static_assertions", - "stellar-xdr 25.0.0", + "stellar-xdr 25.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser", ] @@ -1810,7 +1810,7 @@ dependencies = [ "quote", "serde", "serde_json", - "stellar-xdr 25.0.0", + "stellar-xdr 25.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "syn 2.0.39", ] @@ -1893,14 +1893,14 @@ dependencies = [ [[package]] name = "stellar-quorum-analyzer" version = "0.1.0" -source = "git+https://github.com/stellar/stellar-quorum-analyzer?rev=956ba5b8d786d755f5c575160dfc1dec6b313f40#956ba5b8d786d755f5c575160dfc1dec6b313f40" +source = "git+https://github.com/stellar/stellar-quorum-analyzer?rev=174d2a89c7e676000ef4ee2998959681a55befec#174d2a89c7e676000ef4ee2998959681a55befec" dependencies = [ "batsat", "itertools 0.10.5", "log", "petgraph", "stellar-strkey 0.0.13", - "stellar-xdr 25.0.0", + "stellar-xdr 25.0.0 (git+https://github.com/stellar/rs-stellar-xdr?rev=99c73b18ccd68bc3439be30801da6261b193d2da)", ] [[package]] @@ -2024,6 +2024,20 @@ dependencies = [ "stellar-strkey 0.0.13", ] +[[package]] +name = "stellar-xdr" +version = "25.0.0" +source = "git+https://github.com/stellar/rs-stellar-xdr?rev=99c73b18ccd68bc3439be30801da6261b193d2da#99c73b18ccd68bc3439be30801da6261b193d2da" +dependencies = [ + "cfg_eval", + "crate-git-revision", + "escape-bytes", + "ethnum", + "hex", + "sha2", + "stellar-strkey 0.0.13", +] + [[package]] name = "subtle" version = "2.6.1" diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/INSTALL.md b/INSTALL.md index c01a2d1263..7a5ded2f7f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -57,7 +57,7 @@ To install Postgresql, follow instructions from the [Postgresql download page](h ## Build Dependencies -- c++ toolchain and headers that supports c++17 +- c++ toolchain and headers that supports c++20 - `clang` >= 20.0 - `g++` >= 14.0 - `pkg-config` diff --git a/README.md b/README.md index f60d885bb0..8ab58013e6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Stellar-core is a replicated state machine that maintains a local copy of a cryptographic ledger and processes transactions against it, in consensus with a set of peers. It implements the [Stellar Consensus Protocol](https://github.com/stellar/stellar-core/blob/master/src/scp/readme.md), a _federated_ consensus protocol. -It is written in C++17 and runs on Linux, OSX and Windows. +It is written in C++20 and runs on Linux, OSX and Windows. Learn more by reading the [overview document](https://github.com/stellar/stellar-core/blob/master/docs/readme.md). # Documentation diff --git a/autogen.sh b/autogen.sh index e5339291e7..98b7aba367 100755 --- a/autogen.sh +++ b/autogen.sh @@ -31,6 +31,7 @@ esac case "${skip_submodules}" in 0|no|false|"") + git submodule sync git submodule update --init git submodule foreach ' autogen=$(find . -name autogen.sh) @@ -43,4 +44,5 @@ case "${skip_submodules}" in esac ./make-mks +touch AUTHORS ChangeLog autoreconf -i diff --git a/configure.ac b/configure.ac index ff5b27751a..8955369018 100644 --- a/configure.ac +++ b/configure.ac @@ -49,7 +49,7 @@ AC_SUBST(LIBTOOL_DEPS) AC_LANG(C++) # if modifying the following macro for a future C++ version, please update CXX # for enable-afl in the fuzzer configuration block below -AX_CXX_COMPILE_STDCXX(17, noext,mandatory) +AX_CXX_COMPILE_STDCXX(20, noext,mandatory) AX_FRESH_COMPILER # -pthread seems to be required by -std=c++14 on some hosts AX_APPEND_COMPILE_FLAGS([-pthread]) @@ -149,7 +149,7 @@ AC_ARG_ENABLE([threadsafety], AS_IF([test "x$enable_threadsafety" = "xyes"], [ AC_MSG_NOTICE([enabling thread safety static analysis, see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html]) AS_CASE(["$CXX"], - [clang*], [CXXFLAGS="$CXXFLAGS -Wthread-safety -Werror=thread-safety -DTHREAD_SAFETY"], + [clang*], [CXXFLAGS="$CXXFLAGS -Wthread-safety -Werror=thread-safety -Wthread-safety-beta -Werror=thread-safety-beta -DTHREAD_SAFETY"], [AC_MSG_WARN([Thread safety analysis is only supported with Clang compiler, skipping])]) ]) @@ -233,6 +233,103 @@ AS_IF([test "x$enable_ccache" = "xyes"], [ esac ]) +AC_ARG_ENABLE([sccache], + AS_HELP_STRING([--enable-sccache], [build with sccache])) + +AC_ARG_ENABLE([nsc-sccache], + AS_HELP_STRING([--enable-nsc-sccache], [configure sccache using nsc cache setup])) + +AS_IF([test "x$enable_nsc_sccache" = "xyes"], [ + AC_CHECK_PROGS([NSC], [nsc]) + AS_IF([test -z "$NSC"], [ + AC_MSG_ERROR([--enable-nsc-sccache requested but nsc was not found]) + ]) + + AC_MSG_NOTICE([configuring sccache environment with: nsc cache sccache setup --cache_name stellar]) + NSC_SCCACHE_SETUP=`$NSC cache sccache setup --cache_name stellar` + nsc_rc=$? + AS_IF([test $nsc_rc -ne 0 -o "x$NSC_SCCACHE_SETUP" = "x"], [ + AC_MSG_ERROR([nsc cache sccache setup failed or returned empty result]) + ]) + + # Eval the nsc output into configure's environment so the sccache + # daemon we start below inherits the remote-cache credentials. + AC_MSG_NOTICE([applying nsc sccache environment variables]) + eval "$NSC_SCCACHE_SETUP" || AC_MSG_ERROR([failed to eval nsc sccache setup output]) + + export SCCACHE_WEBDAV_ENDPOINT + export SCCACHE_WEBDAV_KEY_PREFIX + export SCCACHE_WEBDAV_TOKEN + + enable_sccache=yes + enable_nsc_sccache_done=yes +]) + +AS_IF([test "x$enable_ccache" = "xyes" -a "x$enable_sccache" = "xyes"], [ + AC_MSG_ERROR([Cannot enable both ccache and sccache]) +]) + +AS_IF([test "x$enable_sccache" = "xyes"], [ + AC_CHECK_PROGS([SCCACHE], [sccache]) + AS_IF([test -z "$SCCACHE"], [ + AC_MSG_ERROR([sccache enabled but not found]) + ]) + + # Set SCCACHE_BASEDIRS so sccache can normalize absolute paths in + # both the source and build trees, improving cache hit rates when + # the same code is built from different directories. + SCCACHE_BASEDIRS="$(cd "$srcdir" && pwd):$(pwd)" + export SCCACHE_BASEDIRS + AC_MSG_NOTICE([sccache base dirs: $SCCACHE_BASEDIRS]) + + # Stop any existing sccache daemon -- it may be running with stale + # config (different credentials, local-only caching, etc.). The + # daemon we start below will have the correct nsc environment. + AC_MSG_NOTICE([stopping any existing sccache daemon]) + "$SCCACHE" --stop-server >/dev/null 2>&1 || true + + # Set idle timeout to 0 so the daemon stays alive for the entire + # build rather than dying after 10 minutes of inactivity (e.g. + # during long link steps). + SCCACHE_IDLE_TIMEOUT=0 + export SCCACHE_IDLE_TIMEOUT + + # Start a fresh daemon with the exported environment. + AC_MSG_NOTICE([starting sccache daemon with exported environment]) + "$SCCACHE" --start-server || AC_MSG_ERROR([failed to start sccache daemon]) + + AS_IF([test "x$enable_nsc_sccache_done" = "xyes"], [ + # Verify the daemon is using a remote cache (webdav/nsc) and not + # just local disk storage. This catches misconfiguration early. + # The stats line looks like: "Cache location webdav, name: ..." + AC_MSG_NOTICE([verifying sccache is using remote (webdav) storage]) + SCCACHE_STATS=`"$SCCACHE" -s 2>&1` + AC_MSG_NOTICE([sccache stats: +$SCCACHE_STATS]) + AS_CASE(["$SCCACHE_STATS"], + [*webdav*], [AC_MSG_NOTICE([confirmed: sccache is using webdav remote cache])], + [AC_MSG_ERROR([sccache daemon does not appear to be using webdav storage -- nsc configuration may have failed. Run 'sccache -s' to diagnose.])]) + ]) + + case "$CC" in + *sccache\ *) + ;; + *) + CC="$SCCACHE ${CC}" + ;; + esac + case "$CXX" in + *sccache\ *) + ;; + *) + CXX="$SCCACHE ${CXX}" + ;; + esac + AS_IF([test -z "${RUSTC_WRAPPER+set}"], [ + RUSTC_WRAPPER="$SCCACHE" + ]) +]) + # Permit user to enable AFL instrumentation AC_ARG_ENABLE([afl], AS_HELP_STRING([--enable-afl], @@ -244,22 +341,25 @@ AS_IF([test "x$enable_afl" = "xyes"], [ AS_IF([test "x$enable_ccache" = "xyes"], [ AC_MSG_ERROR([AFL is presently incompatible with ccache]) ]) + AS_IF([test "x$enable_sccache" = "xyes"], [ + AC_MSG_ERROR([AFL is presently incompatible with sccache]) + ]) AC_CHECK_PROGS([AFL_FUZZ], [afl-fuzz]) AS_CASE(["$CC"], [clang*], [AC_CHECK_PROGS([AFL_CLANG], [afl-clang-fast]) AC_CHECK_PROGS([AFL_CLANGPP], [afl-clang-fast++]) CC="afl-clang-fast" - # below we hard code -std=c++17 since updates to AX_CXX_COMPILE_STDCXX append it to + # below we hard code -std=c++20 since updates to AX_CXX_COMPILE_STDCXX append it to # CXX, not to CXXFLAGS and thus when setting CXX we override this. For a more detailed explanation # see: https://github.com/stellar/docker-stellar-core/pull/66#issuecomment-521886881 - CXX="afl-clang-fast++ -std=c++17 -DAFL_LLVM_MODE=1"], + CXX="afl-clang-fast++ -std=c++20 -DAFL_LLVM_MODE=1"], [gcc*], [AC_CHECK_PROGS([AFL_GCC], [afl-gcc]) AC_CHECK_PROGS([AFL_GPP], [afl-g++]) CC="afl-gcc" - # below we hard code -std=c++17 since updates to AX_CXX_COMPILE_STDCXX append it to + # below we hard code -std=c++20 since updates to AX_CXX_COMPILE_STDCXX append it to # CXX, not to CXXFLAGS and thus when setting CXX we override this. For a more detailed explanation # see: https://github.com/stellar/docker-stellar-core/pull/66#issuecomment-521886881 - CXX="afl-g++ -std=c++17"], + CXX="afl-g++ -std=c++20"], [AC_MSG_ERROR([Don't know how to instrument CC=$CC with AFL])]) ]) AM_CONDITIONAL([USE_AFL_FUZZ], [test "x$enable_afl" == "xyes"]) @@ -470,8 +570,9 @@ AX_COMPARE_VERSION([${RUSTC_VERSION}],[ge],[1.57],[],[ AC_MSG_ERROR([rustc version too old (need >= 1.57)]) ]) AC_ARG_VAR(RUSTC) +AC_ARG_VAR([RUSTC_WRAPPER], [rustc wrapper executable (for example, sccache)]) -# Need this to pass through ccache for xdrpp, libsodium +# Need this to pass through ccache/sccache for xdrpp, libsodium esc() { out= for arg in "$@"; do @@ -481,7 +582,7 @@ esc() { } # explicitly propagate CFLAGS, CXXFLAGS and LDFLAGS in case they got modified by global options -ac_configure_args="$ac_configure_args $(esc "CC=$CC" "CXX=$CXX" "CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" "LDFLAGS=$LDFLAGS")" +ac_configure_args="$ac_configure_args $(esc "CC=$CC" "CXX=$CXX" "CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" "LDFLAGS=$LDFLAGS" "RUSTC_WRAPPER=$RUSTC_WRAPPER")" AC_CONFIG_HEADERS(config.h) AC_CONFIG_FILES(lib/Makefile src/Makefile Makefile) diff --git a/docs/apply-load-benchmark-sac.cfg b/docs/apply-load-benchmark-sac.cfg new file mode 100644 index 0000000000..7473130a40 --- /dev/null +++ b/docs/apply-load-benchmark-sac.cfg @@ -0,0 +1,62 @@ +# This is the Stellar Core configuration example for using the load generation +# (apply-load) tool for benchmarking the ledger close time with SAC transfer +# model transaction. +# The core with this configuration should run using `./stellar-core apply-load` + +# Select the apply-load mode and benchmark model transaction. +APPLY_LOAD_MODE="benchmark" +APPLY_LOAD_MODEL_TX="sac" + +# Whether to time the write part of the apply stage. This can be +# disabled to get less noisy results for non-write related changes, +# but should be enabled to get more comprehensive e2e numbers. +APPLY_LOAD_TIME_WRITES = true +# Medida metrics (histograms in particular) in apply path cause severe and +# non-deterministic performance degradation. While this has to be addressed +# eventually, it is useful to disable these when optimizing anything besides +# the metrics. +DISABLE_SOROBAN_METRICS_FOR_TESTING = true +# Disable metadata output +METADATA_OUTPUT_STREAM = "" +# Disable metadata debug +METADATA_DEBUG_LEDGERS = 0 + +# In this mode, defines the number of transactions to apply in each ledger. +APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 3000 + +# The only relevant network configuration parameter - number of transaction +# clusters that are then mapped to the transaction execution threads. +APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 1 + +# Number of payments to batch in a single transaction, similarly to how +# operations are batched for 'classic' transactions. +# This is useful to reduce the impact of non-env parts of the apply path, e.g. +# when evaluating the impact of changes to env itself. +APPLY_LOAD_BATCH_SAC_COUNT = 100 + +# Number of ledgers to close for every iteration of search. +APPLY_LOAD_NUM_LEDGERS = 100 + +# Disable bucket list pre-generation as it's not necessary for this mode. +APPLY_LOAD_BL_SIMULATED_LEDGERS = 0 +APPLY_LOAD_BL_WRITE_FREQUENCY = 0 +APPLY_LOAD_BL_BATCH_SIZE = 0 +APPLY_LOAD_BL_LAST_BATCH_SIZE = 0 +APPLY_LOAD_BL_LAST_BATCH_LEDGERS = 0 + +# Common apply load boilerplate +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up plenty of genesis accounts - benchmark will fail if the number is not +# sufficient. This should be at least 2x of APPLY_LOAD_MAX_SOROBAN_TX_COUNT. +GENESIS_TEST_ACCOUNT_COUNT = 21000 + +# Minimal core config boilerplate + +UNSAFE_QUORUM=true +NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" + +[QUORUM_SET] +THRESHOLD_PERCENT=100 +VALIDATORS=["$self"] \ No newline at end of file diff --git a/docs/apply-load-benchmark-token.cfg b/docs/apply-load-benchmark-token.cfg new file mode 100644 index 0000000000..14dc7b3091 --- /dev/null +++ b/docs/apply-load-benchmark-token.cfg @@ -0,0 +1,56 @@ +# This is the Stellar Core configuration example for using the load generation +# (apply-load) tool for benchmarking the ledger close time with a custom token +# transfer as model transaction. +# The core with this configuration should run using `./stellar-core apply-load` + +# Select the apply-load mode and benchmark model transaction. +APPLY_LOAD_MODE="benchmark" +APPLY_LOAD_MODEL_TX="custom_token" + +# Whether to time the write part of the apply stage. This can be +# disabled to get less noisy results for non-write related changes, +# but should be enabled to get more comprehensive e2e numbers. +APPLY_LOAD_TIME_WRITES = true +# Medida metrics (histograms in particular) in apply path cause severe and +# non-deterministic performance degradation. While this has to be addressed +# eventually, it is useful to disable these when optimizing anything besides +# the metrics. +DISABLE_SOROBAN_METRICS_FOR_TESTING = true +# Disable metadata output +METADATA_OUTPUT_STREAM = "" +# Disable metadata debug +METADATA_DEBUG_LEDGERS = 0 + +# In this mode, defines the number of transactions to apply in each ledger. +APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 1000 + +# The only relevant network configuration parameter - number of transaction +# clusters that are then mapped to the transaction execution threads. +APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 2 + +# Number of ledgers to close for every iteration of search. +APPLY_LOAD_NUM_LEDGERS = 100 + +# Disable bucket list pre-generation as it's not necessary for this mode. +APPLY_LOAD_BL_SIMULATED_LEDGERS = 0 +APPLY_LOAD_BL_WRITE_FREQUENCY = 0 +APPLY_LOAD_BL_BATCH_SIZE = 0 +APPLY_LOAD_BL_LAST_BATCH_SIZE = 0 +APPLY_LOAD_BL_LAST_BATCH_LEDGERS = 0 + +# Common apply load boilerplate +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up plenty of genesis accounts - benchmark will fail if the number is not +# sufficient. This should be at least 2x of APPLY_LOAD_MAX_SOROBAN_TX_COUNT. +GENESIS_TEST_ACCOUNT_COUNT = 21000 + +# Minimal core config boilerplate + +UNSAFE_QUORUM=true +NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" + +[QUORUM_SET] +THRESHOLD_PERCENT=100 +VALIDATORS=["$self"] \ No newline at end of file diff --git a/docs/apply-load-for-meta.cfg b/docs/apply-load-for-meta.cfg index de61f258fb..bdcda5dd65 100644 --- a/docs/apply-load-for-meta.cfg +++ b/docs/apply-load-for-meta.cfg @@ -6,16 +6,13 @@ # The core with this configuration should be run using # `./stellar-core new-hist local && ./stellar-core apply-load` +# Select the apply-load mode. +APPLY_LOAD_MODE="ledger-limits" + # Custom meta path - if not set it will be written to a temp directory and # cleaned up after running the benchmark METADATA_OUTPUT_STREAM='meta.xdr' -# Enable load generation -ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true - -# Diagnostic events should generally be disabled, but can be enabled for debug -ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false - # Network configuration to use during the benchmark # The fields here correspond to the network configuration settings. APPLY_LOAD_LEDGER_MAX_INSTRUCTIONS = 500000000 @@ -117,14 +114,19 @@ APPLY_LOAD_TX_SIZE_BYTES_DISTRIBUTION = [1] APPLY_LOAD_INSTRUCTIONS = [2000000] APPLY_LOAD_INSTRUCTIONS_DISTRIBUTION = [1] +# Common apply load boilerplate + +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up plenty of genesis accounts - benchmark will fail if the number is +# not sufficient. This should be at least 2x of the expected TPL, but it's cheap +# enough to be set higher than that. +GENESIS_TEST_ACCOUNT_COUNT = 40000 # Minimal core config boilerplate -RUN_STANDALONE=true -PARALLEL_LEDGER_APPLY=false -NODE_IS_VALIDATOR=false UNSAFE_QUORUM=true -NETWORK_PASSPHRASE="Standalone Network ; February 2017" NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" [QUORUM_SET] @@ -136,4 +138,4 @@ VALIDATORS=["$self"] [HISTORY.local] get="cp -r history/{0} {1}" put="cp -r {0} history/{1}" -mkdir="mkdir -p history/{0}" \ No newline at end of file +mkdir="mkdir -p history/{0}" diff --git a/docs/apply-load.cfg b/docs/apply-load-ledger-limits.cfg similarity index 81% rename from docs/apply-load.cfg rename to docs/apply-load-ledger-limits.cfg index 02cc3bf85c..6e244adf4e 100644 --- a/docs/apply-load.cfg +++ b/docs/apply-load-ledger-limits.cfg @@ -4,11 +4,18 @@ # The core with this configuration should be run using `./stellar-core apply-load` -# Enable load generation -ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true - -# Diagnostic events should generally be disabled, but can be enabled for debug -ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Select the apply-load mode. +APPLY_LOAD_MODE="ledger-limits" + +# Medida metrics (histograms in particular) in apply path cause severe and +# non-deterministic performance degradation. While this has to be addressed +# eventually, it is useful to disable these when optimizing anything besides +# the metrics. +DISABLE_SOROBAN_METRICS_FOR_TESTING = false +# Disable metadata output +METADATA_OUTPUT_STREAM = "" +# Disable metadata debug +METADATA_DEBUG_LEDGERS = 0 # Network configuration to use during the benchmark # The fields here correspond to the network configuration settings. @@ -39,8 +46,10 @@ APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 1000 # The following section contains various parameters for the generated load. -# Number of ledgers to close for benchmark -APPLY_LOAD_NUM_LEDGERS = 1 +# Maximum number of ledgers to close for every iteration of search. +# Should be at least 30 and normally doesn't need to be changed as search will +# not run extra iterations if the results are already statistically significant. +APPLY_LOAD_NUM_LEDGERS = 1000 # Generate that many simple Classic payment transactions in every benchmark ledger APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 0 @@ -111,14 +120,18 @@ APPLY_LOAD_TX_SIZE_BYTES_DISTRIBUTION = [1] APPLY_LOAD_INSTRUCTIONS = [2000000] APPLY_LOAD_INSTRUCTIONS_DISTRIBUTION = [1] +# Common apply load boilerplate +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up plenty of genesis accounts - benchmark will fail if the number is +# not sufficient. This should be at least 2x of the expected TPL, but it's cheap +# enough to be set higher than that. +GENESIS_TEST_ACCOUNT_COUNT = 40000 # Minimal core config boilerplate -RUN_STANDALONE=true -PARALLEL_LEDGER_APPLY=false -NODE_IS_VALIDATOR=true UNSAFE_QUORUM=true -NETWORK_PASSPHRASE="Standalone Network ; February 2017" NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" [QUORUM_SET] diff --git a/docs/apply-load-limits-for-model-tx.cfg b/docs/apply-load-limits-for-model-tx.cfg index 2dfe9f6259..c532091add 100644 --- a/docs/apply-load-limits-for-model-tx.cfg +++ b/docs/apply-load-limits-for-model-tx.cfg @@ -9,16 +9,23 @@ # # This is not meant to be used in any production contexts. # -# The core with this configuration should be run using `./stellar-core apply-load --mode limits-for-model-tx` +# The core with this configuration should be run using `./stellar-core apply-load` -# Enable load generation -ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Select the apply-load mode. +APPLY_LOAD_MODE="limits-for-model-tx" -# Diagnostic events should generally be disabled, but can be enabled for debug -ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Medida metrics (histograms in particular) in apply path cause severe and +# non-deterministic performance degradation. While this has to be addressed +# eventually, it is useful to disable these when optimizing anything besides +# the metrics. +DISABLE_SOROBAN_METRICS_FOR_TESTING = false +# Disable metadata output +METADATA_OUTPUT_STREAM = "" +# Disable metadata debug +METADATA_DEBUG_LEDGERS = 0 # Target average ledger close time. -APPLY_LOAD_TARGET_CLOSE_TIME_MS = 600 +APPLY_LOAD_TARGET_CLOSE_TIME_MS = 300 # Network configuration section @@ -26,8 +33,8 @@ APPLY_LOAD_TARGET_CLOSE_TIME_MS = 600 # transaction (for transaction limits) and from the search itself (for the ledger) # limits. Only the following limits need to be set: -# Maximum number of Soroban transactions to apply. This is the upper bound for the -# search. +# In this mode, defines the search upper bound for the number of Soroban +# transactions to apply. APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 2000 # Number of the transaction clusters and thus apply threads. This will stay constant @@ -36,9 +43,11 @@ APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 8 # The following section contains various parameters for the generated load. -# Number of ledgers to close for benchmarking each iteration of search. +# Maximum number of ledgers to close for every iteration of search. +# Should be at least 30 and normally doesn't need to be changed as search will +# not run extra iterations if the results are already statistically significant. # The average close time will then be compared to APPLY_LOAD_TARGET_CLOSE_TIME_MS. -APPLY_LOAD_NUM_LEDGERS = 10 +APPLY_LOAD_NUM_LEDGERS = 1000 # Generate that many simple Classic payment transactions in every benchmark ledger. # Note, that this will affect the close time. @@ -101,12 +110,17 @@ APPLY_LOAD_INSTRUCTIONS = [4250000] APPLY_LOAD_INSTRUCTIONS_DISTRIBUTION = [1] +# Common apply load boilerplate +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up plenty of genesis accounts - benchmark will fail if the number is not +# sufficient. This should be at least 2x of APPLY_LOAD_MAX_SOROBAN_TX_COUNT. +GENESIS_TEST_ACCOUNT_COUNT = 40000 + # Minimal core config boilerplate -RUN_STANDALONE=true -NODE_IS_VALIDATOR=true UNSAFE_QUORUM=true -NETWORK_PASSPHRASE="Standalone Network ; February 2017" NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" [QUORUM_SET] diff --git a/docs/apply-load-max-sac-tps.cfg b/docs/apply-load-max-sac-tps.cfg index 1f00d6b67a..ef48c89057 100644 --- a/docs/apply-load-max-sac-tps.cfg +++ b/docs/apply-load-max-sac-tps.cfg @@ -2,13 +2,24 @@ # (apply-load) tool for testing the theoretical max SAC (Stellar asset contract) # transfer TPS via binary search (measured based on apply time only). -# The core with this configuration should run using `./stellar-core apply-load --mode max-sac-tps` +# The core with this configuration should run using `./stellar-core apply-load` -# Enable load generation -ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Select the apply-load mode. +APPLY_LOAD_MODE="max-sac-tps" -# Diagnostic events should generally be disabled, but can be enabled for debug -ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Whether to time the write part of the apply stage. This can be +# disabled to get less noisy results for non-write related changes, +# but should be enabled to get more comprehensive e2e numbers. +APPLY_LOAD_TIME_WRITES = true +# Medida metrics (histograms in particular) in apply path cause severe and +# non-deterministic performance degradation. While this has to be addressed +# eventually, it is useful to disable these when optimizing anything besides +# the metrics. +DISABLE_SOROBAN_METRICS_FOR_TESTING = true +# Disable metadata output +METADATA_OUTPUT_STREAM = "" +# Disable metadata debug +METADATA_DEBUG_LEDGERS = 0 # Lower bound of the TPS in binary search APPLY_LOAD_MAX_SAC_TPS_MIN_TPS = 1000 @@ -16,7 +27,7 @@ APPLY_LOAD_MAX_SAC_TPS_MIN_TPS = 1000 APPLY_LOAD_MAX_SAC_TPS_MAX_TPS = 15000 # Number of seconds to apply the ledger for -APPLY_LOAD_MAX_SAC_TPS_TARGET_CLOSE_TIME_MS = 1000 +APPLY_LOAD_TARGET_CLOSE_TIME_MS = 1000 # The only relevant network configuration parameter - number of transaction # clusters that are then mapped to the transaction execution threads. @@ -24,10 +35,14 @@ APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 4 # Number of payments to batch in a single transaction, similarly to how # operations are batched for 'classic' transactions. +# This is useful to reduce the impact of non-env parts of the apply path, e.g. +# when evaluating the impact of changes to env itself. APPLY_LOAD_BATCH_SAC_COUNT = 100 -# Number of ledgers to close for every iteration of search. -APPLY_LOAD_NUM_LEDGERS = 20 +# Maximum number of ledgers to close for every iteration of search. +# Should be at least 30 and normally doesn't need to be changed as search will +# not run extra iterations if the results are already statistically significant. +APPLY_LOAD_NUM_LEDGERS = 1000 # Disable bucket list pre-generation as it's not necessary for this mode. APPLY_LOAD_BL_SIMULATED_LEDGERS = 0 @@ -36,14 +51,20 @@ APPLY_LOAD_BL_BATCH_SIZE = 0 APPLY_LOAD_BL_LAST_BATCH_SIZE = 0 APPLY_LOAD_BL_LAST_BATCH_LEDGERS = 0 +# Common apply load boilerplate +ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true +# Diagnostic events should generally be disabled, but can be enabled for debug +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false +# Set up a plenty of genesis accounts - benchmark will fail if the number is +# not sufficient. This should be at least 2x of the maximum TPL, but can be set +# higher than that. +GENESIS_TEST_ACCOUNT_COUNT = 100000 + # Minimal core config boilerplate -RUN_STANDALONE=true -NODE_IS_VALIDATOR=true UNSAFE_QUORUM=true -NETWORK_PASSPHRASE="Standalone Network ; February 2017" NODE_SEED="SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2 self" [QUORUM_SET] THRESHOLD_PERCENT=100 -VALIDATORS=["$self"] \ No newline at end of file +VALIDATORS=["$self"] diff --git a/docs/quick-reference.md b/docs/quick-reference.md index fc054acdfc..c8cb51bb4c 100644 --- a/docs/quick-reference.md +++ b/docs/quick-reference.md @@ -59,18 +59,6 @@ You have some control over which peers you're connected to: * the `connect` command asks the instance to connect to a specific peer. * the `droppeer` command asks the instance to drop the connection with a specific peer. -### Maintenance - -Core keeps historical data needed for publish (such as SCP history) - -Sometimes you need to clean up more than this (for example, if you have a large maintenance debt). -In this case running the command `maintenance?count=100000000` (integer is a large number, bigger than your max backlog) will perform the full maintenance. - -Note that this may hang the instance for minutes (hours even). - -After performing such maintenance, you may issue a postgres `VACUUM FULL;` that will reclaim all -disk space (note that this requires a lot of free disk space). - ### Testing The `manualclose` command allows to close a ledger, this is used when the instance is diff --git a/docs/software/commands.md b/docs/software/commands.md index 37a61ce114..c4dde5790a 100644 --- a/docs/software/commands.md +++ b/docs/software/commands.md @@ -29,13 +29,17 @@ Command options can only by placed after command. synthetic ledger close metadata emitted during the benchmark, and then use it for benchmarking the meta consumers. * This can only be used when `ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=true` - * The command supports several modes: - - **--mode limit-based**: the default mode that measures the + * The mode is selected in the config file using `APPLY_LOAD_MODE`: + - `APPLY_LOAD_MODE="ledger-limits"`: the default mode that measures the ledger close time for applying transactions. - - **--mode max-sac-tps**: determines maximum TPS for the load consisting - only of fast SAC transfer - - **--mode limits-for-model-tx**: determines maximum ledger limits for the - load consisting only of a customizable 'model' transaction. + - `APPLY_LOAD_MODE="max-sac-tps"`: determines maximum TPS for the load + consisting only of fast SAC transfer. + - `APPLY_LOAD_MODE="limits-for-model-tx"`: determines maximum ledger + limits for the load consisting only of a customizable 'model' + transaction. + - `APPLY_LOAD_MODE="benchmark"`: benchmarks a fixed-size ledger of model + transactions. Use `APPLY_LOAD_MODEL_TX` to select the model transaction; + currently only `"sac"` is supported. * Load generation is configured in the Core config file. The relevant settings all begin with `APPLY_LOAD_`. See full example configurations with per-setting documentation in the `docs` directory @@ -201,11 +205,25 @@ Command options can only by placed after command. multiple times (default latest) * `--base-instance ` : run tests with instance numbers offset by N, used to run tests in parallel + * `--capture-lcm` : capture `LedgerCloseMeta` XDR from every + `closeLedger`/`closeLedgerOn` call during tests. Files are written + automatically at leaf-section boundaries (or test-case boundaries for + tests without sections) to `test-lcm//`. Each file + is named with a truncated SHA-256 hash of the test/section path + (e.g. `a1b2c3d4e5f67890.xdr`), and an `index.json` in each + directory maps hashes back to human-readable names. Each file contains + stream-framed `LedgerCloseMeta` entries that can be decoded with + `stellar-xdr decode --type LedgerCloseMeta --input stream-framed`. + Meta is normalized (sorted) before writing so that output is + deterministic given a fixed `--rng-seed`. + * The network passphrase is set to `(V) (;,,;) (V)` for all captured meta. * For [further info](https://github.com/philsquared/Catch/blob/master/docs/command-line.md) on possible options for test. * For example this will run just the tests tagged with `[tx]` using protocol versions 9 and 10 and stop after the first failure: `stellar-core test -a --version 9 --version 10 "[tx]"` + * The checked-in files under `test-lcm/` were generated with: + `stellar-core test --rng-seed 12345 '[tx]' --capture-lcm` * **upgrade-db**: Upgrades local database to current schema version. This is usually done automatically during stellar-core run or other command. * **verify-checkpoints**: Listens to the network until it observes a consensus @@ -252,6 +270,28 @@ Most commands return their results in JSON format. * **bans** List current active bans +* **banaccounts** + Manages the persistent list of banned accounts. Banned accounts are stored in + the database and survive restarts. Any transaction whose source account, + operation source account, fee-bump fee source, or (for Soroban transactions) + write footprint account entry matches a banned address will be rejected from + the transaction queue. + * `banaccounts`
+ Lists the currently banned account addresses as a JSON array.
+ * `banaccounts?accountids=G_ADDRESS1,G_ADDRESS2,...`
+ Adds the specified addresses to the persistent ban list. Existing bans are + preserved (additive).
+ + Note: The `FILTERED_G_ADDRESSES` configuration option is deprecated. Any + addresses configured there will be automatically migrated to the persistent + ban list on startup. + +* **unbanaccounts** + * `unbanaccounts`
+ Clears all banned accounts.
+ * `unbanaccounts?accountids=G_ADDRESS1,G_ADDRESS2,...`
+ Removes the specified addresses from the persistent ban list.
+ * **checkdb** Triggers the instance to perform a background check of the database's state. @@ -279,11 +319,6 @@ Most commands return their results in JSON format. * **logrotate** Rotate log files. -* **maintenance** - `maintenance?[queue=true]`
- Performs maintenance tasks on the instance. - * `queue` performs deletion of queue data. See `setcursor` for more information. - * **metrics** `metrics?[enable=PARTITION_1,PARTITION_2,...,PARTITION_N]`
Returns a snapshot of the metrics registry (for monitoring and debugging @@ -342,6 +377,12 @@ Most commands return their results in JSON format. The network is under high load and the fee is too low. * "FILTERED" - transaction rejected because it contains an operation type that Stellar Core filters out. See Stellar Core configuration `EXCLUDE_TRANSACTIONS_CONTAINING_OPERATION_TYPE` for more details. + Optional parameters: + * `force=true` - bypasses banned account filtering (see `banaccounts`), + allowing the transaction into the mempool even if its source account or + fee source is on the ban list. Other filtering (operation type, Soroban + key filtering) still applies. Example: `tx?blob=Base64&force=true` + * **upgrades** * `upgrades?mode=get`
Retrieves the currently configured upgrade settings.
@@ -420,20 +461,6 @@ Most commands return their results in JSON format. `sorobaninfo?format=detailed` command to compare against the existing settings to see exactly what is changing. -* **surveytopology** - `surveytopology?duration=DURATION&node=NODE_ID`
- **This command is deprecated and will be removed in a future release. Use the - new time sliced survey interface instead (`startsurveycollecting`, - `stopsurveycollecting`, `surveytopologytimesliced`, and `getsurveyresults`).** - Starts a survey that will request peer connectivity information from nodes - in the backlog. `DURATION` is the number of seconds this survey will run - for, and `NODE_ID` is the public key you will add to the backlog to survey. - Running this command while the survey is running will add the node to the - backlog and reset the timer to run for `DURATION` seconds. See [Changing - default survey behavior](#changing-default-survey-behavior) for details about - the default survey behavior, as well as how to change that behavior or opt-out - entirely. - * **stopsurvey** `stopsurvey`
Will stop the survey if one is running. Noop if no survey is running diff --git a/docs/stellar-core_example.cfg b/docs/stellar-core_example.cfg index 05a77efc3a..172e952cdc 100644 --- a/docs/stellar-core_example.cfg +++ b/docs/stellar-core_example.cfg @@ -333,6 +333,11 @@ KNOWN_PEERS=[ # This example also adds a common name to NODE_NAMES list named `self` with the # public key associated to this seed NODE_SEED="SBI3CZU7XZEWVXU7OZLW5MMUQAP334JFOPXSLTPOH43IRTEQ2QYXU5RG self" +# +# You can also load the seed from a file (must have permissions 0600 on Unix): +# NODE_SEED="$FILE:/etc/stellar/node_seed" +# The file should contain the full seed string, optionally followed by a +# space and a common name (e.g., "SBI3CZU7... self"). # NODE_IS_VALIDATOR (boolean) default false. # Only nodes that want to participate in SCP should set NODE_IS_VALIDATOR=true. @@ -417,19 +422,6 @@ QUORUM_INTERSECTION_CHECKER=true # This limits the number that will be active at a time. MAX_CONCURRENT_SUBPROCESSES=16 -# AUTOMATIC_MAINTENANCE_PERIOD (integer, seconds) default 359 -# Interval between automatic maintenance executions -# Set to 0 to disable automatic maintenance -AUTOMATIC_MAINTENANCE_PERIOD=359 - -# AUTOMATIC_MAINTENANCE_COUNT (integer) default 400 -# Number of unneeded ledgers in each table that will be removed during one -# maintenance run. -# NB: make sure that enough ledgers are deleted as to offset the growth of -# data accumulated by closing ledgers (catchup and normal operation) -# Set to 0 to disable automatic maintenance -AUTOMATIC_MAINTENANCE_COUNT=400 - # AUTOMATIC_SELF_CHECK_PERIOD (integer, seconds) default 10800 # Interval between automatic self-checks, including connectivity # and consistency checking against configured history archives. diff --git a/lib/autocheck/include/autocheck/classifier.hpp b/lib/autocheck/include/autocheck/classifier.hpp index 76fc9dedc7..7308886724 100644 --- a/lib/autocheck/include/autocheck/classifier.hpp +++ b/lib/autocheck/include/autocheck/classifier.hpp @@ -38,7 +38,7 @@ namespace autocheck { typename Func, typename Enable = typename std::enable_if< !std::is_convertible< - typename std::result_of::type, + std::invoke_result_t, std::string >::value >::type diff --git a/lib/fmt b/lib/fmt index e69e5f977d..407c905e45 160000 --- a/lib/fmt +++ b/lib/fmt @@ -1 +1 @@ -Subproject commit e69e5f977d458f2650bb346dadf2ad30c5320281 +Subproject commit 407c905e45ad75fc29bf0f9bb7c5c2fd3475976f diff --git a/lib/spdlog b/lib/spdlog index 7e635fca68..79524ddd08 160000 --- a/lib/spdlog +++ b/lib/spdlog @@ -1 +1 @@ -Subproject commit 7e635fca68d014934b4af8a1cf874f63989352b7 +Subproject commit 79524ddd08a4ec981b7fea76afd08ee05f83755d diff --git a/lib/util/basen.h b/lib/util/basen.h index 84bf7b1f2a..caec728f8e 100644 --- a/lib/util/basen.h +++ b/lib/util/basen.h @@ -1,5 +1,3 @@ -#pragma once - /** * base-n, 1.0 * Copyright (C) 2012 Andrzej Zawadzki (azawadzki@gmail.com) diff --git a/lib/xdrpp b/lib/xdrpp index 8e1fe06581..3e2179812d 160000 --- a/lib/xdrpp +++ b/lib/xdrpp @@ -1 +1 @@ -Subproject commit 8e1fe06581060a970afcb934de4b4645b0d5d350 +Subproject commit 3e2179812d95725767785e47f12e379dda77048a diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4 index 0b6cb3a7d7..d805957056 100644 --- a/m4/ax_cxx_compile_stdcxx.m4 +++ b/m4/ax_cxx_compile_stdcxx.m4 @@ -10,13 +10,13 @@ # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) -# or '14' (for the C++14 standard). +# CXXCPP to enable support. VERSION may be '11', '14', '17', '20', or +# '23' for the respective C++ standard version. # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with -# preference for an extended mode. +# preference for no added switch, and then for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is @@ -34,13 +34,17 @@ # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016, 2018 Krzesimir Nowak +# Copyright (c) 2019 Enji Cooper +# Copyright (c) 2020 Jason Merrill +# Copyright (c) 2021, 2024 Jörn Heusipp +# Copyright (c) 2015, 2022, 2023, 2024 Olly Betts # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 9 +#serial 25 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). @@ -49,6 +53,8 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [$1], [20], [ax_cxx_compile_alternatives="20"], + [$1], [23], [ax_cxx_compile_alternatives="23"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], @@ -61,6 +67,16 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl AC_LANG_PUSH([C++])dnl ac_success=no + m4_if([$2], [], [dnl + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi]) + m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do @@ -90,9 +106,18 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" + dnl MSVC needs -std:c++NN for C++17 and later (default is C++14) for alternative in ${ax_cxx_compile_alternatives}; do - for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do + if test x"$switch" = xMSVC; then + dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide + dnl with -std=c++17. We suffix the cache variable name with _MSVC to + dnl avoid this. + switch=-std:c++${alternative} + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC]) + else + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + fi AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" @@ -136,23 +161,44 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11] ) - dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14] ) +dnl Test body for checking C++17 support + m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17] +) + +dnl Test body for checking C++20 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20] ) +dnl Test body for checking C++23 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_23], + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_23] +) + + dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ @@ -164,7 +210,21 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 201103L +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. +#elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -189,11 +249,13 @@ namespace cxx11 struct Base { + virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { + virtual ~Derived() override {} virtual void f() override {} }; @@ -453,7 +515,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 201402L +#elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" @@ -577,20 +639,12 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ #error "This is not a C++ compiler" -#elif __cplusplus <= 201402L +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L #error "This is not a C++17 compiler" #else -#if defined(__clang__) - #define REALLY_CLANG -#else - #if defined(__GNUC__) - #define REALLY_GCC - #endif -#endif - #include #include #include @@ -598,16 +652,12 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ namespace cxx17 { -#if !defined(REALLY_CLANG) namespace test_constexpr_lambdas { - // TODO: test it with clang++ from git - constexpr int foo = [](){return 42;}(); } -#endif // !defined(REALLY_CLANG) namespace test::nested_namespace::definitions { @@ -842,12 +892,9 @@ namespace cxx17 } -#if !defined(REALLY_CLANG) namespace test_template_argument_deduction_for_class_templates { - // TODO: test it with clang++ from git - template struct pair { @@ -866,7 +913,6 @@ namespace cxx17 } } -#endif // !defined(REALLY_CLANG) namespace test_non_type_auto_template_parameters { @@ -880,12 +926,9 @@ namespace cxx17 } -#if !defined(REALLY_CLANG) namespace test_structured_bindings { - // TODO: test it with clang++ from git - int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; @@ -917,14 +960,10 @@ namespace cxx17 const auto [ x3, y3 ] = f3(); } -#endif // !defined(REALLY_CLANG) -#if !defined(REALLY_CLANG) namespace test_exception_spec_type_system { - // TODO: test it with clang++ from git - struct Good {}; struct Bad {}; @@ -942,7 +981,6 @@ namespace cxx17 static_assert (std::is_same_v); } -#endif // !defined(REALLY_CLANG) namespace test_inline_variables { @@ -967,6 +1005,66 @@ namespace cxx17 } // namespace cxx17 -#endif // __cplusplus <= 201402L +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L + +]]) + + +dnl Tests for new features in C++20 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L + +#error "This is not a C++20 compiler" + +#else + +#include + +namespace cxx20 +{ + +// As C++20 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx20 + +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L + +]]) + + +dnl Tests for new features in C++23 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_23], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L + +#error "This is not a C++23 compiler" + +#else + +#include + +namespace cxx23 +{ + +// As C++23 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx23 + +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L ]]) diff --git a/m4/ax_cxx_compile_stdcxx_14.m4 b/m4/ax_cxx_compile_stdcxx_14.m4 deleted file mode 100644 index 094db0d025..0000000000 --- a/m4/ax_cxx_compile_stdcxx_14.m4 +++ /dev/null @@ -1,34 +0,0 @@ -# ============================================================================= -# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_14.html -# ============================================================================= -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX_14([ext|noext], [mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the C++14 -# standard; if necessary, add switches to CXX and CXXCPP to enable -# support. -# -# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX -# macro with the version set to C++14. The two optional arguments are -# forwarded literally as the second and third argument respectively. -# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for -# more information. If you want to use this macro, you also need to -# download the ax_cxx_compile_stdcxx.m4 file. -# -# LICENSE -# -# Copyright (c) 2015 Moritz Klammler -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 5 - -AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) -AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [AX_CXX_COMPILE_STDCXX([14], [$1], [$2])]) diff --git a/scripts/apply_load/token/.gitignore b/scripts/apply_load/token/.gitignore new file mode 100644 index 0000000000..d74cc01f6f --- /dev/null +++ b/scripts/apply_load/token/.gitignore @@ -0,0 +1,6 @@ +# Rust's output directory +target + +# Local settings +.soroban +.stellar diff --git a/scripts/apply_load/token/Cargo.lock b/scripts/apply_load/token/Cargo.lock new file mode 100644 index 0000000000..1ae07055db --- /dev/null +++ b/scripts/apply_load/token/Cargo.lock @@ -0,0 +1,1847 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes-lit" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adabf37211a5276e46335feabcbb1530c95eb3fdf85f324c7db942770aa025d" +dependencies = [ + "num-bigint", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "cc" +version = "1.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crate-git-revision" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c521bf1f43d31ed2f73441775ed31935d77901cb3451e44b38a1c1612fcbaf98" +dependencies = [ + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dtor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "escape-bytes" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" + +[[package]] +name = "ethnum" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.8.22", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "soroban-builtin-sdk-macros" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9336adeabcd6f636a4e0889c8baf494658ef5a3c4e7e227569acd2ce9091e85" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "soroban-env-common" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00067f52e8bbf1abf0de03fe3e2fbb06910893cfbe9a7d9093d6425658833ff3" +dependencies = [ + "arbitrary", + "crate-git-revision", + "ethnum", + "num-derive", + "num-traits", + "serde", + "soroban-env-macros", + "soroban-wasmi", + "static_assertions", + "stellar-xdr", + "wasmparser", +] + +[[package]] +name = "soroban-env-guest" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd1e40963517b10963a8e404348d3fe6caf9c278ac47a6effd48771297374d6" +dependencies = [ + "soroban-env-common", + "static_assertions", +] + +[[package]] +name = "soroban-env-host" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9766c5ad78e9d8ae10afbc076301f7d610c16407a1ebb230766dbe007a48725" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "curve25519-dalek", + "ecdsa", + "ed25519-dalek", + "elliptic-curve", + "generic-array", + "getrandom", + "hex-literal", + "hmac", + "k256", + "num-derive", + "num-integer", + "num-traits", + "p256", + "rand", + "rand_chacha", + "sec1", + "sha2", + "sha3", + "soroban-builtin-sdk-macros", + "soroban-env-common", + "soroban-wasmi", + "static_assertions", + "stellar-strkey 0.0.13", + "wasmparser", +] + +[[package]] +name = "soroban-env-macros" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0e6a1c5844257ce96f5f54ef976035d5bd0ee6edefaf9f5e0bcb8ea4b34228c" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "serde", + "serde_json", + "stellar-xdr", + "syn 2.0.117", +] + +[[package]] +name = "soroban-ledger-snapshot" +version = "23.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea7299402f5f445089fde192cc68587baf0cc6432be300bce99d997fd85b4cb" +dependencies = [ + "serde", + "serde_json", + "serde_with", + "soroban-env-common", + "soroban-env-host", + "thiserror", +] + +[[package]] +name = "soroban-sdk" +version = "23.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1e11f9fd537f9df29ec1a66c1b78d666094df56e196565d292ebf9a72732b4" +dependencies = [ + "arbitrary", + "bytes-lit", + "crate-git-revision", + "ctor", + "derive_arbitrary", + "ed25519-dalek", + "rand", + "rustc_version", + "serde", + "serde_json", + "soroban-env-guest", + "soroban-env-host", + "soroban-ledger-snapshot", + "soroban-sdk-macros", + "stellar-strkey 0.0.16", + "visibility", +] + +[[package]] +name = "soroban-sdk-macros" +version = "23.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa7114e2f031b6fbd30376e844f3c55f6daf56f6f9d33ce309f846ffced316d" +dependencies = [ + "darling 0.20.11", + "heck", + "itertools", + "macro-string", + "proc-macro2", + "quote", + "sha2", + "soroban-env-common", + "soroban-spec", + "soroban-spec-rust", + "stellar-xdr", + "syn 2.0.117", +] + +[[package]] +name = "soroban-spec" +version = "23.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1303589e67e7c76d0571b8d797b75f9fa33a1ceb1b4361a981570a3ebf00ac19" +dependencies = [ + "base64", + "stellar-xdr", + "thiserror", + "wasmparser", +] + +[[package]] +name = "soroban-spec-rust" +version = "23.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956188f28b750b80a2bb4cd5698038746edae1be51ec19a29c7efc6dcd922e5f" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "sha2", + "soroban-spec", + "stellar-xdr", + "syn 2.0.117", + "thiserror", +] + +[[package]] +name = "soroban-wasmi" +version = "0.31.1-soroban.20.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719" +dependencies = [ + "smallvec", + "spin", + "wasmi_arena", + "wasmi_core", + "wasmparser-nostd", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stellar-access" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "974e461afe1538ee54dc9314ed46144f393265c7625606c240760cd6a2baaadf" +dependencies = [ + "soroban-sdk", +] + +[[package]] +name = "stellar-contract-utils" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a918daa29a4cfc0fe97118a2425893a0336a33b436e8f70ca4b4f5c739f23e4" +dependencies = [ + "soroban-sdk", +] + +[[package]] +name = "stellar-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb4b3dd8f599646dab3e949ba2febc3a060a194bc1a3711ddd5e7c275acfe5e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "stellar-strkey" +version = "0.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee1832fb50c651ad10f734aaf5d31ca5acdfb197a6ecda64d93fcdb8885af913" +dependencies = [ + "crate-git-revision", + "data-encoding", +] + +[[package]] +name = "stellar-strkey" +version = "0.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084afcb0d458c3d5d5baa2d294b18f881e62cc258ef539d8fdf68be7dbe45520" +dependencies = [ + "crate-git-revision", + "data-encoding", + "heapless", +] + +[[package]] +name = "stellar-tokens" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc8be39a374a3520726017623d7c79d7d0530e626778619ba8f9462037e37aa" +dependencies = [ + "soroban-sdk", + "stellar-contract-utils", +] + +[[package]] +name = "stellar-xdr" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d2848e1694b0c8db81fd812bfab5ea71ee28073e09ccc45620ef3cf7a75a9b" +dependencies = [ + "arbitrary", + "base64", + "cfg_eval", + "crate-git-revision", + "escape-bytes", + "ethnum", + "hex", + "serde", + "serde_with", + "sha2", + "stellar-strkey 0.0.13", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "token" +version = "0.0.1" +dependencies = [ + "soroban-sdk", + "stellar-access", + "stellar-contract-utils", + "stellar-macros", + "stellar-tokens", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmi_arena" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" + +[[package]] +name = "wasmi_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] + +[[package]] +name = "wasmparser" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" +dependencies = [ + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "wasmparser-nostd" +version = "0.100.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" +dependencies = [ + "indexmap-nostd", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/scripts/apply_load/token/Cargo.toml b/scripts/apply_load/token/Cargo.toml new file mode 100644 index 0000000000..d30aad578d --- /dev/null +++ b/scripts/apply_load/token/Cargo.toml @@ -0,0 +1,31 @@ +[workspace] +resolver = "2" +members = ["contracts/*"] + +[workspace.package] +authors = [] +edition = "2021" +license = "Apache-2.0" +version = "0.0.1" + +[workspace.dependencies] +soroban-sdk = "=23.5.3" +stellar-tokens = "=0.6.0" +stellar-access = "=0.6.0" +stellar-contract-utils = "=0.6.0" +stellar-macros = "=0.6.0" + + +[profile.release] +opt-level = "z" +overflow-checks = true +debug = 0 +strip = "symbols" +debug-assertions = false +panic = "abort" +codegen-units = 1 +lto = true + +[profile.release-with-logs] +inherits = "release" +debug-assertions = true diff --git a/scripts/apply_load/token/contracts/token/Cargo.toml b/scripts/apply_load/token/contracts/token/Cargo.toml new file mode 100644 index 0000000000..3c37420b06 --- /dev/null +++ b/scripts/apply_load/token/contracts/token/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "token" +edition.workspace = true +license.workspace = true +publish = false +version.workspace = true + +[package.metadata.stellar] +cargo_inherit = true + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +stellar-tokens = { workspace = true } +stellar-access = { workspace = true } +stellar-contract-utils = { workspace = true } +stellar-macros = { workspace = true } +soroban-sdk = { workspace = true } + +[dev-dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/scripts/apply_load/token/contracts/token/src/contract.rs b/scripts/apply_load/token/contracts/token/src/contract.rs new file mode 100644 index 0000000000..891417daa1 --- /dev/null +++ b/scripts/apply_load/token/contracts/token/src/contract.rs @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.6.0 +// Generated with OpenZeppelin Contracts Wizard. + + +use soroban_sdk::{ + Address, contract, contractimpl, Env, MuxedAddress, String, Vec +}; +use stellar_access::ownable::{self as ownable, Ownable}; +use stellar_contract_utils::pausable::{self as pausable, Pausable}; +use stellar_contract_utils::upgradeable::UpgradeableInternal; +use stellar_macros::{only_owner, Upgradeable, when_not_paused}; +use stellar_tokens::fungible::{Base, burnable::FungibleBurnable, FungibleToken}; + +#[derive(Upgradeable)] +#[contract] +pub struct ApplyLoadToken; + +#[contractimpl] +impl ApplyLoadToken { + pub fn __constructor(e: &Env, owner: Address) { + Base::set_metadata(e, 7, String::from_str(e, "ApplyLoadToken"), String::from_str(e, "ALT")); + ownable::set_owner(e, &owner); + } + + #[only_owner] + #[when_not_paused] + pub fn multi_mint(e: &Env, accounts: Vec
, amount: i128) { + for account in accounts.iter() { + Base::mint(e, &account, amount); + } + } +} + +#[contractimpl(contracttrait)] +impl FungibleToken for ApplyLoadToken { + type ContractType = Base; + + #[when_not_paused] + fn transfer(e: &Env, from: Address, to: MuxedAddress, amount: i128) { + Self::ContractType::transfer(e, &from, &to, amount); + } + + #[when_not_paused] + fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) { + Self::ContractType::transfer_from(e, &spender, &from, &to, amount); + } +} + +// +// Extensions +// + +#[contractimpl(contracttrait)] +impl FungibleBurnable for ApplyLoadToken { + #[when_not_paused] + fn burn(e: &Env, from: Address, amount: i128) { + Base::burn(e, &from, amount); + } + + #[when_not_paused] + fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) { + Base::burn_from(e, &spender, &from, amount); + } +} + +// +// Utils +// + +impl UpgradeableInternal for ApplyLoadToken { + fn _require_auth(e: &Env, _operator: &Address) { + ownable::enforce_owner_auth(e); + } +} + +#[contractimpl(contracttrait)] +impl Ownable for ApplyLoadToken {} + +#[contractimpl] +impl Pausable for ApplyLoadToken { + fn paused(e: &Env) -> bool { + pausable::paused(e) + } + + #[only_owner] + fn pause(e: &Env, _caller: Address) { + pausable::pause(e); + } + + #[only_owner] + fn unpause(e: &Env, _caller: Address) { + pausable::unpause(e); + } +} diff --git a/scripts/apply_load/token/contracts/token/src/lib.rs b/scripts/apply_load/token/contracts/token/src/lib.rs new file mode 100644 index 0000000000..0dfb9691c8 --- /dev/null +++ b/scripts/apply_load/token/contracts/token/src/lib.rs @@ -0,0 +1,5 @@ +#![no_std] +#![allow(dead_code)] + +mod contract; +mod test; diff --git a/scripts/apply_load/token/contracts/token/src/test.rs b/scripts/apply_load/token/contracts/token/src/test.rs new file mode 100644 index 0000000000..68562ce71f --- /dev/null +++ b/scripts/apply_load/token/contracts/token/src/test.rs @@ -0,0 +1,65 @@ +#![cfg(test)] + +extern crate std; + +use soroban_sdk::{ + symbol_short, + testutils::{Address as _, AuthorizedFunction, AuthorizedInvocation}, + vec, Address, Env, IntoVal, MuxedAddress, Symbol, +}; + +use crate::contract::{ApplyLoadToken, ApplyLoadTokenClient}; + +#[test] +fn test_multi_mint_and_transfer() { + let env = Env::default(); + env.mock_all_auths(); + + let owner = Address::generate(&env); + let alice = Address::generate(&env); + let bob = Address::generate(&env); + + let contract_addr = env.register(ApplyLoadToken, (owner.clone(),)); + let client = ApplyLoadTokenClient::new(&env, &contract_addr); + + let recipients = vec![&env, alice.clone(), bob.clone()]; + client.multi_mint(&recipients, &100); + + assert_eq!( + env.auths(), + std::vec![( + owner.clone(), + AuthorizedInvocation { + function: AuthorizedFunction::Contract(( + client.address.clone(), + Symbol::new(&env, "multi_mint"), + (recipients.clone(), 100_i128).into_val(&env), + )), + sub_invocations: std::vec![], + }, + )] + ); + + assert_eq!(client.balance(&alice), 100); + assert_eq!(client.balance(&bob), 100); + + client.transfer(&alice, &MuxedAddress::from(bob.clone()), &40); + + assert_eq!( + env.auths(), + std::vec![( + alice.clone(), + AuthorizedInvocation { + function: AuthorizedFunction::Contract(( + client.address.clone(), + symbol_short!("transfer"), + (alice.clone(), MuxedAddress::from(bob.clone()), 40_i128,).into_val(&env), + )), + sub_invocations: std::vec![], + }, + )] + ); + + assert_eq!(client.balance(&alice), 60); + assert_eq!(client.balance(&bob), 140); +} diff --git a/scripts/apply_load/token/contracts/token/test_snapshots/test/initial_state.1.json b/scripts/apply_load/token/contracts/token/test_snapshots/test/initial_state.1.json new file mode 100644 index 0000000000..ddb4cac0b1 --- /dev/null +++ b/scripts/apply_load/token/contracts/token/test_snapshots/test/initial_state.1.json @@ -0,0 +1,123 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "ApplyLoadToken" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "ALT" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Owner" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/scripts/apply_load/token/contracts/token/test_snapshots/test/smoke_multi_mint_and_transfer.1.json b/scripts/apply_load/token/contracts/token/test_snapshots/test/smoke_multi_mint_and_transfer.1.json new file mode 100644 index 0000000000..cfa902662b --- /dev/null +++ b/scripts/apply_load/token/contracts/token/test_snapshots/test/smoke_multi_mint_and_transfer.1.json @@ -0,0 +1,348 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "multi_mint", + "args": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "i128": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "40" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "60" + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "140" + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "ApplyLoadToken" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "ALT" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Owner" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": "200" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/scripts/run_apply_load_matrix.py b/scripts/run_apply_load_matrix.py new file mode 100644 index 0000000000..2f7bf908d6 --- /dev/null +++ b/scripts/run_apply_load_matrix.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import csv +import hashlib +import re +import shutil +import subprocess +import sys +import tempfile +from dataclasses import dataclass +from datetime import datetime, timezone +from pathlib import Path + + +SCRIPT_DIR = Path(__file__).resolve().parent +DEFAULT_STELLAR_CORE_BIN = SCRIPT_DIR.parent / "src" / "stellar-core" +DEFAULT_TEMPLATE_CONFIG = SCRIPT_DIR.parent / "docs" / "apply-load-benchmark-sac.cfg" +DEFAULT_OUTPUT_ROOT = Path.home() / "apply-load" +APPLY_LOAD_NUM_LEDGERS = 200 + +FLOAT_RE = r"([-+]?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?)" +RESULT_PATTERNS = { + "median_time_ms": re.compile(rf"p50 close time:\s+{FLOAT_RE}\s+ms"), + "p95_time_ms": re.compile(rf"p95 close time:\s+{FLOAT_RE}\s+ms"), + "p99_time_ms": re.compile(rf"p99 close time:\s+{FLOAT_RE}\s+ms"), +} + + +@dataclass(frozen=True, slots=True) +class Scenario: + model_tx: str + tx_count: int + thread_count: int + time_writes: bool = True + disable_metrics: bool = True + sac_batch_size: int = 1 + + def __post_init__(self) -> None: + if self.sac_batch_size <= 0: + raise ValueError("sac_batch_size must be positive") + + if self.model_tx == "sac": + if self.sac_batch_size <= 0: + raise ValueError( + f"Scenario '{self.identifier()}' must define a positive SAC batch size" + ) + elif self.sac_batch_size != 1: + raise ValueError( + "sac_batch_size can only differ from 1 for model_tx='sac'" + ) + + def identifier(self) -> str: + parts = [self.model_tx, f"TX={self.tx_count}", f"T={self.thread_count}"] + if not self.time_writes: + parts.append("TW=0") + if not self.disable_metrics: + parts.append("DM=0") + if self.model_tx == "sac" and self.sac_batch_size != 1: + parts.append(f"B={self.sac_batch_size}") + return ",".join(parts) + + def slug(self) -> str: + return re.sub(r"[^a-z0-9]+", "-", self.identifier().lower()).strip("-") + + def summary(self) -> str: + return self.identifier() + + +SCENARIOS: tuple[Scenario, ...] = ( + Scenario( + model_tx="sac", + tx_count=6400, + thread_count=1, + ), + Scenario( + model_tx="sac", + tx_count=6400, + thread_count=8, + ), + Scenario( + model_tx="custom_token", + tx_count=3000, + thread_count=1, + ), + Scenario( + model_tx="custom_token", + tx_count=3000, + thread_count=8, + ), + Scenario( + model_tx="soroswap", + tx_count=1600, + thread_count=1, + ), + Scenario( + model_tx="soroswap", + tx_count=1600, + thread_count=8, + ), +) + + +def validate_scenarios(scenarios: tuple[Scenario, ...]) -> None: + seen_identifiers: set[str] = set() + for scenario in scenarios: + identifier = scenario.identifier() + if identifier in seen_identifiers: + raise ValueError(f"Duplicate scenario identifier: {identifier}") + seen_identifiers.add(identifier) + + if scenario.model_tx != "sac": + continue + + if scenario.tx_count % scenario.sac_batch_size != 0: + raise ValueError( + "Invalid SAC scenario " + f"{identifier}: TX must be divisible by B" + ) + + sac_tx_envelopes = scenario.tx_count // scenario.sac_batch_size + if sac_tx_envelopes < scenario.thread_count: + raise ValueError( + "Invalid SAC scenario " + f"{identifier}: TX / B must be at least T" + ) + + if scenario.sac_batch_size > 1 and sac_tx_envelopes % scenario.thread_count != 0: + raise ValueError( + "Invalid SAC scenario " + f"{identifier}: TX / B must be divisible by T when B > 1" + ) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Run a fixed matrix of apply-load scenarios and emit a CSV summary.", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser.add_argument( + "--stellar-core-bin", + type=Path, + default=DEFAULT_STELLAR_CORE_BIN, + help="Path to the stellar-core executable to run.", + ) + parser.add_argument( + "--template-config", + type=Path, + default=DEFAULT_TEMPLATE_CONFIG, + help="Path to the benchmark apply-load template config.", + ) + parser.add_argument( + "--output-root", + type=Path, + default=DEFAULT_OUTPUT_ROOT, + help="Directory where apply-load// outputs should be written.", + ) + parser.add_argument( + "--build-tag", + help="Optional build tag to embed in the run identifier. Defaults to a hash of `stellar-core version` output.", + ) + return parser.parse_args() + + +def bool_literal(value: bool) -> str: + return "true" if value else "false" + + +def quoted(value: str) -> str: + return f'"{value}"' + + +def sanitize_tag(tag: str) -> str: + cleaned = re.sub(r"[^a-zA-Z0-9._-]+", "-", tag.strip()).strip("-._") + if not cleaned: + raise ValueError("Build tag is empty after sanitization") + return cleaned.lower() + + +def run_command(command: list[str], *, cwd: Path) -> subprocess.CompletedProcess[str]: + return subprocess.run( + command, + cwd=cwd, + text=True, + capture_output=True, + check=False, + ) + + +def get_version_string(stellar_core_bin: Path) -> str: + result = run_command([str(stellar_core_bin), "version"], cwd=stellar_core_bin.parent) + if result.returncode != 0: + raise RuntimeError( + "Failed to run `stellar-core version`:\n" + f"stdout:\n{result.stdout}\n" + f"stderr:\n{result.stderr}" + ) + version_parts = [] + if result.stderr.strip(): + version_parts.append(result.stderr.strip()) + if result.stdout.strip(): + version_parts.append(result.stdout.strip()) + version_text = "\n".join(version_parts) + if not version_text: + raise RuntimeError("`stellar-core version` produced empty output") + return version_text + + +def derive_build_tag(version_text: str, user_build_tag: str | None) -> str: + if user_build_tag: + return sanitize_tag(user_build_tag) + version_hash = hashlib.sha256(version_text.encode("utf-8")).hexdigest()[:12] + return version_hash + + +def create_run_id(build_tag: str) -> str: + timestamp = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S") + return f"{build_tag}-{timestamp}" + + +def read_template_config(template_config: Path) -> str: + try: + return template_config.read_text(encoding="utf-8") + except FileNotFoundError as exc: + raise FileNotFoundError(f"Template config not found: {template_config}") from exc + + +def apply_overrides(template_text: str, overrides: dict[str, str]) -> str: + lines = template_text.splitlines() + seen_keys: set[str] = set() + rendered_lines: list[str] = [] + key_pattern = re.compile(r"^(\s*)([A-Z0-9_]+)\s*=.*$") + section_pattern = re.compile(r"^\s*\[[^\]]+\]\s*$") + first_section_index: int | None = None + + for line in lines: + if first_section_index is None and section_pattern.match(line): + first_section_index = len(rendered_lines) + + match = key_pattern.match(line) + if match: + indent, key = match.groups() + if key in overrides: + rendered_lines.append(f"{indent}{key} = {overrides[key]}") + seen_keys.add(key) + continue + rendered_lines.append(line) + + missing_keys = [key for key in overrides if key not in seen_keys] + if missing_keys: + insertion_lines = ["# Overrides added by run_apply_load_matrix.py"] + insertion_lines.extend(f"{key} = {overrides[key]}" for key in missing_keys) + + if first_section_index is None: + if rendered_lines and rendered_lines[-1] != "": + rendered_lines.append("") + rendered_lines.extend(insertion_lines) + else: + if first_section_index > 0 and rendered_lines[first_section_index - 1] != "": + insertion_lines.insert(0, "") + first_section_index += 1 + insertion_lines.append("") + rendered_lines[first_section_index:first_section_index] = insertion_lines + + return "\n".join(rendered_lines) + "\n" + + +def build_config_text(template_text: str, scenario: Scenario, log_name: str) -> str: + overrides = { + "APPLY_LOAD_MODEL_TX": quoted(scenario.model_tx), + "APPLY_LOAD_MAX_SOROBAN_TX_COUNT": str(scenario.tx_count), + "APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS": str(scenario.thread_count), + "APPLY_LOAD_TIME_WRITES": bool_literal(scenario.time_writes), + "DISABLE_SOROBAN_METRICS_FOR_TESTING": bool_literal(scenario.disable_metrics), + "APPLY_LOAD_NUM_LEDGERS": str(APPLY_LOAD_NUM_LEDGERS), + "LOG_FILE_PATH": quoted(log_name), + } + if scenario.model_tx == "sac": + overrides["APPLY_LOAD_BATCH_SAC_COUNT"] = str(scenario.sac_batch_size) + return apply_overrides(template_text, overrides) + + +def parse_benchmark_results(log_path: Path) -> dict[str, float]: + log_text = log_path.read_text(encoding="utf-8") + parsed: dict[str, float] = {} + for field_name, pattern in RESULT_PATTERNS.items(): + matches = pattern.findall(log_text) + if not matches: + raise RuntimeError( + f"Could not find `{field_name}` in benchmark log {log_path}" + ) + parsed[field_name] = float(matches[-1]) + return parsed + + +def write_csv_header(results_csv: Path) -> None: + with results_csv.open("w", newline="", encoding="utf-8") as output_file: + writer = csv.DictWriter( + output_file, + fieldnames=["scenario", "median_time_ms", "p95_time_ms", "p99_time_ms"], + ) + writer.writeheader() + + +def append_csv_row(results_csv: Path, row: dict[str, str | float]) -> None: + with results_csv.open("a", newline="", encoding="utf-8") as output_file: + writer = csv.DictWriter( + output_file, + fieldnames=["scenario", "median_time_ms", "p95_time_ms", "p99_time_ms"], + ) + writer.writerow(row) + + +def ensure_inputs(stellar_core_bin: Path, template_config: Path) -> tuple[Path, Path]: + stellar_core_bin = stellar_core_bin.expanduser().resolve() + template_config = template_config.expanduser().resolve() + + if not stellar_core_bin.exists(): + raise FileNotFoundError(f"stellar-core binary not found: {stellar_core_bin}") + if not stellar_core_bin.is_file(): + raise FileNotFoundError(f"stellar-core path is not a file: {stellar_core_bin}") + if not template_config.exists(): + raise FileNotFoundError(f"Template config not found: {template_config}") + + return stellar_core_bin, template_config + + +def run_scenario( + scenario_index: int, + scenario: Scenario, + *, + stellar_core_bin: Path, + template_text: str, + run_id: str, + logs_dir: Path, +) -> dict[str, float]: + log_name = f"{run_id}-{scenario_index:02d}-{scenario.slug()}.log" + with tempfile.TemporaryDirectory(prefix=f"apply-load-{scenario.slug()}-") as temp_dir: + work_dir = Path(temp_dir) + config_text = build_config_text(template_text, scenario, log_name) + config_path = work_dir / "apply-load.cfg" + config_path.write_text(config_text, encoding="utf-8") + + print(f"Running {scenario.summary()}") + result = run_command( + [str(stellar_core_bin), "--conf", str(config_path), "apply-load"], + cwd=work_dir, + ) + + scenario_log = work_dir / log_name + if scenario_log.exists(): + shutil.copy2(scenario_log, logs_dir / log_name) + + if result.returncode != 0: + raise RuntimeError( + f"Scenario '{scenario.identifier()}' failed with exit code {result.returncode}.\n" + f"stdout:\n{result.stdout}\n" + f"stderr:\n{result.stderr}" + ) + + if not scenario_log.exists(): + raise RuntimeError( + f"Scenario '{scenario.identifier()}' completed but did not produce log file {log_name}" + ) + + return parse_benchmark_results(scenario_log) + + +def main() -> int: + args = parse_args() + + try: + stellar_core_bin, template_config = ensure_inputs( + args.stellar_core_bin, args.template_config + ) + scenarios = SCENARIOS + validate_scenarios(scenarios) + version_text = get_version_string(stellar_core_bin) + build_tag = derive_build_tag(version_text, args.build_tag) + run_id = create_run_id(build_tag) + output_root = args.output_root.expanduser().resolve() + run_dir = output_root / run_id + logs_dir = run_dir / "logs" + results_csv = run_dir / "results.csv" + stamp_path = run_dir / "stamp" + template_text = read_template_config(template_config) + except Exception as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + try: + logs_dir.mkdir(parents=True, exist_ok=False) + except FileExistsError: + print(f"Error: run directory already exists: {run_dir}", file=sys.stderr) + return 1 + + stamp_path.write_text(version_text + "\n\n" + f"Benchmark ledgers={APPLY_LOAD_NUM_LEDGERS}", encoding="utf-8") + write_csv_header(results_csv) + + print(f"Run ID: {run_id}") + print(f"Version stamp: {stamp_path}") + print(f"Results CSV: {results_csv}") + + try: + for scenario_index, scenario in enumerate(scenarios, start=1): + metrics = run_scenario( + scenario_index, + scenario, + stellar_core_bin=stellar_core_bin, + template_text=template_text, + run_id=run_id, + logs_dir=logs_dir, + ) + append_csv_row( + results_csv, + { + "scenario": scenario.summary(), + "median_time_ms": metrics["median_time_ms"], + "p95_time_ms": metrics["p95_time_ms"], + "p99_time_ms": metrics["p99_time_ms"], + }, + ) + print( + "Captured " + f"median={metrics['median_time_ms']}ms, " + f"p95={metrics['p95_time_ms']}ms, " + f"p99={metrics['p99_time_ms']}ms" + ) + except Exception as exc: + print(f"Error: {exc}", file=sys.stderr) + print(f"Partial outputs retained in {run_dir}", file=sys.stderr) + return 1 + + print(f"Completed {len(scenarios)} scenario(s). Outputs written to {run_dir}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/soroban-settings/testnet_settings_upgrade.json b/soroban-settings/testnet_settings_upgrade.json index f9832b6233..1d09766f77 100644 --- a/soroban-settings/testnet_settings_upgrade.json +++ b/soroban-settings/testnet_settings_upgrade.json @@ -788,7 +788,7 @@ }, { "contract_ledger_cost_ext_v0": { - "tx_max_footprint_entries": 200, + "tx_max_footprint_entries": 400, "fee_write1_kb": "875" } }, diff --git a/src/Makefile.am b/src/Makefile.am index eaa9684a05..2eee3584ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -125,6 +125,7 @@ RUST_TOOLCHAIN_FILE=$(top_srcdir)/rust-toolchain.toml RUST_TOOLCHAIN_CHANNEL=$(shell sed -n 's/channel *= *"\([^"]*\)"/\1/p' $(RUST_TOOLCHAIN_FILE)) endif CARGO=cargo +$(RUST_TOOLCHAIN_CHANNEL) +RUSTC_WRAPPER=@RUSTC_WRAPPER@ # we pass some configuration by environment variable # to tests since they can't take command-line arguments. @@ -187,8 +188,8 @@ SOROBAN_BUILD_DIR=$(abspath $(RUST_BUILD_DIR))/soroban # variable empty (and include or exclude submodules from the list of # ALL_SOROBAN_PROTOCOLS as you see fit). -ALL_SOROBAN_PROTOCOLS=p21 p22 p23 p24 p25 -WIP_SOROBAN_PROTOCOL=p26 +ALL_SOROBAN_PROTOCOLS=p21 p22 p23 p24 p25 p26 +WIP_SOROBAN_PROTOCOL= if ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION ALL_SOROBAN_PROTOCOLS+=$(WIP_SOROBAN_PROTOCOL) @@ -207,6 +208,10 @@ define soroban_lib_dir $(shell printf '$(SOROBAN_BUILD_DIR)/%s/target/$(RUST_PROFILE_DIR)' $(1)) endef +define soroban_git_state_stamp +$(shell printf '%s/%s/target/git-state.txt' $(SOROBAN_BUILD_DIR) $(1)) +endef + define soroban_rlib $(shell printf -- '%s/libsoroban_env_host.rlib' $(call soroban_lib_dir,$(1))) endef @@ -220,12 +225,14 @@ $(shell printf -- '-L dependency=%s/deps' $(call soroban_lib_dir,$(1))) endef ALL_SOROBAN_LIBS=$(foreach proto,$(ALL_SOROBAN_PROTOCOLS),$(call soroban_rlib,$(proto))) +ALL_SOROBAN_GIT_STATE_STAMPS=$(foreach proto,$(ALL_SOROBAN_PROTOCOLS),$(call soroban_git_state_stamp,$(proto))) ALL_SOROBAN_EXTERN_ARGS=$(foreach proto,$(ALL_SOROBAN_PROTOCOLS),$(call soroban_extern_flag,$(proto))) ALL_SOROBAN_DEPEND_ARGS=$(foreach proto,$(ALL_SOROBAN_PROTOCOLS),$(call soroban_depend_flag,$(proto))) +SOROBAN_LIBS_STATE=$(shell cat $(SOROBAN_LIBS_STAMP) 2>/dev/null || echo no-soroban-libs) $(RUST_CXXBRIDGE): Makefile $(RUST_TOOLCHAIN_FILE) mkdir -p $(RUST_BIN_DIR) - CARGO_HTTP_MULTIPLEXING=false $(CARGO) install --force --locked --root $(RUST_BUILD_DIR) cxxbridge-cmd --version 1.0.68 + RUSTC_WRAPPER="$(RUSTC_WRAPPER)" CARGO_HTTP_MULTIPLEXING=false $(CARGO) install --force --locked --root $(RUST_BUILD_DIR) cxxbridge-cmd --version 1.0.68 rust/RustBridge.h: rust/src/bridge.rs $(SRC_RUST_FILES) Makefile $(RUST_CXXBRIDGE) $(RUST_CXXBRIDGE) $< --cfg test=false --header --output $@.tmp @@ -254,6 +261,17 @@ $(RUST_DEP_TREE_STAMP): $(wildcard rust/soroban/*/Cargo.*) Makefile $(RUST_TOOLC done touch $@ +# soroban-env-common embeds GIT_REVISION from submodule git state, so a pure +# submodule commit move must invalidate the host build even when Cargo.lock and +# tracked Rust sources are otherwise unchanged. +$(SOROBAN_BUILD_DIR)/%/target/git-state.txt: $(top_srcdir)/.git/modules/src/rust/soroban/%/HEAD $(top_srcdir)/.git/modules/src/rust/soroban/%/index Makefile $(RUST_TOOLCHAIN_FILE) + mkdir -p $(@D) + @state=$$(cd $(abspath $(top_srcdir))/src/rust/soroban/$* \ + && git describe --always --exclude='*' --long --abbrev=1000 --dirty 2>/dev/null \ + || git rev-parse HEAD); \ + printf '%s\n' "$$state" > $@.tmp; \ + if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv -f $@.tmp $@; fi + # The "unified" rust build is a special non-production mode that builds all of # the rust dependencies of librust_stellar_core.a through a single cargo # invocation, which is actually the "normal" way cargo operates, but which also @@ -283,6 +301,7 @@ RUSTFLAGS_CFGS := $(if $(findstring sanitizer,$(RUSTFLAGS_SANI)),--cfg curve2551 $(LIBRUST_STELLAR_CORE): $(RUST_HOST_DEPFILES) $(SRC_RUST_FILES) Makefile $(RUST_TOOLCHAIN_FILE) cd $(abspath $(top_srcdir))/src/rust && \ CC="$(CC)" CXX="$(CXX)" LD="$(LD)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CXXSTDLIB="$(CXXSTDLIB)" LDFLAGS="$(LDFLAGS)" \ + RUSTC_WRAPPER="$(RUSTC_WRAPPER)" \ RUSTFLAGS="$(RUSTFLAGS_SANI) $(RUSTFLAGS_CFGS)" \ CARGO_NET_GIT_FETCH_WITH_CLI=true \ $(CARGO) rustc \ @@ -340,7 +359,7 @@ else # !UNIFIED_RUST # We also have to pass CXXSTDLIB to those build.rs files, because they are # sensitive to CXXFLAGS but also don't inspect them to see if they're setting # -stdlib=libc++ or -stdlib=libstdc++ -$(SOROBAN_LIBS_STAMP): $(wildcard rust/soroban/p*/Cargo.lock) Makefile $(RUST_DEP_TREE_STAMP) $(SRC_RUST_FILES) $(RUST_TOOLCHAIN_FILE) +$(SOROBAN_LIBS_STAMP): $(wildcard rust/soroban/p*/Cargo.lock) $(ALL_SOROBAN_GIT_STATE_STAMPS) Makefile $(RUST_DEP_TREE_STAMP) $(SRC_RUST_FILES) $(RUST_TOOLCHAIN_FILE) rm -f $@ for proto in $(ALL_SOROBAN_PROTOCOLS) ; \ do \ @@ -359,6 +378,7 @@ $(SOROBAN_LIBS_STAMP): $(wildcard rust/soroban/p*/Cargo.lock) Makefile $(RUST_DE mkdir -p $(SOROBAN_BUILD_DIR)/$$proto/target && \ cd $(abspath $(top_srcdir))/src/rust/soroban/$$proto && \ CC="$(CC)" CXX="$(CXX)" LD="$(LD)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CXXSTDLIB="$(CXXSTDLIB)" LDFLAGS="$(LDFLAGS)" \ + RUSTC_WRAPPER="$(RUSTC_WRAPPER)" \ RUSTFLAGS="-Cmetadata=$$proto" \ CARGO_TARGET_DIR=$(SOROBAN_BUILD_DIR)/$$proto/target \ CARGO_NET_GIT_FETCH_WITH_CLI=true \ @@ -369,7 +389,8 @@ $(SOROBAN_LIBS_STAMP): $(wildcard rust/soroban/p*/Cargo.lock) Makefile $(RUST_DE $$FEATURE_FLAGS \ || exit 1; \ done - touch $@ + @sha256sum $(ALL_SOROBAN_LIBS) | cut -d' ' -f1 | sha256sum | cut -d' ' -f1 > $@.tmp + @if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv -f $@.tmp $@; fi # This one is also a bit challenging, though it's _less_ weird. What we're doing # here is supplying multiple separate .rlibs -- one for each soroban linked into @@ -387,9 +408,15 @@ $(SOROBAN_LIBS_STAMP): $(wildcard rust/soroban/p*/Cargo.lock) Makefile $(RUST_DE LIBRUST_STELLAR_CORE=$(RUST_TARGET_DIR)/$(RUST_PROFILE_DIR)/librust_stellar_core.a -$(LIBRUST_STELLAR_CORE): $(RUST_HOST_DEPFILES) $(SRC_RUST_FILES) Makefile $(SOROBAN_LIBS_STAMP) $(RUST_TOOLCHAIN_FILE) +# The .rlib files are side-effects of the SOROBAN_LIBS_STAMP recipe; this rule +# tells make how to produce them so it doesn't fail on a clean tree. +$(ALL_SOROBAN_LIBS): $(SOROBAN_LIBS_STAMP) ; + +$(LIBRUST_STELLAR_CORE): $(RUST_HOST_DEPFILES) $(SRC_RUST_FILES) $(ALL_SOROBAN_LIBS) Makefile $(SOROBAN_LIBS_STAMP) $(RUST_TOOLCHAIN_FILE) cd $(abspath $(top_srcdir))/src/rust && \ CC="$(CC)" CXX="$(CXX)" LD="$(LD)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CXXSTDLIB="$(CXXSTDLIB)" LDFLAGS="$(LDFLAGS)" \ + RUSTC_WRAPPER="$(RUSTC_WRAPPER)" \ + RUSTFLAGS="$(RUSTFLAGS) -Cmetadata=$(SOROBAN_LIBS_STATE)" \ CARGO_NET_GIT_FETCH_WITH_CLI=true \ $(CARGO) rustc \ --package stellar-core \ @@ -435,7 +462,6 @@ else # !USE_POSTGRES TESTS=test/selftest-nopg endif # !USE_POSTGRES TESTS += test/check-nondet -TESTS += test/check-sorobans format: always if USE_CLANG_FORMAT diff --git a/src/bucket/BucketListSnapshot.cpp b/src/bucket/BucketListSnapshot.cpp index eae919bc06..c6dbe3f855 100644 --- a/src/bucket/BucketListSnapshot.cpp +++ b/src/bucket/BucketListSnapshot.cpp @@ -40,7 +40,7 @@ BucketListSnapshotData::Level::Level( template BucketListSnapshotData::BucketListSnapshotData( - BucketListBase const& bl, LedgerHeader const& header) + BucketListBase const& bl) : levels([&bl]() { std::vector v; v.reserve(BucketListBase::kNumLevels); @@ -50,17 +50,9 @@ BucketListSnapshotData::BucketListSnapshotData( } return v; }()) - , header(header) { } -template -uint32_t -BucketListSnapshotData::getLedgerSeq() const -{ - return header.ledgerSeq; -} - // // SearchableBucketListSnapshot // @@ -68,11 +60,8 @@ BucketListSnapshotData::getLedgerSeq() const template SearchableBucketListSnapshot::SearchableBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots) + std::shared_ptr const> data) : mData(std::move(data)) - , mHistoricalSnapshots(std::move(historicalSnapshots)) , mMetrics(metrics) , mBulkLoadMeter( metrics.NewMeter({BucketT::METRIC_STRING, "query", "loads"}, "query")) @@ -87,6 +76,35 @@ SearchableBucketListSnapshot::SearchableBucketListSnapshot( } } +template +SearchableBucketListSnapshot::SearchableBucketListSnapshot( + SearchableBucketListSnapshot const& other) + : mData(other.mData) + // mStreams intentionally left empty — each copy gets its own stream cache + , mMetrics(other.mMetrics) + , mPointTimers(other.mPointTimers) + , mBulkTimers(other.mBulkTimers) + , mBulkLoadMeter(other.mBulkLoadMeter) +{ +} + +template +SearchableBucketListSnapshot& +SearchableBucketListSnapshot::operator=( + SearchableBucketListSnapshot const& other) +{ + if (this != &other) + { + mData = other.mData; + mStreams.clear(); + mMetrics = other.mMetrics; + mPointTimers = other.mPointTimers; + mBulkTimers = other.mBulkTimers; + mBulkLoadMeter = other.mBulkLoadMeter; + } + return *this; +} + // File streams are fairly expensive to create, so they are lazily created and // stored in mStreams. template @@ -292,7 +310,7 @@ SearchableBucketListSnapshot::load(LedgerKey const& k) const auto timerIter = mPointTimers.find(k.type()); releaseAssert(timerIter != mPointTimers.end()); - auto timer = timerIter->second.TimeScope(); + auto timer = timerIter->second.get().TimeScope(); std::shared_ptr result{}; @@ -318,51 +336,6 @@ SearchableBucketListSnapshot::load(LedgerKey const& k) const return result; } -template -std::optional> -SearchableBucketListSnapshot::loadKeysInternal( - std::set const& inKeys, - std::optional ledgerSeq) const -{ - ZoneScoped; - releaseAssert(mData); - - // Make a copy of the key set, this loop is destructive - auto keys = inKeys; - std::vector entries; - - auto loadKeysLoop = [&](std::shared_ptr const& bucket) { - loadKeysFromBucket(bucket, keys, entries); - return keys.empty() ? Loop::COMPLETE : Loop::INCOMPLETE; - }; - - if (!ledgerSeq || *ledgerSeq == mData->getLedgerSeq()) - { - loopAllBuckets(loadKeysLoop, *mData); - } - else - { - auto iter = mHistoricalSnapshots.find(*ledgerSeq); - if (iter == mHistoricalSnapshots.end()) - { - return std::nullopt; - } - releaseAssert(iter->second); - loopAllBuckets(loadKeysLoop, *iter->second); - } - - return entries; -} - -template -std::optional> -SearchableBucketListSnapshot::loadKeysFromLedger( - std::set const& inKeys, - uint32_t ledgerSeq) const -{ - return loadKeysInternal(inKeys, ledgerSeq); -} - template medida::Timer& SearchableBucketListSnapshot::getBulkLoadTimer( @@ -370,34 +343,18 @@ SearchableBucketListSnapshot::getBulkLoadTimer( { if (numEntries != 0) { - mBulkLoadMeter.Mark(numEntries); + mBulkLoadMeter.get().Mark(numEntries); } auto iter = mBulkTimers.find(label); if (iter == mBulkTimers.end()) { auto& metric = - mMetrics.NewTimer({BucketT::METRIC_STRING, "bulk", label}); + mMetrics.get().NewTimer({BucketT::METRIC_STRING, "bulk", label}); iter = mBulkTimers.emplace(label, metric).first; } - return iter->second; -} - -template -uint32_t -SearchableBucketListSnapshot::getLedgerSeq() const -{ - releaseAssert(mData); - return mData->getLedgerSeq(); -} - -template -LedgerHeader const& -SearchableBucketListSnapshot::getLedgerHeader() const -{ - releaseAssert(mData); - return mData->header; + return iter->second.get(); } template @@ -407,26 +364,14 @@ SearchableBucketListSnapshot::getSnapshotData() const return mData; } -template -std::map const>> const& -SearchableBucketListSnapshot::getHistoricalSnapshots() const -{ - return mHistoricalSnapshots; -} - // // SearchableLiveBucketListSnapshot // SearchableLiveBucketListSnapshot::SearchableLiveBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots) - : SearchableBucketListSnapshot(metrics, std::move(data), - std::move(historicalSnapshots)) + std::shared_ptr const> data) + : SearchableBucketListSnapshot(metrics, std::move(data)) { } @@ -435,10 +380,18 @@ SearchableLiveBucketListSnapshot::loadKeys( std::set const& inKeys, std::string const& label) const { + ZoneScoped; + releaseAssert(mData); auto timer = getBulkLoadTimer(label, inKeys.size()).TimeScope(); - auto op = loadKeysInternal(inKeys, std::nullopt); - releaseAssertOrThrow(op); - return std::move(*op); + + auto keys = inKeys; + std::vector entries; + auto loadKeysLoop = [&](std::shared_ptr const& bucket) { + loadKeysFromBucket(bucket, keys, entries); + return keys.empty() ? Loop::COMPLETE : Loop::INCOMPLETE; + }; + loopAllBuckets(loadKeysLoop, *mData); + return entries; } // This query has two steps: @@ -852,12 +805,8 @@ SearchableLiveBucketListSnapshot::scanForEvictionInBucket( SearchableHotArchiveBucketListSnapshot::SearchableHotArchiveBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots) - : SearchableBucketListSnapshot( - metrics, std::move(data), std::move(historicalSnapshots)) + std::shared_ptr const> data) + : SearchableBucketListSnapshot(metrics, std::move(data)) { } @@ -865,9 +814,18 @@ std::vector SearchableHotArchiveBucketListSnapshot::loadKeys( std::set const& inKeys) const { - auto op = loadKeysInternal(inKeys, std::nullopt); - releaseAssertOrThrow(op); - return std::move(*op); + ZoneScoped; + releaseAssert(mData); + + auto keys = inKeys; + std::vector entries; + auto loadKeysLoop = + [&](std::shared_ptr const& bucket) { + loadKeysFromBucket(bucket, keys, entries); + return keys.empty() ? Loop::COMPLETE : Loop::INCOMPLETE; + }; + loopAllBuckets(loadKeysLoop, *mData); + return entries; } void diff --git a/src/bucket/BucketListSnapshot.h b/src/bucket/BucketListSnapshot.h index 0412a5f966..564b322dd0 100644 --- a/src/bucket/BucketListSnapshot.h +++ b/src/bucket/BucketListSnapshot.h @@ -13,13 +13,10 @@ #include "util/UnorderedSet.h" #include "util/XDRStream.h" #include "xdr/Stellar-ledger-entries.h" -#include "xdr/Stellar-ledger.h" #include #include -#include #include -#include #include #include #include @@ -34,7 +31,6 @@ class Timer; namespace stellar { -class BucketSnapshotManager; struct EvictionMetrics; struct EvictionResultCandidates; struct EvictionResultEntry; @@ -43,10 +39,12 @@ struct StateArchivalSettings; class EvictionStatistics; template class BucketListBase; template class BucketLevel; +class CompleteConstLedgerState; +class LedgerStateSnapshot; -// BucketListSnapshotData holds the immutable snapshot data that can be safely -// shared across threads. It contains bucket references and the ledger header, -// but no mutable state like file streams. +// BucketListSnapshotData holds the immutable bucket references that can be +// safely shared across threads. It contains only bucket pointers and no +// metadata (headers, sequence numbers, etc.) or mutable state (file streams). template struct BucketListSnapshotData { BUCKET_TYPE_ASSERT(BucketT); @@ -62,12 +60,8 @@ template struct BucketListSnapshotData }; std::vector const levels; - LedgerHeader const header; - BucketListSnapshotData(BucketListBase const& bl, - LedgerHeader const& header); - - uint32_t getLedgerSeq() const; + explicit BucketListSnapshotData(BucketListBase const& bl); }; // SearchableBucketListSnapshot provides BucketList lookup functionality. @@ -85,23 +79,23 @@ template class SearchableBucketListSnapshot protected: // Shared immutable snapshot data std::shared_ptr const> mData; - std::map const>> - mHistoricalSnapshots; // Per-snapshot mutable stream cache mutable UnorderedMap> mStreams; - MetricsRegistry& mMetrics; + std::reference_wrapper mMetrics; // Tracks load times for each LedgerEntryType. We use // SimpleTimer since medida Timer overhead is too expensive for point loads. - UnorderedMap mPointTimers; + UnorderedMap> + mPointTimers; // Bulk load timers take significantly longer, so the timer overhead is // comparatively negligible. - mutable UnorderedMap mBulkTimers; - medida::Meter& mBulkLoadMeter; + mutable UnorderedMap> + mBulkTimers; + std::reference_wrapper mBulkLoadMeter; // Returns (lazily-constructed) file stream for bucket file. Note // this might be in some random position left over from a previous read -- @@ -130,17 +124,11 @@ template class SearchableBucketListSnapshot std::set& keys, std::vector& result) const; - std::optional> - loadKeysInternal(std::set const& inKeys, - std::optional ledgerSeq) const; - medida::Timer& getBulkLoadTimer(std::string const& label, size_t numEntries) const; // Iterate over all buckets in a snapshot in order, calling f on each // non-empty bucket. Exits early if function returns Loop::COMPLETE. - // The first overload operates on an explicit snapshot (used for historical - // queries). template void loopAllBuckets(Func&& f, BucketListSnapshotData const& snapshot) const; @@ -148,38 +136,25 @@ template class SearchableBucketListSnapshot SearchableBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots); + std::shared_ptr const> data); public: + // Copy: copies all state except mStreams, which is reset to empty. + // Each copy gets its own file stream cache, making copies safe to use + // from different threads. + SearchableBucketListSnapshot(SearchableBucketListSnapshot const& other); + SearchableBucketListSnapshot& + operator=(SearchableBucketListSnapshot const& other); + virtual ~SearchableBucketListSnapshot() = default; // Point load, returns nullptr if not found std::shared_ptr load(LedgerKey const& k) const; - // Loads inKeys from the specified historical snapshot. Returns - // load_result_vec if the snapshot for the given ledger is - // available, std::nullopt otherwise. Note that ledgerSeq is defined - // as the state of the BucketList at the beginning of the ledger. This means - // that for ledger N, the maximum lastModifiedLedgerSeq of any LedgerEntry - // in the BucketList is N - 1. - std::optional> - loadKeysFromLedger(std::set const& inKeys, - uint32_t ledgerSeq) const; - - uint32_t getLedgerSeq() const; - LedgerHeader const& getLedgerHeader() const; - // Access to underlying data (for copying/refreshing) std::shared_ptr const> const& getSnapshotData() const; - - std::map const>> const& - getHistoricalSnapshots() const; }; // Live bucket list snapshot with additional query methods @@ -188,10 +163,7 @@ class SearchableLiveBucketListSnapshot { SearchableLiveBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots); + std::shared_ptr const> data); Loop scanForEvictionInBucket( std::shared_ptr const& bucket, EvictionIterator& iter, @@ -200,6 +172,9 @@ class SearchableLiveBucketListSnapshot UnorderedSet& keysInEvictableEntries) const; public: + SearchableLiveBucketListSnapshot(SearchableLiveBucketListSnapshot const&) = + default; + std::vector loadKeys(std::set const& inKeys, std::string const& label) const; @@ -222,7 +197,8 @@ class SearchableLiveBucketListSnapshot LedgerEntryType type, std::function callback) const; - friend class BucketSnapshotManager; + friend class CompleteConstLedgerState; + friend class LedgerStateSnapshot; }; // Hot archive bucket list snapshot @@ -231,12 +207,12 @@ class SearchableHotArchiveBucketListSnapshot { SearchableHotArchiveBucketListSnapshot( MetricsRegistry& metrics, - std::shared_ptr const> data, - std::map const>> - historicalSnapshots); + std::shared_ptr const> data); public: + SearchableHotArchiveBucketListSnapshot( + SearchableHotArchiveBucketListSnapshot const&) = default; + std::vector loadKeys(std::set const& inKeys) const; @@ -245,7 +221,7 @@ class SearchableHotArchiveBucketListSnapshot void scanAllEntries( std::function callback) const; - friend class BucketSnapshotManager; + friend class LedgerStateSnapshot; }; extern template struct BucketListSnapshotData; diff --git a/src/bucket/BucketManager.cpp b/src/bucket/BucketManager.cpp index 99dc31ca37..53a1405734 100644 --- a/src/bucket/BucketManager.cpp +++ b/src/bucket/BucketManager.cpp @@ -6,7 +6,6 @@ #include "bucket/BucketInputIterator.h" #include "bucket/BucketManager.h" #include "bucket/BucketOutputIterator.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "bucket/HotArchiveBucket.h" #include "bucket/HotArchiveBucketList.h" @@ -17,7 +16,7 @@ #include "history/HistoryManager.h" #include "historywork/VerifyBucketWork.h" #include "invariant/InvariantManager.h" -#include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/NetworkConfig.h" @@ -33,8 +32,9 @@ #include "util/MetricsRegistry.h" #include "util/ProtocolVersion.h" #include "util/TmpDir.h" -#include "util/UnorderedMap.h" #include "util/types.h" +#include "work/WorkScheduler.h" +#include "work/WorkSequence.h" #include "xdr/Stellar-ledger.h" #include #include @@ -49,7 +49,6 @@ #include "medida/counter.h" #include "medida/meter.h" #include "medida/timer.h" -#include "work/WorkScheduler.h" #include "xdrpp/printer.h" #include @@ -103,9 +102,6 @@ BucketManager::initialize() mLiveBucketList = std::make_unique(); mHotArchiveBucketList = std::make_unique(); - mSnapshotManager = std::make_unique( - mAppConnector, *mLiveBucketList, *mHotArchiveBucketList, LedgerHeader(), - mConfig.QUERY_SNAPSHOT_LEDGERS); // Create persistent publish directories // Note: HISTORY_FILE_TYPE_BUCKET is already tracked by BucketList in @@ -136,7 +132,6 @@ BucketManager::BucketManager(AppConnector& appConnector) : mAppConnector(appConnector) , mLiveBucketList(nullptr) , mHotArchiveBucketList(nullptr) - , mSnapshotManager(nullptr) , mTmpDirManager(nullptr) , mWorkDir(nullptr) , mLockedBucketDir(nullptr) @@ -318,13 +313,6 @@ BucketManager::getHotArchiveBucketList() return *mHotArchiveBucketList; } -BucketSnapshotManager& -BucketManager::getBucketSnapshotManager() const -{ - releaseAssert(mSnapshotManager); - return *mSnapshotManager; -} - medida::Timer& BucketManager::getMergeTimer() { @@ -1160,29 +1148,27 @@ BucketManager::maybeSetIndex( } void -BucketManager::startBackgroundEvictionScan( - SearchableSnapshotConstPtr lclSnapshot, SorobanNetworkConfig const& cfg) +BucketManager::startBackgroundEvictionScan(ApplyLedgerStateSnapshot lclSnapshot, + SorobanNetworkConfig const& cfg) { - releaseAssert(mSnapshotManager); releaseAssert(!mEvictionFuture.valid()); releaseAssert(mEvictionStatistics); // Start the eviction scan for then _next_ ledger - auto ledgerSeq = lclSnapshot->getLedgerSeq() + 1; - auto ledgerVers = lclSnapshot->getLedgerHeader().ledgerVersion; + auto ledgerSeq = lclSnapshot.getLedgerSeq() + 1; + auto ledgerVers = lclSnapshot.getLedgerHeader().current().ledgerVersion; auto const& sas = cfg.stateArchivalSettings(); using task_t = std::packaged_task()>; - // MSVC gotcha: searchableBL has to be shared_ptr because MSVC wants to - // copy this lambda, otherwise we could use unique_ptr. auto task = std::make_shared( - [lclSnapshot, iter = cfg.evictionIterator(), ledgerSeq, ledgerVers, sas, - &metrics = mBucketListEvictionMetrics, stats = mEvictionStatistics] { + [snap = std::move(lclSnapshot), iter = cfg.evictionIterator(), + ledgerSeq, ledgerVers, sas, &metrics = mBucketListEvictionMetrics, + stats = mEvictionStatistics]() mutable { auto timer = metrics.backgroundTime.TimeScope(); - return lclSnapshot->scanForEviction(ledgerSeq, metrics, iter, stats, - sas, ledgerVers); + return snap.scanForEviction(ledgerSeq, metrics, iter, stats, sas, + ledgerVers); }); mEvictionFuture = task->get_future(); @@ -1193,17 +1179,17 @@ BucketManager::startBackgroundEvictionScan( EvictedStateVectors BucketManager::resolveBackgroundEvictionScan( - SearchableSnapshotConstPtr lclSnapshot, AbstractLedgerTxn& ltx, + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, LedgerKeySet const& modifiedKeys) { ZoneScoped; releaseAssert(mEvictionStatistics); auto timer = mBucketListEvictionMetrics.blockingTime.TimeScope(); - auto ls = LedgerSnapshot(ltx); - auto ledgerSeq = ls.getLedgerHeader().current().ledgerSeq; - auto ledgerVers = ls.getLedgerHeader().current().ledgerVersion; - auto networkConfig = SorobanNetworkConfig::loadFromLedger(ls); - releaseAssert(ledgerSeq == lclSnapshot->getLedgerSeq() + 1); + LedgerTxnReadOnly ltxSnap(ltx); + auto ledgerSeq = ltxSnap.getLedgerHeader().current().ledgerSeq; + auto ledgerVers = ltxSnap.getLedgerHeader().current().ledgerVersion; + auto networkConfig = SorobanNetworkConfig::loadFromLedger(ltxSnap); + releaseAssert(ledgerSeq == lclSnapshot.getLedgerSeq() + 1); if (!mEvictionFuture.valid()) { diff --git a/src/bucket/BucketManager.h b/src/bucket/BucketManager.h index 24da0e171c..f7a4ce1ffa 100644 --- a/src/bucket/BucketManager.h +++ b/src/bucket/BucketManager.h @@ -6,6 +6,7 @@ #include "bucket/BucketMergeMap.h" #include "history/HistoryArchive.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/NetworkConfig.h" #include "main/Config.h" #include "util/ThreadAnnotations.h" @@ -19,7 +20,6 @@ #include #include #include -#include #include #include @@ -39,7 +39,6 @@ class AppConnector; class Bucket; class LiveBucketList; class HotArchiveBucketList; -class BucketSnapshotManager; class SearchableLiveBucketListSnapshot; struct BucketEntryCounters; enum class LedgerEntryTypeAndDurability : uint32_t; @@ -83,7 +82,6 @@ class BucketManager : NonMovableOrCopyable AppConnector& mAppConnector; std::unique_ptr mLiveBucketList; std::unique_ptr mHotArchiveBucketList; - std::unique_ptr mSnapshotManager; std::unique_ptr mTmpDirManager; std::unique_ptr mWorkDir; BucketMapT mSharedLiveBuckets; @@ -101,7 +99,7 @@ class BucketManager : NonMovableOrCopyable // mLedgerStateMutex to prevent deadlocks. Code must NOT hold mBucketMutex // while trying to acquire LedgerManagerImpl::mLedgerStateMutex, as this // will cause a deadlock. - mutable RecursiveMutex mBucketMutex; + mutable ANNOTATED_RECURSIVE_MUTEX(mBucketMutex); #ifdef THREAD_SAFETY private: @@ -233,7 +231,6 @@ class BucketManager : NonMovableOrCopyable std::string const& getBucketDir() const; LiveBucketList& getLiveBucketList(); HotArchiveBucketList& getHotArchiveBucketList(); - BucketSnapshotManager& getBucketSnapshotManager() const; bool renameBucketDirFile(std::filesystem::path const& src, std::filesystem::path const& dst); @@ -341,7 +338,7 @@ class BucketManager : NonMovableOrCopyable // Scans BucketList for non-live entries to evict starting at the entry // pointed to by EvictionIterator. Evicts until `maxEntriesToEvict` entries // have been evicted or maxEvictionScanSize bytes have been scanned. - void startBackgroundEvictionScan(SearchableSnapshotConstPtr lclSnapshot, + void startBackgroundEvictionScan(ApplyLedgerStateSnapshot lclSnapshot, SorobanNetworkConfig const& networkConfig); // Returns a pair of vectors representing entries evicted this ledger, where @@ -350,7 +347,7 @@ class BucketManager : NonMovableOrCopyable // ContractCode). Note that when an entry is archived, its TTL key will be // included in the deleted keys vector. EvictedStateVectors - resolveBackgroundEvictionScan(SearchableSnapshotConstPtr lclSnapshot, + resolveBackgroundEvictionScan(ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, LedgerKeySet const& modifiedKeys); diff --git a/src/bucket/BucketSnapshotManager.cpp b/src/bucket/BucketSnapshotManager.cpp deleted file mode 100644 index cac2d6f0c0..0000000000 --- a/src/bucket/BucketSnapshotManager.cpp +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2024 Stellar Development Foundation and contributors. Licensed -// under the Apache License, Version 2.0. See the COPYING file at the root -// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 - -#include "bucket/BucketSnapshotManager.h" -#include "bucket/BucketListSnapshot.h" -#include "bucket/HotArchiveBucketList.h" -#include "bucket/LiveBucketList.h" -#include "main/AppConnector.h" -#include "util/GlobalChecks.h" -#include "util/MetricsRegistry.h" - -namespace stellar -{ - -BucketSnapshotManager::BucketSnapshotManager( - AppConnector& app, LiveBucketList const& liveBL, - HotArchiveBucketList const& hotArchiveBL, LedgerHeader const& header, - uint32_t numHistoricalLedgers) - : mAppConnector(app) - , mCurrLiveSnapshot( - std::make_shared>(liveBL, header)) - , mCurrHotArchiveSnapshot( - std::make_shared>( - hotArchiveBL, header)) - , mNumHistoricalSnapshots(numHistoricalLedgers) -{ - releaseAssert(threadIsMain()); - releaseAssert(mCurrLiveSnapshot); - releaseAssert(mCurrHotArchiveSnapshot); -} - -SearchableSnapshotConstPtr -BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const -{ - SharedLockShared guard(mSnapshotMutex); - // Can't use std::make_shared due to private constructor - return copySearchableLiveBucketListSnapshot(guard); -} - -SearchableHotArchiveSnapshotConstPtr -BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot() const -{ - SharedLockShared guard(mSnapshotMutex); - releaseAssert(mCurrHotArchiveSnapshot); - // Can't use std::make_shared due to private constructor - return copySearchableHotArchiveBucketListSnapshot(guard); -} - -SearchableSnapshotConstPtr -BucketSnapshotManager::copySearchableLiveBucketListSnapshot( - SharedLockShared const& guard) const -{ - // Can't use std::make_shared due to private constructor - return std::shared_ptr( - new SearchableLiveBucketListSnapshot(mAppConnector.getMetrics(), - mCurrLiveSnapshot, - mLiveHistoricalSnapshots)); -} - -SearchableSnapshotConstPtr -BucketSnapshotManager::copySearchableLiveBucketListSnapshot( - SearchableSnapshotConstPtr const& snapshot, MetricsRegistry& metrics) -{ - // Can't use std::make_shared due to private constructor - releaseAssert(snapshot); - return std::shared_ptr( - new SearchableLiveBucketListSnapshot( - metrics, snapshot->getSnapshotData(), - snapshot->getHistoricalSnapshots())); -} - -SearchableHotArchiveSnapshotConstPtr -BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot( - SearchableHotArchiveSnapshotConstPtr const& snapshot, - MetricsRegistry& metrics) -{ - releaseAssert(snapshot); - // Can't use std::make_shared due to private constructor - return std::shared_ptr( - new SearchableHotArchiveBucketListSnapshot( - metrics, snapshot->getSnapshotData(), - snapshot->getHistoricalSnapshots())); -} - -SearchableHotArchiveSnapshotConstPtr -BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot( - SharedLockShared const& guard) const -{ - releaseAssert(mCurrHotArchiveSnapshot); - // Can't use std::make_shared due to private constructor - return std::shared_ptr( - new SearchableHotArchiveBucketListSnapshot( - mAppConnector.getMetrics(), mCurrHotArchiveSnapshot, - mHotArchiveHistoricalSnapshots)); -} - -namespace -{ -template -bool -needsUpdate(std::shared_ptr const& snapshot, - std::shared_ptr const& currData) -{ - return !snapshot || snapshot->getLedgerSeq() < currData->getLedgerSeq(); -} -} - -void -BucketSnapshotManager::maybeCopySearchableBucketListSnapshot( - SearchableSnapshotConstPtr& snapshot) -{ - // The canonical snapshot held by the BucketSnapshotManager is not being - // modified. Rather, a thread is checking it's copy against the canonical - // snapshot, so use a shared lock. - SharedLockShared guard(mSnapshotMutex); - if (needsUpdate(snapshot, mCurrLiveSnapshot)) - { - snapshot = copySearchableLiveBucketListSnapshot(guard); - } -} - -void -BucketSnapshotManager::maybeCopySearchableHotArchiveBucketListSnapshot( - SearchableHotArchiveSnapshotConstPtr& snapshot) -{ - // The canonical snapshot held by the BucketSnapshotManager is not being - // modified. Rather, a thread is checking it's copy against the canonical - // snapshot, so use a shared lock. - SharedLockShared guard(mSnapshotMutex); - if (needsUpdate(snapshot, mCurrHotArchiveSnapshot)) - { - snapshot = copySearchableHotArchiveBucketListSnapshot(guard); - } -} - -void -BucketSnapshotManager::maybeCopyLiveAndHotArchiveSnapshots( - SearchableSnapshotConstPtr& liveSnapshot, - SearchableHotArchiveSnapshotConstPtr& hotArchiveSnapshot) -{ - // The canonical snapshot held by the BucketSnapshotManager is not being - // modified. Rather, a thread is checking it's copy against the canonical - // snapshot, so use a shared lock. For consistency we hold the lock while - // updating both snapshots. - SharedLockShared guard(mSnapshotMutex); - if (needsUpdate(liveSnapshot, mCurrLiveSnapshot)) - { - liveSnapshot = copySearchableLiveBucketListSnapshot(guard); - } - - if (needsUpdate(hotArchiveSnapshot, mCurrHotArchiveSnapshot)) - { - hotArchiveSnapshot = copySearchableHotArchiveBucketListSnapshot(guard); - } -} - -std::pair -BucketSnapshotManager::copySearchableBucketListSnapshots() const -{ - SharedLockShared guard(mSnapshotMutex); - return {copySearchableLiveBucketListSnapshot(guard), - copySearchableHotArchiveBucketListSnapshot(guard)}; -} - -void -BucketSnapshotManager::updateCurrentSnapshot( - LiveBucketList const& liveBL, HotArchiveBucketList const& hotArchiveBL, - LedgerHeader const& header) -{ - auto updateSnapshot = [numHistoricalSnapshots = mNumHistoricalSnapshots]( - auto& currentSnapshot, auto& historicalSnapshots, - auto newSnapshot) { - releaseAssert(newSnapshot); - releaseAssert(!currentSnapshot || newSnapshot->getLedgerSeq() >= - currentSnapshot->getLedgerSeq()); - - // First update historical snapshots - if (numHistoricalSnapshots != 0) - { - // If historical snapshots are full, delete the oldest one - if (historicalSnapshots.size() == numHistoricalSnapshots) - { - historicalSnapshots.erase(historicalSnapshots.begin()); - } - - historicalSnapshots.emplace(currentSnapshot->getLedgerSeq(), - std::move(currentSnapshot)); - } - - currentSnapshot = std::move(newSnapshot); - }; - - auto newLiveSnapshot = - std::make_shared>(liveBL, header); - auto newHotArchiveSnapshot = - std::make_shared>(hotArchiveBL, - header); - - // Updating canonical snapshots requires exclusive write access - SharedLockExclusive guard(mSnapshotMutex); - updateSnapshot(mCurrLiveSnapshot, mLiveHistoricalSnapshots, - std::move(newLiveSnapshot)); - updateSnapshot(mCurrHotArchiveSnapshot, mHotArchiveHistoricalSnapshots, - std::move(newHotArchiveSnapshot)); -} -} diff --git a/src/bucket/BucketSnapshotManager.h b/src/bucket/BucketSnapshotManager.h deleted file mode 100644 index 09fbaf1575..0000000000 --- a/src/bucket/BucketSnapshotManager.h +++ /dev/null @@ -1,130 +0,0 @@ -#pragma once - -// Copyright 2024 Stellar Development Foundation and contributors. Licensed -// under the Apache License, Version 2.0. See the COPYING file at the root -// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 - -#include "bucket/BucketListSnapshot.h" -#include "bucket/HotArchiveBucket.h" -#include "bucket/LiveBucket.h" -#include "util/NonCopyable.h" -#include "util/ThreadAnnotations.h" - -#include -#include -#include - -namespace medida -{ -class Meter; -class MetricsRegistry; -class Timer; -} - -namespace stellar -{ - -class AppConnector; -class LiveBucketList; -class HotArchiveBucketList; - -// This class serves as the boundary between non-threadsafe singleton classes -// (BucketManager, BucketList, Metrics, etc) and threadsafe, parallel BucketList -// snapshots. -class BucketSnapshotManager : NonMovableOrCopyable -{ - private: - AppConnector& mAppConnector; - - // Lock must be held when accessing any member variables holding snapshots - mutable SharedMutex mSnapshotMutex; - - // Snapshot that is maintained and periodically updated by BucketManager on - // the main thread. When background threads need to generate or refresh a - // snapshot, they will copy this snapshot. - std::shared_ptr const> - mCurrLiveSnapshot GUARDED_BY(mSnapshotMutex){}; - std::shared_ptr const> - mCurrHotArchiveSnapshot GUARDED_BY(mSnapshotMutex){}; - - // ledgerSeq that the snapshot is based on -> snapshot - std::map const>> - mLiveHistoricalSnapshots GUARDED_BY(mSnapshotMutex); - std::map const>> - mHotArchiveHistoricalSnapshots GUARDED_BY(mSnapshotMutex); - - uint32_t const mNumHistoricalSnapshots; - - public: - // Called by main thread to update snapshots whenever the BucketList - // is updated - void updateCurrentSnapshot(LiveBucketList const& liveBL, - HotArchiveBucketList const& hotArchiveBL, - LedgerHeader const& header) - LOCKS_EXCLUDED(mSnapshotMutex); - - // numHistoricalLedgers is the number of historical snapshots that the - // snapshot manager will maintain. If numHistoricalLedgers is 5, snapshots - // will be capable of querying state from ledger [lcl, lcl - 5]. - BucketSnapshotManager(AppConnector& app, LiveBucketList const& liveBL, - HotArchiveBucketList const& hotArchiveBL, - LedgerHeader const& header, - uint32_t numHistoricalLedgers); - - // Copy the most recent snapshot for the live bucket list - SearchableSnapshotConstPtr copySearchableLiveBucketListSnapshot() const - LOCKS_EXCLUDED(mSnapshotMutex); - - // Create a deep copy from an existing searchable snapshot - static SearchableSnapshotConstPtr copySearchableLiveBucketListSnapshot( - SearchableSnapshotConstPtr const& snapshot, MetricsRegistry& metrics); - - // Create a deep copy from an existing hot archive snapshot - static SearchableHotArchiveSnapshotConstPtr - copySearchableHotArchiveBucketListSnapshot( - SearchableHotArchiveSnapshotConstPtr const& snapshot, - MetricsRegistry& metrics); - - // Copy the most recent snapshot for the hot archive bucket list - SearchableHotArchiveSnapshotConstPtr - copySearchableHotArchiveBucketListSnapshot() const - LOCKS_EXCLUDED(mSnapshotMutex); - - // Copy the most recent snapshot for the live bucket list, while holding the - // lock - SearchableSnapshotConstPtr - copySearchableLiveBucketListSnapshot(SharedLockShared const& guard) const - REQUIRES_SHARED(mSnapshotMutex); - - // Copy the most recent snapshot for the hot archive bucket list, while - // holding the lock - SearchableHotArchiveSnapshotConstPtr - copySearchableHotArchiveBucketListSnapshot( - SharedLockShared const& guard) const REQUIRES_SHARED(mSnapshotMutex); - - // `maybeCopy` interface refreshes `snapshot` if a newer snapshot is - // available. It's a no-op otherwise. This is useful to avoid unnecessary - // copying. - void - maybeCopySearchableBucketListSnapshot(SearchableSnapshotConstPtr& snapshot) - LOCKS_EXCLUDED(mSnapshotMutex); - void maybeCopySearchableHotArchiveBucketListSnapshot( - SearchableHotArchiveSnapshotConstPtr& snapshot) - LOCKS_EXCLUDED(mSnapshotMutex); - - // This function is the same as snapshot refreshers above, but guarantees - // that both snapshots are consistent with the same lcl. This is required - // when querying both snapshot types as part of the same query. - void maybeCopyLiveAndHotArchiveSnapshots( - SearchableSnapshotConstPtr& liveSnapshot, - SearchableHotArchiveSnapshotConstPtr& hotArchiveSnapshot) - LOCKS_EXCLUDED(mSnapshotMutex); - - // Copy both live and hot archive snapshots atomically under a single lock. - // This guarantees both snapshots are from the same ledger. - std::pair - copySearchableBucketListSnapshots() const LOCKS_EXCLUDED(mSnapshotMutex); -}; -} diff --git a/src/bucket/BucketUtils.h b/src/bucket/BucketUtils.h index 16c404838d..4f8361215e 100644 --- a/src/bucket/BucketUtils.h +++ b/src/bucket/BucketUtils.h @@ -35,11 +35,6 @@ class SearchableHotArchiveBucketListSnapshot; std::is_same_v, \ "BucketT must be a Bucket type") -using SearchableSnapshotConstPtr = - std::shared_ptr; -using SearchableHotArchiveSnapshotConstPtr = - std::shared_ptr; - // A fine-grained merge-operation-counter structure for tracking various // events during merges. These are not medida counters because we do not // want or need to publish this level of granularity outside of testing, and diff --git a/src/bucket/LiveBucketIndex.cpp b/src/bucket/LiveBucketIndex.cpp index a55f50a2fe..e0122b2340 100644 --- a/src/bucket/LiveBucketIndex.cpp +++ b/src/bucket/LiveBucketIndex.cpp @@ -102,7 +102,7 @@ LiveBucketIndex::maybeInitializeCache(size_t totalBucketListAccountsSizeBytes, } // Cache is already initialized - if (std::shared_lock lock(mCacheMutex); mCache) + if (SharedLockShared lock(mCacheMutex); mCache) { return; } @@ -123,7 +123,7 @@ LiveBucketIndex::maybeInitializeCache(size_t totalBucketListAccountsSizeBytes, return; } - std::unique_lock lock(mCacheMutex); + SharedLockExclusive lock(mCacheMutex); if (totalBucketListAccountsSizeBytes < maxBucketListBytesToCache) { // We can cache the entire bucket @@ -202,7 +202,7 @@ LiveBucketIndex::getCachedEntry(LedgerKey const& k) const { if (shouldUseCache() && isCachedType(k)) { - std::shared_lock lock(mCacheMutex); + SharedLockExclusive lock(mCacheMutex); auto cachePtr = mCache->maybeGet(k); if (cachePtr) { @@ -323,7 +323,7 @@ LiveBucketIndex::shouldUseCache() const { if (mDiskIndex) { - std::shared_lock lock(mCacheMutex); + SharedLockShared lock(mCacheMutex); return mCache != nullptr; } @@ -353,7 +353,7 @@ LiveBucketIndex::maybeAddToCache( // earlier. mCacheMissMeter.Mark(); - std::unique_lock lock(mCacheMutex); + SharedLockExclusive lock(mCacheMutex); mCache->put(k, entry); } } @@ -392,7 +392,7 @@ LiveBucketIndex::getMaxCacheSize() const { if (shouldUseCache()) { - std::shared_lock lock(mCacheMutex); + SharedLockShared lock(mCacheMutex); return mCache->maxSize(); } @@ -405,7 +405,7 @@ LiveBucketIndex::getCurrentCacheSize() const { if (shouldUseCache()) { - std::shared_lock lock(mCacheMutex); + SharedLockShared lock(mCacheMutex); return mCache->size(); } diff --git a/src/bucket/LiveBucketIndex.h b/src/bucket/LiveBucketIndex.h index abd2582d23..d12eb46431 100644 --- a/src/bucket/LiveBucketIndex.h +++ b/src/bucket/LiveBucketIndex.h @@ -12,13 +12,13 @@ #include "ledger/LedgerHashUtils.h" // IWYU pragma: keep #include "util/NonCopyable.h" #include "util/RandomEvictionCache.h" +#include "util/ThreadAnnotations.h" #include "util/XDROperators.h" // IWYU pragma: keep #include "xdr/Stellar-ledger-entries.h" #include #include #include -#include namespace asio { @@ -65,8 +65,8 @@ class LiveBucketIndex : public NonMovableOrCopyable // The indexes themselves are thread safe, as they are immutable after // construction. The cache is not, all accesses must first acquire this // mutex. - mutable std::unique_ptr mCache{}; - mutable std::shared_mutex mCacheMutex; + mutable std::unique_ptr mCache GUARDED_BY(mCacheMutex){}; + mutable ANNOTATED_SHARED_MUTEX(mCacheMutex); medida::Meter& mCacheHitMeter; medida::Meter& mCacheMissMeter; diff --git a/src/bucket/test/BucketIndexTests.cpp b/src/bucket/test/BucketIndexTests.cpp index b506ed4759..9d90e2a323 100644 --- a/src/bucket/test/BucketIndexTests.cpp +++ b/src/bucket/test/BucketIndexTests.cpp @@ -6,13 +6,13 @@ // concerning key-value lookup based on the BucketList. #include "bucket/BucketIndexUtils.h" -#include "bucket/BucketInputIterator.h" #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "bucket/LiveBucket.h" #include "bucket/LiveBucketList.h" #include "bucket/test/BucketTestUtils.h" +#include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/test/LedgerTestUtils.h" #include "main/Application.h" @@ -193,60 +193,6 @@ class BucketIndexTest buildBucketList(f, isCacheTest); } - void - runHistoricalSnapshotTest() - { - uint32_t ledger = 0; - - // Exclude soroban types so we don't have to insert TTLs - auto canonicalEntry = - LedgerTestUtils::generateValidLedgerEntryWithExclusions( - {CONFIG_SETTING, TTL, CONTRACT_CODE, CONTRACT_DATA}); - canonicalEntry.lastModifiedLedgerSeq = 0; - - do - { - ++ledger; - auto entryCopy = canonicalEntry; - entryCopy.lastModifiedLedgerSeq = ledger; - mApp->getLedgerManager().setNextLedgerEntryBatchForBucketTesting( - {}, {entryCopy}, {}); - closeLedger(*mApp); - } while (ledger < mApp->getConfig().QUERY_SNAPSHOT_LEDGERS + 2); - ++ledger; - - auto searchableBL = getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - auto lk = LedgerEntryKey(canonicalEntry); - - auto currentLoadedEntry = searchableBL->load(lk); - REQUIRE(currentLoadedEntry); - - // Note: The definition of "historical snapshot" ledger is that the - // BucketList snapshot for ledger N is the BucketList as it exists at - // the beginning of ledger N. This means that the lastModifiedLedgerSeq - // is at most N - 1. - REQUIRE(currentLoadedEntry->lastModifiedLedgerSeq == ledger - 1); - - for (uint32_t currLedger = ledger; currLedger > 0; --currLedger) - { - auto loadRes = searchableBL->loadKeysFromLedger({lk}, currLedger); - - // If we query an older snapshot, should return - if (currLedger < ledger - mApp->getConfig().QUERY_SNAPSHOT_LEDGERS) - { - REQUIRE(!loadRes); - } - else - { - REQUIRE(loadRes); - REQUIRE(loadRes->size() == 1); - REQUIRE(loadRes->at(0).lastModifiedLedgerSeq == currLedger - 1); - } - } - } - virtual void buildMultiVersionTest(bool sorobanOnly = false) { @@ -413,9 +359,7 @@ class BucketIndexTest virtual void run(std::optional expectedHitRate = std::nullopt) { - auto searchableBL = getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snap = getApp().getLedgerManager().copyLedgerStateSnapshot(); auto& hitMeter = getBM().getCacheHitMeter(); auto& missMeter = getBM().getCacheMissMeter(); @@ -483,7 +427,7 @@ class BucketIndexTest }; // Test bulk load lookup - auto loadResult = searchableBL->loadKeys(mKeysToSearch, "test"); + auto loadResult = snap.loadLiveKeys(mKeysToSearch, "test"); validateResults(mTestEntries, loadResult); if (expectedHitRate) @@ -517,7 +461,7 @@ class BucketIndexTest for (auto iter = mKeysToSearch.rbegin(); iter != mKeysToSearch.rend(); ++iter) { - auto entryPtr = searchableBL->load(*iter); + auto entryPtr = snap.loadLiveEntry(*iter); if (entryPtr) { loadResult.emplace_back(*entryPtr); @@ -532,7 +476,7 @@ class BucketIndexTest mKeysToSearch.size()); // Run bulk lookup again - auto loadResult2 = searchableBL->loadKeys(mKeysToSearch, "test"); + auto loadResult2 = snap.loadLiveKeys(mKeysToSearch, "test"); validateResults(mTestEntries, loadResult2); checkHitRate(expectedHitRate, startingHitCount, startingMissCount, @@ -544,9 +488,7 @@ class BucketIndexTest virtual void runPerf(size_t n) { - auto searchableBL = getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snap = getApp().getLedgerManager().copyLedgerStateSnapshot(); for (size_t i = 0; i < n; ++i) { LedgerKeySet searchSubset; @@ -577,7 +519,7 @@ class BucketIndexTest searchSubset.insert(addKeys.begin(), addKeys.end()); } - auto blLoad = searchableBL->loadKeys(searchSubset, "test"); + auto blLoad = snap.loadLiveKeys(searchSubset, "test"); validateResults(testEntriesSubset, blLoad); } } @@ -585,9 +527,7 @@ class BucketIndexTest void testInvalidKeys() { - auto searchableBL = getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snap = getApp().getLedgerManager().copyLedgerStateSnapshot(); // Load should return empty vector for keys not in bucket list auto keysNotInBL = @@ -597,12 +537,12 @@ class BucketIndexTest LedgerKeySet invalidKeys(keysNotInBL.begin(), keysNotInBL.end()); // Test bulk load - REQUIRE(searchableBL->loadKeys(invalidKeys, "test").size() == 0); + REQUIRE(snap.loadLiveKeys(invalidKeys, "test").size() == 0); // Test individual load for (auto const& key : invalidKeys) { - auto entryPtr = searchableBL->load(key); + auto entryPtr = snap.loadLiveEntry(key); REQUIRE(!entryPtr); } } @@ -756,12 +696,9 @@ class BucketIndexPoolShareTest : public BucketIndexTest virtual void run(std::optional expectedHitRate = std::nullopt) override { - auto searchableBL = getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - auto loadResult = - searchableBL->loadPoolShareTrustLinesByAccountAndAsset( - mAccountToSearch.accountID, mAssetToSearch); + auto snap = getApp().getLedgerManager().copyLedgerStateSnapshot(); + auto loadResult = snap.loadPoolShareTrustLinesByAccountAndAsset( + mAccountToSearch.accountID, mAssetToSearch); validateResults(mTestEntries, loadResult); } }; @@ -1117,9 +1054,8 @@ TEST_CASE("soroban cache population", "[soroban][bucketindex]") auto const& inMemorySorobanState = lm.getInMemorySorobanStateForTesting(); - auto snapshot = test.getBM() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snapshot = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); // First, test that the cache is maintained correctly via `addBatch` REQUIRE(codeEntries.size() == @@ -1129,12 +1065,12 @@ TEST_CASE("soroban cache population", "[soroban][bucketindex]") auto inMemoryEntry = inMemorySorobanState.get(k); REQUIRE(inMemoryEntry); - auto liveEntry = snapshot->load(k); + auto liveEntry = snapshot.loadLiveEntry(k); REQUIRE(liveEntry); REQUIRE(*liveEntry == *inMemoryEntry); auto ttlKey = getTTLKey(k); - auto ttlEntry = snapshot->load(ttlKey); + auto ttlEntry = snapshot.loadLiveEntry(ttlKey); REQUIRE(ttlEntry); auto inMemoryTTL = inMemorySorobanState.get(ttlKey); @@ -1149,12 +1085,12 @@ TEST_CASE("soroban cache population", "[soroban][bucketindex]") auto inMemoryEntry = inMemorySorobanState.get(k); REQUIRE(inMemoryEntry); - auto liveEntry = snapshot->load(k); + auto liveEntry = snapshot.loadLiveEntry(k); REQUIRE(liveEntry); REQUIRE(*liveEntry == *inMemoryEntry); auto ttlKey = getTTLKey(k); - auto ttlEntry = snapshot->load(ttlKey); + auto ttlEntry = snapshot.loadLiveEntry(ttlKey); REQUIRE(ttlEntry); auto inMemoryTTL = inMemorySorobanState.get(ttlKey); @@ -1178,17 +1114,6 @@ TEST_CASE("soroban cache population", "[soroban][bucketindex]") testAllIndexTypes(f); } -TEST_CASE("load from historical snapshots", "[bucket][bucketindex]") -{ - auto f = [&](Config& cfg) { - cfg.QUERY_SNAPSHOT_LEDGERS = 5; - auto test = BucketIndexTest(cfg); - test.runHistoricalSnapshotTest(); - }; - - testAllIndexTypes(f); -} - TEST_CASE("loadPoolShareTrustLinesByAccountAndAsset", "[bucket][bucketindex]") { auto f = [&](Config& cfg) { @@ -1327,9 +1252,7 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") auto ledger = 1; // Use snapshot across ledger to test update behavior - auto searchableBL = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto snap = app->getLedgerManager().copyLedgerStateSnapshot(); auto checkLoad = [&](LedgerKey const& k, @@ -1356,12 +1279,12 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") LedgerKeySet bulkLoadKeys; for (auto const& k : keysToSearch) { - auto entryPtr = searchableBL->load(k); + auto entryPtr = snap.loadArchiveEntry(k); checkLoad(k, entryPtr); bulkLoadKeys.emplace(k); } - auto bulkLoadResult = searchableBL->loadKeys(bulkLoadKeys); + auto bulkLoadResult = snap.loadArchiveKeys(bulkLoadKeys); for (auto entry : bulkLoadResult) { REQUIRE(entry.type() == HOT_ARCHIVE_ARCHIVED); @@ -1402,9 +1325,7 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") HotArchiveBucket::FIRST_PROTOCOL_SUPPORTING_PERSISTENT_EVICTION); addHotArchiveBatchAndUpdateSnapshot(*app, header, archivedEntries, restoredEntries); - app->getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableHotArchiveBucketListSnapshot(searchableBL); + snap = app->getLedgerManager().copyLedgerStateSnapshot(); checkResult(); // Add a few batches so that entries are no longer in the top bucket @@ -1412,9 +1333,7 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") { header.ledgerSeq += 1; addHotArchiveBatchAndUpdateSnapshot(*app, header, {}, {}); - app->getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableHotArchiveBucketListSnapshot(searchableBL); + snap = app->getLedgerManager().copyLedgerStateSnapshot(); } // Shadow entries via liveEntry @@ -1424,20 +1343,17 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") header.ledgerSeq += 1; addHotArchiveBatchAndUpdateSnapshot(*app, header, {}, {liveShadow1, liveShadow2}); - app->getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableHotArchiveBucketListSnapshot(searchableBL); + snap = app->getLedgerManager().copyLedgerStateSnapshot(); // Point load for (auto const& k : {liveShadow1, liveShadow2}) { - auto entryPtr = searchableBL->load(k); + auto entryPtr = snap.loadArchiveEntry(k); REQUIRE(!entryPtr); } // Bulk load - auto bulkLoadResult = - searchableBL->loadKeys({liveShadow1, liveShadow2}); + auto bulkLoadResult = snap.loadArchiveKeys({liveShadow1, liveShadow2}); REQUIRE(bulkLoadResult.size() == 0); // Shadow via archivedEntries @@ -1446,12 +1362,10 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") header.ledgerSeq += 1; addHotArchiveBatchAndUpdateSnapshot(*app, header, {archivedShadow}, {}); - app->getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableHotArchiveBucketListSnapshot(searchableBL); + snap = app->getLedgerManager().copyLedgerStateSnapshot(); // Point load - auto entryPtr = searchableBL->load(LedgerEntryKey(archivedShadow)); + auto entryPtr = snap.loadArchiveEntry(LedgerEntryKey(archivedShadow)); REQUIRE(entryPtr); REQUIRE(entryPtr->type() == HotArchiveBucketEntryType::HOT_ARCHIVE_ARCHIVED); @@ -1459,7 +1373,7 @@ TEST_CASE("hot archive bucket lookups", "[bucket][bucketindex][archive]") // Bulk load auto bulkLoadResult2 = - searchableBL->loadKeys({LedgerEntryKey(archivedShadow)}); + snap.loadArchiveKeys({LedgerEntryKey(archivedShadow)}); REQUIRE(bulkLoadResult2.size() == 1); REQUIRE(bulkLoadResult2[0].type() == HOT_ARCHIVE_ARCHIVED); REQUIRE(bulkLoadResult2[0].archivedEntry() == archivedShadow); @@ -1626,9 +1540,7 @@ TEST_CASE("getRangeForType bounds verification", "[bucket][bucketindex]") .getCurr(); verifyIndexBounds(bucket); - auto searchableBL = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snap = app->getLedgerManager().copyLedgerStateSnapshot(); auto verifyScanForType = [&](LedgerEntryType type, @@ -1641,7 +1553,7 @@ TEST_CASE("getRangeForType bounds verification", "[bucket][bucketindex]") expectedEntries.emplace(LedgerEntryKey(entry), entry); } - searchableBL->scanForEntriesOfType( + snap.scanLiveEntriesOfType( type, [&](BucketEntry const& be) { auto lk = getBucketLedgerKey(be); REQUIRE(lk.type() == type); @@ -1662,11 +1574,11 @@ TEST_CASE("getRangeForType bounds verification", "[bucket][bucketindex]") verifyScanForType(TRUSTLINE, trustlineEntries); // Verify that we don't call the callback for non-existent types - searchableBL->scanForEntriesOfType(CONTRACT_CODE, - [&](BucketEntry const& be) { - REQUIRE(false); - return Loop::INCOMPLETE; - }); + snap.scanLiveEntriesOfType(CONTRACT_CODE, + [&](BucketEntry const& be) { + REQUIRE(false); + return Loop::INCOMPLETE; + }); } }; diff --git a/src/bucket/test/BucketListTests.cpp b/src/bucket/test/BucketListTests.cpp index 3ace5ad01a..6c95c120a3 100644 --- a/src/bucket/test/BucketListTests.cpp +++ b/src/bucket/test/BucketListTests.cpp @@ -6,10 +6,6 @@ // concerning the sizes of levels in it, shadowing, the propagation and // archival of entries as they move between levels, and so forth. -// ASIO is somewhat particular about when it gets included -- it wants to be the -// first to include -- so we try to include it before everything -// else. -#include "util/asio.h" #include "bucket/BucketInputIterator.h" #include "bucket/BucketManager.h" #include "bucket/BucketOutputIterator.h" @@ -19,12 +15,12 @@ #include "bucket/LiveBucketList.h" #include "bucket/test/BucketTestUtils.h" #include "crypto/Hex.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/test/LedgerTestUtils.h" #include "lib/util/stdrandom.h" #include "main/Application.h" #include "main/Config.h" -#include "test/Catch2.h" #include "test/TestUtils.h" #include "test/test.h" #include "util/Math.h" @@ -1116,15 +1112,15 @@ TEST_CASE_VERSIONS("eviction scan", "[bucketlist][archival][soroban]") LedgerKey stateArchivalKey(CONFIG_SETTING); stateArchivalKey.configSetting().configSettingID = ConfigSettingID::CONFIG_SETTING_STATE_ARCHIVAL; - LedgerSnapshot ls(*app); - auto stateArchivalEntry = ls.load(stateArchivalKey).current(); + LedgerReadView lrv(*app); + auto stateArchivalEntry = lrv.load(stateArchivalKey).current(); modifyStateArchivalFn(stateArchivalEntry.data.configSetting() .stateArchivalSettings()); LedgerKey evictionIterKey(CONFIG_SETTING); evictionIterKey.configSetting().configSettingID = ConfigSettingID::CONFIG_SETTING_EVICTION_ITERATOR; - auto evictionIterEntry = ls.load(evictionIterKey).current(); + auto evictionIterEntry = lrv.load(evictionIterKey).current(); modifyEvictionIteratorFn( evictionIterEntry.data.configSetting().evictionIterator()); @@ -1213,15 +1209,14 @@ TEST_CASE_VERSIONS("eviction scan", "[bucketlist][archival][soroban]") auto checkArchivedBucketList = [&] { if (!tempOnly) { - auto archiveSnapshot = - bm.getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto archiveSnap = + app->getLedgerManager().copyLedgerStateSnapshot(); // Check that persisted entries have been inserted into // HotArchive for (auto const& k : persistentEntries) { - auto archivedEntry = archiveSnapshot->load(k); + auto archivedEntry = archiveSnap.loadArchiveEntry(k); REQUIRE(archivedEntry); auto seen = false; @@ -1237,14 +1232,14 @@ TEST_CASE_VERSIONS("eviction scan", "[bucketlist][archival][soroban]") // Make sure TTL keys are not archived auto ttl = getTTLKey(k); - auto archivedTTL = archiveSnapshot->load(ttl); + auto archivedTTL = archiveSnap.loadArchiveEntry(ttl); REQUIRE(!archivedTTL); } // Temp entries should not be archived for (auto const& k : tempEntries) { - auto archivedEntry = archiveSnapshot->load(k); + auto archivedEntry = archiveSnap.loadArchiveEntry(k); REQUIRE(!archivedEntry); } } @@ -1727,11 +1722,10 @@ TEST_CASE_VERSIONS("Searchable BucketListDB snapshots", "[bucketlist]") } closeLedger(*app); - auto searchableBL = bm.getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto blSnap = app->getLedgerManager().copyLedgerStateSnapshot(); // Snapshot should automatically update with latest version - auto loadedEntry = searchableBL->load(LedgerEntryKey(entry)); + auto loadedEntry = blSnap.loadLiveEntry(LedgerEntryKey(entry)); REQUIRE((loadedEntry && *loadedEntry == entry)); } } diff --git a/src/bucket/test/BucketManagerTests.cpp b/src/bucket/test/BucketManagerTests.cpp index 68143219d2..9aabe7230b 100644 --- a/src/bucket/test/BucketManagerTests.cpp +++ b/src/bucket/test/BucketManagerTests.cpp @@ -22,7 +22,6 @@ #include "ledger/test/LedgerTestUtils.h" #include "main/Application.h" #include "main/Config.h" -#include "main/Maintainer.h" #include "test/Catch2.h" #include "test/TestUtils.h" #include "test/test.h" @@ -713,7 +712,7 @@ TEST_CASE_VERSIONS( tcfg.getArchiveDirName()); UnorderedSet hotArchiveKeys{}; auto lastLcl = lm.getLastClosedLedgerNum(); - while (hm.getPublishQueueCount() < 5) + while (hm.publishQueueLength(cfg) < 5) { // Do not merge this line with the next line: CLOG and // readMergeCounters each acquire a mutex, and it's possible to @@ -807,9 +806,6 @@ TEST_CASE_VERSIONS( while (hm.getPublishSuccessCount() < 5) { clock.crank(false); - - // Trim history after publishing whenever possible. - app->getMaintainer().performMaintenance(50000); } }); } diff --git a/src/bucket/test/BucketTestUtils.cpp b/src/bucket/test/BucketTestUtils.cpp index ae0d0f8e26..54aa3f2280 100644 --- a/src/bucket/test/BucketTestUtils.cpp +++ b/src/bucket/test/BucketTestUtils.cpp @@ -9,6 +9,7 @@ #include "bucket/LiveBucket.h" #include "crypto/Hex.h" #include "herder/Herder.h" +#include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "main/Application.h" #include "test/test.h" @@ -44,8 +45,7 @@ addLiveBatchAndUpdateSnapshot(Application& app, LedgerHeader header, liveBl.addBatch(app, header.ledgerSeq, header.ledgerVersion, initEntries, liveEntries, deadEntries); - app.getBucketManager().getBucketSnapshotManager().updateCurrentSnapshot( - liveBl, app.getBucketManager().getHotArchiveBucketList(), header); + app.getLedgerManager().updateCanonicalStateForTesting(header); } void @@ -57,8 +57,7 @@ addHotArchiveBatchAndUpdateSnapshot( auto& hotArchiveBl = app.getBucketManager().getHotArchiveBucketList(); hotArchiveBl.addBatch(app, header.ledgerSeq, header.ledgerVersion, archiveEntries, restoredEntries); - app.getBucketManager().getBucketSnapshotManager().updateCurrentSnapshot( - app.getBucketManager().getLiveBucketList(), hotArchiveBl, header); + app.getLedgerManager().updateCanonicalStateForTesting(header); } void @@ -173,11 +172,9 @@ countEntries(std::shared_ptr bucket) template size_t countEntries(std::shared_ptr bucket); template size_t countEntries(std::shared_ptr bucket); -void +std::optional LedgerManagerForBucketTests::finalizeLedgerTxnChanges( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, LedgerHeader lh, uint32_t initialLedgerVers) { @@ -262,14 +259,9 @@ LedgerManagerForBucketTests::finalizeLedgerTxnChanges( ltx, mApp); } - // Load the final Soroban config just before sealing the ltx. - std::optional finalSorobanConfig; - if (protocolVersionStartsFrom(lh.ledgerVersion, - SOROBAN_PROTOCOL_VERSION)) - { - finalSorobanConfig = - std::make_optional(SorobanNetworkConfig::loadFromLedger(ltx)); - } + // Seal the ltx and collect its entries, but don't load Soroban + // config yet -- test entries (including network config like eviction + // iterator) are added directly to the BucketList below, not via ltx. ltx.getAllEntries(init, live, dead); // Add dead entries from ltx to entries that will be added to BucketList @@ -310,6 +302,28 @@ LedgerManagerForBucketTests::finalizeLedgerTxnChanges( mApp.getBucketManager().addLiveBatch( mApp, lh, mTestInitEntries, mTestLiveEntries, mTestDeadEntries); + // Load the final Soroban config AFTER addLiveBatch so that test + // entries (e.g. stateArchivalSettings with eviction iterator) are + // visible. We load from a BucketList snapshot rather than ltx + // because test entries bypass ltx entirely. + std::optional finalSorobanConfig; + if (protocolVersionStartsFrom(lh.ledgerVersion, + SOROBAN_PROTOCOL_VERSION)) + { + // Tests may inject config upgrades directly into the BucketList, so + // we need to construct a temp dummy snapshot to load the injected + // config. + LedgerHeaderHistoryEntry tempLcl; + tempLcl.header = lh; + HistoryArchiveState tempHas; + tempHas.currentLedger = lh.ledgerSeq; + auto& bm = mApp.getBucketManager(); + auto tempState = CompleteConstLedgerState::createAndMaybeLoadConfig( + bm.getLiveBucketList(), bm.getHotArchiveBucketList(), tempLcl, + tempHas, mApp.getMetrics()); + finalSorobanConfig = tempState->getSorobanConfig(); + } + mApplyState.updateInMemorySorobanState( mTestInitEntries, mTestLiveEntries, mTestDeadEntries, lh, finalSorobanConfig); @@ -322,12 +336,12 @@ LedgerManagerForBucketTests::finalizeLedgerTxnChanges( mTestArchiveEntries.clear(); mTestRestoredEntries.clear(); mTestDeletedEntries.clear(); + return finalSorobanConfig; } else { - LedgerManagerImpl::finalizeLedgerTxnChanges( - lclSnapshot, lclHotArchiveSnapshot, ltx, ledgerCloseMeta, lh, - initialLedgerVers); + return LedgerManagerImpl::finalizeLedgerTxnChanges( + lclSnapshot, ltx, ledgerCloseMeta, lh, initialLedgerVers); } } diff --git a/src/bucket/test/BucketTestUtils.h b/src/bucket/test/BucketTestUtils.h index 96b57f41f2..003d401d54 100644 --- a/src/bucket/test/BucketTestUtils.h +++ b/src/bucket/test/BucketTestUtils.h @@ -72,10 +72,8 @@ class LedgerManagerForBucketTests : public LedgerManagerImpl std::vector mTestDeletedEntries; protected: - void finalizeLedgerTxnChanges( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + std::optional finalizeLedgerTxnChanges( + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, LedgerHeader lh, uint32_t initialLedgerVers) override; diff --git a/src/catchup/ApplyCheckpointWork.cpp b/src/catchup/ApplyCheckpointWork.cpp index 55baac03cb..00feea3b01 100644 --- a/src/catchup/ApplyCheckpointWork.cpp +++ b/src/catchup/ApplyCheckpointWork.cpp @@ -360,10 +360,19 @@ ApplyCheckpointWork::onRun() openInputFiles(); } - auto lcd = getNextLedgerCloseData(); - if (!lcd) + std::shared_ptr lcd; + try { - return State::WORK_RUNNING; + lcd = getNextLedgerCloseData(); + if (!lcd) + { + return State::WORK_RUNNING; + } + } + catch (std::runtime_error const& e) + { + CLOG_ERROR(History, "ApplyCheckpointWork failed: {}", e.what()); + return State::WORK_FAILURE; } auto applyLedger = std::make_shared(mApp, *lcd); diff --git a/src/catchup/DownloadApplyTxsWork.cpp b/src/catchup/DownloadApplyTxsWork.cpp index ca13047e7c..427fe204b0 100644 --- a/src/catchup/DownloadApplyTxsWork.cpp +++ b/src/catchup/DownloadApplyTxsWork.cpp @@ -24,7 +24,7 @@ DownloadApplyTxsWork::DownloadApplyTxsWork( Application& app, TmpDir const& downloadDir, LedgerRange const& range, LedgerHeaderHistoryEntry& lastApplied, bool waitForPublish, std::shared_ptr archive) - : BatchWork(app, "download-apply-ledgers") + : BatchWork(app, "download-apply-ledgers", BasicWork::RETRY_A_FEW) , mRange(range) , mDownloadDir(downloadDir) , mLastApplied(lastApplied) @@ -146,12 +146,6 @@ DownloadApplyTxsWork::yieldMoreWork() bool pqFellBehind = false; auto predicate = [prev, pqFellBehind, waitForPublish = mWaitForPublish, maybeWaitForMerges](Application& app) mutable { - if (!prev) - { - throw std::runtime_error("Download and apply txs: related Work " - "is destroyed unexpectedly"); - } - // First, ensure download work is finished if (prev->getState() != State::WORK_SUCCESS) { @@ -223,7 +217,7 @@ void DownloadApplyTxsWork::resetIter() { mCheckpointToQueue = HistoryManager::checkpointContainingLedger( - mRange.mFirst, mApp.getConfig()); + mApp.getLedgerManager().getLastClosedLedgerNum() + 1, mApp.getConfig()); mLastYieldedWork.reset(); mLastApplied = mApp.getLedgerManager().getLastClosedLedgerHeader(); } diff --git a/src/catchup/VerifyLedgerChainWork.cpp b/src/catchup/VerifyLedgerChainWork.cpp index dc3e6e61bb..4f57961cea 100644 --- a/src/catchup/VerifyLedgerChainWork.cpp +++ b/src/catchup/VerifyLedgerChainWork.cpp @@ -200,6 +200,13 @@ VerifyLedgerChainWork::verifyHistoryOfSingleCheckpoint() { return HistoryManager::VERIFY_STATUS_ERR_BAD_LEDGER_VERSION; } + catch (std::runtime_error const& e) + { + CLOG_ERROR(History, + "Failed when verifying ledger chain with error {}", + e.what()); + return HistoryManager::VERIFY_STATUS_ERR_CORRUPT_HEADER; + } if (curr.header.ledgerVersion > mApp.getConfig().LEDGER_PROTOCOL_VERSION) @@ -546,6 +553,12 @@ VerifyLedgerChainWork::onRun() CLOG_ERROR(History, "{}", POSSIBLY_CORRUPTED_HISTORY); mApp.getLedgerApplyManager().ledgerChainsVerificationFailed(); return BasicWork::State::WORK_FAILURE; + case HistoryManager::VERIFY_STATUS_ERR_CORRUPT_HEADER: + CLOG_ERROR(History, "Catchup material failed verification - " + "corrupted header, propagating failure"); + CLOG_ERROR(History, "{}", POSSIBLY_CORRUPTED_HISTORY); + mApp.getLedgerApplyManager().ledgerChainsVerificationFailed(); + return BasicWork::State::WORK_FAILURE; default: releaseAssert(false); throw std::runtime_error("unexpected VerifyLedgerChainWork state"); diff --git a/src/database/Database.cpp b/src/database/Database.cpp index a92efbb40e..6c8d4118e7 100644 --- a/src/database/Database.cpp +++ b/src/database/Database.cpp @@ -7,6 +7,7 @@ #include "database/DatabaseConnectionString.h" #include "database/DatabaseTypeSpecificOperation.h" #include "main/Application.h" +#include "main/BannedAccountsPersistor.h" #include "main/Config.h" #include "overlay/StellarXDR.h" #include "util/Decoder.h" @@ -301,15 +302,20 @@ Database::applyMiscSchemaUpgrade(unsigned long vers) BanManager::maybeDropAndCreateNew(mMiscSession); // Copy contents from the main DB. populateMiscDatabase(); + tx.commit(); + // Detach the source database (attached by populateMiscDatabase) + // _after_ commit to avoid "database is locked errors". If schema + // version is already the most recent, DETACH is a no-op. + getRawMiscSession() << "DETACH DATABASE source_db"; + return; + case 2: + // Add banned accounts table for persistent account filtering. + BannedAccountsPersistor::maybeDropAndCreateNew(mMiscSession.session()); break; default: throw std::runtime_error("Unknown DB schema version"); } tx.commit(); - - // Detach the source database _after_ commit to avoid "database is locked - // errors". If schema version is already the most recent, DETACH is a no-op. - getRawMiscSession() << "DETACH DATABASE source_db"; } void @@ -323,6 +329,58 @@ dropMiscTablesFromMain(Application& app) } } +void +migrateLedgerHeadersToStoreState(Database& db) +{ + // Migrate LCL header from ledgerheaders table to storestate + std::string lclHash; + auto& session = db.getSession(); + auto& raw = session.session(); + + bool gotData = false; + // Open a scope because we need prep to be cleaned up before the body of the + // `if` + { + auto prep = db.getPreparedStatement( + "SELECT state FROM storestate WHERE statename = 'lastclosedledger'", + session); + auto& stmt = prep.statement(); + stmt.exchange(soci::into(lclHash)); + stmt.define_and_bind(); + stmt.execute(true); + gotData = stmt.got_data(); + } + + // When we're doing this migration for a new db, storestate will be empty. + // So, only try to set lastclosedledgerheader when the data is found + if (gotData) + { + if (lclHash.empty()) + { + throw std::runtime_error( + "No reference in DB to any last closed ledger"); + } + std::string headerData = + LedgerHeaderUtils::getHeaderDataForHash(db, hexToBin256(lclHash)); + if (headerData.empty()) + { + throw std::runtime_error( + "No ledger header found in DB for last closed ledger hash"); + } + auto prep = + db.getPreparedStatement("INSERT INTO storestate (statename, state) " + "VALUES ('lastclosedledgerheader', :v)", + session); + auto& stmt = prep.statement(); + stmt.exchange(soci::use(headerData)); + stmt.define_and_bind(); + stmt.execute(true); + raw << "DELETE FROM storestate WHERE statename = 'lastclosedledger'"; + } + + raw << "DROP TABLE ledgerheaders"; +} + void Database::applySchemaUpgrade(unsigned long vers) { @@ -343,6 +401,19 @@ Database::applySchemaUpgrade(unsigned long vers) dropMiscTablesFromMain(mApp); } break; + case 27: + // Add banned accounts table for persistent account filtering. + // For SQLite-on-disk this is handled by misc schema upgrade v2; + // for Postgres and in-memory SQLite, create in the main DB. + if (!canUseMiscDB()) + { + BannedAccountsPersistor::maybeDropAndCreateNew(getRawSession()); + } + break; + case 28: + migrateLedgerHeadersToStoreState(*this); + break; + default: throw std::runtime_error("Unknown DB schema version"); } diff --git a/src/database/Database.h b/src/database/Database.h index 66b47ba9be..cb67e711c0 100644 --- a/src/database/Database.h +++ b/src/database/Database.h @@ -29,11 +29,11 @@ class Application; // smallest schema version supported static constexpr unsigned long MIN_SCHEMA_VERSION = 25; -static constexpr unsigned long SCHEMA_VERSION = 26; +static constexpr unsigned long SCHEMA_VERSION = 28; static constexpr unsigned long FIRST_MAIN_VERSION_WITH_MISC = 26; // Misc schema version 0 means no misc table exists yet static constexpr unsigned long MIN_MISC_SCHEMA_VERSION = 0; -static constexpr unsigned long MISC_SCHEMA_VERSION = 1; +static constexpr unsigned long MISC_SCHEMA_VERSION = 2; /** * Helper class for borrowing a SOCI prepared statement handle into a local diff --git a/src/database/test/DatabaseTests.cpp b/src/database/test/DatabaseTests.cpp index e7cb90c1b7..a0242f7258 100644 --- a/src/database/test/DatabaseTests.cpp +++ b/src/database/test/DatabaseTests.cpp @@ -5,11 +5,14 @@ #include "util/asio.h" #include "crypto/Hex.h" #include "crypto/KeyUtils.h" +#include "crypto/SecretKey.h" #include "database/Database.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/test/LedgerTestUtils.h" #include "lib/util/stdrandom.h" #include "main/Application.h" +#include "main/BannedAccountsPersistor.h" #include "main/Config.h" #include "main/PersistentState.h" #include "overlay/BanManager.h" @@ -25,6 +28,7 @@ #include #include #include +#include using namespace stellar; @@ -494,9 +498,18 @@ TEST_CASE("Database splitting migration works correctly", "[db]") "('ledgerupgrades', 'testvalue')", db.getSession()); + LedgerHeader header = LedgerManager::genesisLedger(); + // Change one value from the genesis ledger to ensure that we did + // actually migrate correctly + header.ledgerSeq = 12345; + LedgerHeaderUtils::storeInDatabase(db, header, db.getSession()); + std::string hash; + std::string headerEncoded = + LedgerHeaderUtils::encodeHeader(header, hash); + // Insert test data that should stay in main DB - execSQL("INSERT INTO storestate (statename, state) VALUES " - "('lastclosedledger', 'maintestvalue')", + execSQL("INSERT INTO storestate (statename, state) VALUES " + + fmt::format("('lastclosedledger', '{}')", hash), db.getSession()); // Verify data exists in main before migration @@ -515,13 +528,13 @@ TEST_CASE("Database splitting migration works correctly", "[db]") std::string result; auto prep = db.getPreparedStatement( "SELECT state FROM storestate WHERE statename = " - "'lastclosedledger'", + "'lastclosedledgerheader'", db.getSession()); auto& st = prep.statement(); st.exchange(soci::into(result)); st.define_and_bind(); st.execute(true); - REQUIRE(result == "maintestvalue"); + REQUIRE(result == headerEncoded); } // Verify storestate table still exists in main DB @@ -576,3 +589,212 @@ TEST_CASE("Database splitting migration works correctly", "[db]") } } } + +TEST_CASE("ledgerheaders migration works correctly", "[db]") +{ +#ifdef USE_POSTGRES + Config::TestDbMode mode = GENERATE(Config::TESTDB_BUCKET_DB_PERSISTENT, + Config::TESTDB_POSTGRESQL); +#else + Config::TestDbMode mode = GENERATE(Config::TESTDB_BUCKET_DB_PERSISTENT); +#endif + +#ifdef USE_POSTGRES + INFO("Testing mode: " << (mode == Config::TESTDB_POSTGRESQL + ? "PostgreSQL" + : "Persistent")); +#endif + Config cfg = getTestConfig(0, mode); + + VirtualClock clock; + // Set startApp to false to trigger migration manually + Application::pointer app = createTestApplication( + clock, cfg, /* newDB */ true, /* startApp */ false); + + std::optional expectedLCLHeader; + auto checkMigration = [&app](std::optional expectedLCL) { + REQUIRE(app->getDatabase().getMainDBSchemaVersion() == SCHEMA_VERSION); + REQUIRE_THROWS(app->getDatabase().getRawSession() + << "SELECT COUNT(1) FROM ledgerheaders"); + + { + // Check that lastclosedledger has been removed + auto& sess = app->getDatabase().getRawSession(); + int i; + sess << "SELECT COUNT(1) FROM storestate WHERE statename = " + "'lastclosedledger'", + soci::into(i); + REQUIRE(sess.got_data()); + REQUIRE(i == 0); + } + + std::string lclHeader = app->getPersistentState().getState( + PersistentState::kLastClosedLedgerHeader, + app->getDatabase().getSession()); + + if (expectedLCL) + { + REQUIRE(lclHeader == expectedLCL); + } + else + { + LedgerHeader lh = LedgerHeaderUtils::decodeFromData(lclHeader); + REQUIRE( + app->getLedgerManager().getLastClosedLedgerHeader().header == + lh); + } + }; + + SECTION("Just running newdb") + { + checkMigration(std::nullopt); + } + + SECTION("Migrate from old schema with LCL header") + { + auto& db = app->getDatabase(); + db.initialize(); + + auto& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); + LedgerHeader header = lcl.header; + header.ledgerSeq++; + header.previousLedgerHash = lcl.hash; + LedgerHeaderUtils::storeInDatabase(db, header, db.getSession()); + + std::string hash; + std::string headerEncoded = + LedgerHeaderUtils::encodeHeader(header, hash); + db.getRawSession() + << "INSERT INTO storestate (statename, state) VALUES " + "('lastclosedledger', :h)", + soci::use(hash); + + db.upgradeToCurrentSchema(); + + checkMigration(headerEncoded); + } +} + +#ifdef USE_POSTGRES +TEST_CASE("schema parity across DB backends", "[db][schematest]") +{ + // This test verifies that after initialization, persistent SQLite (with + // main + misc DB split) and PostgreSQL end up with the exact same set of + // tables and the same row counts. It catches bugs where a table or schema + // upgrade is applied for one backend but not the other. + + // Helper: get sorted table names from a SQLite session. + auto getSqliteTables = [](Database& db, SessionWrapper& session) { + std::set tables; + std::string name; + auto prep = db.getPreparedStatement( + "SELECT name FROM sqlite_master WHERE type='table' " + "AND name NOT LIKE 'sqlite_%' ORDER BY name", + session); + auto& st = prep.statement(); + st.exchange(soci::into(name)); + st.define_and_bind(); + st.execute(false); + while (st.fetch()) + { + tables.insert(name); + } + return tables; + }; + + // Helper: count rows in a table. + auto countRows = [](soci::session& sess, std::string const& table) { + int count = 0; + soci::statement st = (sess.prepare << "SELECT COUNT(*) FROM " + table, + soci::into(count)); + st.execute(true); + return count; + }; + + // ---- Build the SQLite persistent reference (main + misc split) ---- + TmpDir tmpDir("schema-parity-test"); + Config cfg1 = getTestConfig(0, Config::TESTDB_BUCKET_DB_PERSISTENT); + cfg1.DATABASE = SecretValue{"sqlite3://" + tmpDir.getName() + "/test.db"}; + // Use non-empty FILTERED_G_ADDRESSES to test migration as well + cfg1.FILTERED_G_ADDRESSES = { + "GBO7VUL2TOKPWFAWKATIW7K3QYA7WQ63VDY5CAE6AFUUX6BHZBOC2WXC", + "GATDQL767ZM2JQTBEG4BQ5WKOQNGAGWZDUN4GYT2UINPEU3RT2UAMVZH"}; + + VirtualClock clock1; + Application::pointer app1 = createTestApplication(clock1, cfg1); + auto& db1 = app1->getDatabase(); + + REQUIRE(db1.canUseMiscDB()); + REQUIRE(db1.getMainDBSchemaVersion() == SCHEMA_VERSION); + REQUIRE(db1.getMiscDBSchemaVersion() == MISC_SCHEMA_VERSION); + + // Union of main + misc tables is the full set + auto mainTables = getSqliteTables(db1, db1.getSession()); + auto miscTables = getSqliteTables(db1, db1.getMiscSession()); + + // Main and misc must not overlap + for (auto const& t : mainTables) + { + INFO("Table in both main and misc: " << t); + REQUIRE(miscTables.count(t) == 0); + } + + std::set allSqliteTables = mainTables; + allSqliteTables.insert(miscTables.begin(), miscTables.end()); + + // ---- PostgreSQL: compare tables and row counts ---- + Config cfg2 = getTestConfig(1, Config::TESTDB_POSTGRESQL); + cfg2.FILTERED_G_ADDRESSES = { + "GBO7VUL2TOKPWFAWKATIW7K3QYA7WQ63VDY5CAE6AFUUX6BHZBOC2WXC", + "GATDQL767ZM2JQTBEG4BQ5WKOQNGAGWZDUN4GYT2UINPEU3RT2UAMVZH"}; + + VirtualClock clock2; + Application::pointer app2 = createTestApplication(clock2, cfg2); + auto& db2 = app2->getDatabase(); + + REQUIRE_FALSE(db2.canUseMiscDB()); + REQUIRE(db2.getMainDBSchemaVersion() == SCHEMA_VERSION); + + // Get Postgres table names + std::set pgTables; + { + std::string name; + soci::statement st = + (db2.getRawSession().prepare << "SELECT tablename FROM pg_tables " + "WHERE schemaname = 'public' " + "ORDER BY tablename", + soci::into(name)); + st.execute(false); + while (st.fetch()) + { + pgTables.insert(name); + } + } + + // Must have the exact same tables + CHECK(pgTables == allSqliteTables); + + // Verify every table has the same row count across both backends. + // slotstate has an extra row in SQLite misc DB for the misc schema + // version, which doesn't exist in Postgres (it uses storestate). + for (auto const& table : allSqliteTables) + { + // For SQLite, query the right session (main or misc) + auto& sqliteSess = miscTables.count(table) ? db1.getRawMiscSession() + : db1.getRawSession(); + int sqliteRows = countRows(sqliteSess, table); + int pgRows = countRows(db2.getRawSession(), table); + + INFO("Table: " << table); + if (table == "slotstate") + { + // SQLite misc DB has one extra row for miscdatabaseschema + CHECK(sqliteRows == pgRows + 1); + } + else + { + CHECK(sqliteRows == pgRows); + } + } +} +#endif diff --git a/src/herder/Herder.h b/src/herder/Herder.h index 0a7a1ce67f..4fc9b685d8 100644 --- a/src/herder/Herder.h +++ b/src/herder/Herder.h @@ -139,10 +139,11 @@ class Herder // generator, and therefore can skip certain expensive validity checks virtual TransactionQueue::AddResult recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf, - bool isLoadgenTx = false) = 0; + bool force = false, bool isLoadgenTx = false) = 0; #else virtual TransactionQueue::AddResult - recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf) = 0; + recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf, + bool force = false) = 0; #endif virtual void peerDoesntHave(stellar::MessageType type, uint256 const& itemID, Peer::pointer peer) = 0; @@ -213,6 +214,9 @@ class Herder // gets the upgrades that are scheduled by this node virtual std::string getUpgradesJson() = 0; + // Override the filtered accounts at runtime using pre-parsed AccountIDs. + virtual void setFilteredAccounts(std::set const& accounts) = 0; + virtual void forceSCPStateIntoSyncWithLastClosedLedger() = 0; // helper function to craft an SCPValue diff --git a/src/herder/HerderImpl.cpp b/src/herder/HerderImpl.cpp index 644e03428a..ef48c4dce0 100644 --- a/src/herder/HerderImpl.cpp +++ b/src/herder/HerderImpl.cpp @@ -5,7 +5,6 @@ #include "herder/HerderImpl.h" #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "crypto/Hex.h" #include "crypto/KeyUtils.h" #include "crypto/SHA.h" @@ -29,10 +28,8 @@ #include "medida/counter.h" #include "medida/meter.h" #include "overlay/OverlayManager.h" -#include "process/ProcessManager.h" #include "scp/LocalNode.h" #include "scp/Slot.h" -#include "transactions/MutableTransactionResult.h" #include "transactions/TransactionUtils.h" #include "util/DebugMetaUtils.h" #include "util/Decoder.h" @@ -257,11 +254,27 @@ HerderImpl::newSlotExternalized(bool synchronous, StellarValue const& value) // perform cleanups // Evict slots that are outside of our ledger validity bracket - auto minSlotToRemember = getMinLedgerSeqToRemember(); - if (minSlotToRemember > LedgerManager::GENESIS_LEDGER_SEQ) + std::optional minSlotToRemember; + auto minSeq = getMinLedgerSeqToRemember(); + if (minSeq > LedgerManager::GENESIS_LEDGER_SEQ) { - eraseBelow(minSlotToRemember); + minSlotToRemember = minSeq; } + + // Evict slots that are too far in the future (only meaningful when + // tracking, as that's when we have a reliable "current" slot index) + std::optional maxSlotToRemember; + if (isTracking()) + { + maxSlotToRemember = + nextConsensusLedgerIndex() + LEDGER_VALIDITY_BRACKET; + } + + if (minSlotToRemember || maxSlotToRemember) + { + eraseOutsideRange(minSlotToRemember, maxSlotToRemember); + } + mPendingEnvelopes.forceRebuildQuorum(); // Process new ready messages for the next slot @@ -530,7 +543,10 @@ HerderImpl::outOfSyncRecovery() if (purgeSlot) { CLOG_INFO(Herder, "Purging slots older than {}", purgeSlot); - eraseBelow(purgeSlot); + // Only erase old slots. Because we're not tracking, we don't have a + // reliable "current" slot index to use for determining which future + // slots to keep. + eraseOutsideRange(purgeSlot, std::nullopt); } auto const& lcl = mLedgerManager.getLastClosedLedgerHeader().header; for (auto const& e : getSCP().getLatestMessagesSend(lcl.ledgerSeq + 1)) @@ -593,7 +609,8 @@ HerderImpl::emitEnvelope(SCPEnvelope const& envelope) } TransactionQueue::AddResult -HerderImpl::recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf +HerderImpl::recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf, + bool force #ifdef BUILD_TESTS , bool isLoadgenTx @@ -625,7 +642,7 @@ HerderImpl::recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf } else if (!tx->isSoroban()) { - result = mTransactionQueue.tryAdd(tx, submittedFromSelf + result = mTransactionQueue.tryAdd(tx, submittedFromSelf, force #ifdef BUILD_TESTS , isLoadgenTx @@ -634,7 +651,7 @@ HerderImpl::recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf } else if (mSorobanTransactionQueue) { - result = mSorobanTransactionQueue->tryAdd(tx, submittedFromSelf + result = mSorobanTransactionQueue->tryAdd(tx, submittedFromSelf, force #ifdef BUILD_TESTS , isLoadgenTx @@ -1288,14 +1305,44 @@ HerderImpl::setupTriggerNextLedger() #endif } +// Returns the ledger index of the oldest ledger that it is safe to delete while +// still keeping all the information needed to publish checkpoints +static uint32_t +getSafeLedgerToDelete(uint32_t ledger, Config const& cfg) +{ + // Calculate the minimum of ledger and/or any queued checkpoint. + uint32_t ql = HistoryManager::getMinLedgerQueuedToPublish(cfg); + uint32_t qmin = ql == 0 ? ledger : std::min(ql, ledger); + + // Next calculate, given qmin, the first ledger it'd be _safe to delete_ + // while still keeping everything required to publish. So if qmin is + // (for example) 0x7f = 127, then we want to keep 64 ledgers before + // that, and therefore can erase 0x3f = 63 and less. + uint32_t freq = HistoryManager::getCheckpointFrequency(cfg); + return qmin >= freq ? qmin - freq : 0; +} + void -HerderImpl::eraseBelow(uint32 ledgerSeq) +HerderImpl::eraseOutsideRange(std::optional minSlot, + std::optional maxSlot) { auto lastCheckpointSeq = getMostRecentCheckpointSeq(); - getHerderSCPDriver().purgeSlots(ledgerSeq, lastCheckpointSeq); - mPendingEnvelopes.eraseBelow(ledgerSeq, lastCheckpointSeq); - auto lastIndex = trackingConsensusLedgerIndex(); - mApp.getOverlayManager().clearLedgersBelow(ledgerSeq, lastIndex); + getHerderSCPDriver().purgeSlotsOutsideRange(minSlot, maxSlot, + lastCheckpointSeq); + mPendingEnvelopes.eraseOutsideRange(minSlot, maxSlot, lastCheckpointSeq); + + if (minSlot) + { + auto lastIndex = trackingConsensusLedgerIndex(); + mApp.getOverlayManager().clearLedgersBelow(*minSlot, lastIndex); + uint32_t lmin = getSafeLedgerToDelete(*minSlot, mApp.getConfig()); + // To avoid blocking too long, don't delete more than one checkpoint of + // history + uint32_t const ledgersToDelete = + HistoryManager::getCheckpointFrequency(mApp.getConfig()); + HerderPersistence::deleteOldEntries( + mApp.getDatabase().getRawMiscSession(), lmin, ledgersToDelete); + } } bool @@ -1540,8 +1587,8 @@ HerderImpl::triggerNextLedger(uint32_t ledgerSeqToTrigger, // see if we need to include some upgrades std::vector upgrades; { - LedgerSnapshot ls(mApp); - upgrades = mUpgrades.createUpgradesFor(lcl.header, ls); + LedgerReadView lrv(mApp); + upgrades = mUpgrades.createUpgradesFor(lcl.header, lrv); } for (auto const& upgrade : upgrades) { @@ -1608,8 +1655,18 @@ HerderImpl::setUpgrades(Upgrades::UpgradeParameters const& upgrades) std::string HerderImpl::getUpgradesJson() { - auto ls = LedgerSnapshot(mApp); - return mUpgrades.getParameters().toDebugJson(ls); + auto lrv = LedgerReadView(mApp); + return mUpgrades.getParameters().toDebugJson(lrv); +} + +void +HerderImpl::setFilteredAccounts(std::set const& accounts) +{ + mTransactionQueue.setFilteredAccounts(accounts); + if (mSorobanTransactionQueue) + { + mSorobanTransactionQueue->setFilteredAccounts(accounts); + } } void @@ -2358,6 +2415,22 @@ HerderImpl::start() restoreUpgrades(); startTxSetGCTimer(); startCheckForDeadNodesInterval(); + + auto& bap = mApp.getBannedAccountsPersistor(); + if (!mApp.getConfig().FILTERED_G_ADDRESSES.empty()) + { + CLOG_WARNING( + Herder, + "FILTERED_G_ADDRESSES is deprecated and will be removed in a " + "future release. The current {} address(es) will be stored in the " + "database. You can safely remove FILTERED_G_ADDRESSES from the " + "config. Use 'banaccounts'/'unbanaccounts' HTTP commands to manage " + "banned accounts going forward.", + mApp.getConfig().FILTERED_G_ADDRESSES.size()); + bap.addBannedAccounts(mApp.getConfig().FILTERED_G_ADDRESSES); + } + + setFilteredAccounts(bap.getBannedAccounts()); } void @@ -2491,8 +2564,9 @@ HerderImpl::updateTransactionQueue(TxSetXDRFrameConstPtr externalizedTxSet, externalizedTxSet->createTransactionFrames(mApp.getNetworkID()); auto lhhe = mLedgerManager.getLastClosedLedgerHeader(); - - auto updateQueue = [&](auto& queue, auto const& applied, bool isSoroban) { + UnorderedMap accountFeeMap; + auto updateQueue = [&accountFeeMap, this, queueRebuildNeeded, &lhhe]( + auto& queue, auto const& applied, bool isSoroban) { queue.removeApplied(applied); queue.shift(); @@ -2505,7 +2579,7 @@ HerderImpl::updateTransactionQueue(TxSetXDRFrameConstPtr externalizedTxSet, auto txs = queue.getTransactions(lhhe.header); auto invalidTxs = TxSetUtils::getInvalidTxListWithErrors( - txs, mApp, 0, + txs, mApp, accountFeeMap, 0, getUpperBoundCloseTimeOffset( mApp, lhhe.header.scpValue.closeTime)) .first; diff --git a/src/herder/HerderImpl.h b/src/herder/HerderImpl.h index 69d0cdcf45..ef3fa1d032 100644 --- a/src/herder/HerderImpl.h +++ b/src/herder/HerderImpl.h @@ -15,6 +15,7 @@ #include "util/XDROperators.h" #include #include +#include #include namespace medida @@ -100,11 +101,11 @@ class HerderImpl : public Herder #ifdef BUILD_TESTS TransactionQueue::AddResult recvTransaction(TransactionFrameBasePtr tx, bool submittedFromSelf, - bool isLoadgenTx = false) override; + bool force = false, bool isLoadgenTx = false) override; #else - TransactionQueue::AddResult - recvTransaction(TransactionFrameBasePtr tx, - bool submittedFromSelf) override; + TransactionQueue::AddResult recvTransaction(TransactionFrameBasePtr tx, + bool submittedFromSelf, + bool force = false) override; #endif EnvelopeStatus recvSCPEnvelope(SCPEnvelope const& envelope) override; @@ -191,6 +192,8 @@ class HerderImpl : public Herder void setUpgrades(Upgrades::UpgradeParameters const& upgrades) override; std::string getUpgradesJson() override; + void setFilteredAccounts(std::set const& accounts) override; + void forceSCPStateIntoSyncWithLastClosedLedger() override; bool resolveNodeID(std::string const& s, PublicKey& retKey) override; @@ -347,10 +350,12 @@ class HerderImpl : public Herder void checkAndMaybeReanalyzeQuorumMapV2(); - // erase all data for ledgers strictly less than ledgerSeq except for the - // first ledger on the current checkpoint. Hold onto this ledger so - // peers can catchup without waiting for the next checkpoint. - void eraseBelow(uint32 ledgerSeq); + // erase all data for ledgers outside the range [minSlot, maxSlot]. + // Either bound may be nullopt to skip that direction. + // Always preserves the first ledger on the current checkpoint so peers + // can catchup without waiting for the next checkpoint. + void eraseOutsideRange(std::optional minSlot, + std::optional maxSlot); std::shared_ptr mLastQuorumMapIntersectionState; diff --git a/src/herder/HerderSCPDriver.cpp b/src/herder/HerderSCPDriver.cpp index 3d6ad984b0..b1b4f54aee 100644 --- a/src/herder/HerderSCPDriver.cpp +++ b/src/herder/HerderSCPDriver.cpp @@ -332,72 +332,89 @@ HerderSCPDriver::validateValueAgainstLocalState(uint64_t slotIndex, return res; } -SCPDriver::ValidationLevel -HerderSCPDriver::validateValue(uint64_t slotIndex, Value const& value, - bool nomination) +bool +HerderSCPDriver::deserializeAndValidateStellarValue(Value const& value, + StellarValue& sv) const { ZoneScoped; - releaseAssert(threadIsMain()); - - StellarValue b; try { ZoneNamedN(xdrZone, "XDR deserialize", true); - xdr::xdr_from_opaque(value, b); + xdr::xdr_from_opaque(value, sv); } catch (...) { - mSCPMetrics.mValueInvalid.Mark(); - return SCPDriver::kInvalidValue; + return false; } - if (b.ext.v() != STELLAR_VALUE_SIGNED) + if (sv.ext.v() != STELLAR_VALUE_SIGNED) { - CLOG_TRACE(Herder, - "HerderSCPDriver::validateValue i: {} invalid value type - " - "expected SIGNED", - slotIndex); - return SCPDriver::kInvalidValue; + return false; } { ZoneNamedN(sigZone, "signature check", true); - if (!mHerder.verifyStellarValueSignature(b)) + if (!mHerder.verifyStellarValueSignature(sv)) { - return SCPDriver::kInvalidValue; + return false; + } + } + + return true; +} + +void +HerderSCPDriver::extractValidUpgrades(StellarValue& sv, bool nomination) const +{ + LedgerUpgradeType lastUpgradeType = LEDGER_UPGRADE_VERSION; + LedgerUpgradeType thisUpgradeType; + bool first = true; + for (auto it = sv.upgrades.begin(); it != sv.upgrades.end();) + { + if (!mUpgrades.isValid(*it, thisUpgradeType, nomination, mApp)) + { + it = sv.upgrades.erase(it); + } + else if (!first && lastUpgradeType >= thisUpgradeType) + { + it = sv.upgrades.erase(it); + } + else + { + lastUpgradeType = thisUpgradeType; + first = false; + it++; } } +} + +SCPDriver::ValidationLevel +HerderSCPDriver::validateValue(uint64_t slotIndex, Value const& value, + bool nomination) +{ + ZoneScoped; + releaseAssert(threadIsMain()); + + StellarValue b; + if (!deserializeAndValidateStellarValue(value, b)) + { + mSCPMetrics.mValueInvalid.Mark(); + return SCPDriver::kInvalidValue; + } SCPDriver::ValidationLevel res = validateValueAgainstLocalState(slotIndex, b, nomination); if (res != SCPDriver::kInvalidValue) { - LedgerUpgradeType lastUpgradeType = LEDGER_UPGRADE_VERSION; - - // check upgrades - for (size_t i = 0; - i < b.upgrades.size() && res != SCPDriver::kInvalidValue; i++) + auto origSize = b.upgrades.size(); + extractValidUpgrades(b, nomination); + if (b.upgrades.size() != origSize) { - LedgerUpgradeType thisUpgradeType; - if (!mUpgrades.isValid(b.upgrades[i], thisUpgradeType, nomination, - mApp)) - { - CLOG_TRACE(Herder, - "HerderSCPDriver::validateValue invalid step at " - "index {}", - i); - res = SCPDriver::kInvalidValue; - } - else if (i != 0 && (lastUpgradeType >= thisUpgradeType)) - { - CLOG_TRACE(Herder, - "HerderSCPDriver::validateValue out of " - "order upgrade step at index {}", - i); - res = SCPDriver::kInvalidValue; - } - - lastUpgradeType = thisUpgradeType; + CLOG_TRACE(Herder, + "HerderSCPDriver::validateValue i: {} rejected due to " + "invalid or misordered upgrade steps", + slotIndex); + res = SCPDriver::kInvalidValue; } } @@ -417,32 +434,16 @@ HerderSCPDriver::extractValidValue(uint64_t slotIndex, Value const& value) { ZoneScoped; StellarValue b; - try - { - xdr::xdr_from_opaque(value, b); - } - catch (...) + if (!deserializeAndValidateStellarValue(value, b)) { return nullptr; } + ValueWrapperPtr res; if (validateValueAgainstLocalState(slotIndex, b, true) == SCPDriver::kFullyValidatedValue) { - // remove the upgrade steps we don't like - LedgerUpgradeType thisUpgradeType; - for (auto it = b.upgrades.begin(); it != b.upgrades.end();) - { - if (!mUpgrades.isValid(*it, thisUpgradeType, true, mApp)) - { - it = b.upgrades.erase(it); - } - else - { - it++; - } - } - + extractValidUpgrades(b, true); res = wrapStellarValue(b); } @@ -1244,6 +1245,24 @@ HerderSCPDriver::recordSCPExecutionMetrics(uint64_t slotIndex) mNominateTimeout.Update(SCPTiming.mNominationTimeoutCount); mPrepareTimeout.Update(SCPTiming.mPrepareTimeoutCount); + if (SCPTiming.mNominationTimeoutCount > 0) + { + auto const leaders = getSCP().getNominationLeaders(slotIndex); + std::string leaderStr; + for (auto const& leader : leaders) + { + if (!leaderStr.empty()) + { + leaderStr += ", "; + } + leaderStr += toShortString(leader); + } + CLOG_INFO(Herder, + "Nomination for slot {} timed out {} time(s) with " + "the following round leaders: [{}]", + slotIndex, SCPTiming.mNominationTimeoutCount, leaderStr); + } + // Compute nomination time if (SCPTiming.mNominationStart && SCPTiming.mPrepareStart) { @@ -1279,12 +1298,13 @@ HerderSCPDriver::recordSCPExecutionMetrics(uint64_t slotIndex) } void -HerderSCPDriver::purgeSlots(uint64_t maxSlotIndex, uint64 slotToKeep) +HerderSCPDriver::purgeSlotsOutsideRange(std::optional minSlotIndex, + std::optional maxSlotIndex, + uint64 slotToKeep) { - // Clean up timings map - auto it = mSCPExecutionTimes.begin(); - while (it != mSCPExecutionTimes.end() && it->first < maxSlotIndex) - { + // Erase `it` and advance it, unless `it` is `slotToKeep`, in which case + // just advance it. + auto const maybePurge = [&](auto& it) { if (it->first == slotToKeep) { ++it; @@ -1293,9 +1313,29 @@ HerderSCPDriver::purgeSlots(uint64_t maxSlotIndex, uint64 slotToKeep) { it = mSCPExecutionTimes.erase(it); } + }; + + // Clean up timings map — below + if (minSlotIndex) + { + auto it = mSCPExecutionTimes.begin(); + while (it != mSCPExecutionTimes.end() && it->first < *minSlotIndex) + { + maybePurge(it); + } + } + + // Clean up timings map — above + if (maxSlotIndex) + { + auto it = mSCPExecutionTimes.upper_bound(*maxSlotIndex); + while (it != mSCPExecutionTimes.end()) + { + maybePurge(it); + } } - getSCP().purgeSlots(maxSlotIndex, slotToKeep); + getSCP().purgeSlotsOutsideRange(minSlotIndex, maxSlotIndex, slotToKeep); } void diff --git a/src/herder/HerderSCPDriver.h b/src/herder/HerderSCPDriver.h index 49a01316f3..1d5871cf26 100644 --- a/src/herder/HerderSCPDriver.h +++ b/src/herder/HerderSCPDriver.h @@ -130,8 +130,11 @@ class HerderSCPDriver : public SCPDriver ValueWrapperPtr wrapValue(Value const& sv) override; - // clean up older slots - void purgeSlots(uint64_t maxSlotIndex, uint64 slotToKeep); + // clean up slots outside the valid range [minSlotIndex, maxSlotIndex] + // Either bound may be nullopt to skip that direction. + void purgeSlotsOutsideRange(std::optional minSlotIndex, + std::optional maxSlotIndex, + uint64 slotToKeep); double getExternalizeLag(NodeID const& id) const; @@ -276,5 +279,9 @@ class HerderSCPDriver : public SCPDriver bool checkAndCacheTxSetValid(TxSetXDRFrame const& txSet, LedgerHeaderHistoryEntry const& lcl, uint64_t closeTimeOffset) const; + + bool deserializeAndValidateStellarValue(Value const& value, + StellarValue& sv) const; + void extractValidUpgrades(StellarValue& sv, bool nomination) const; }; } diff --git a/src/herder/ParallelTxSetBuilder.cpp b/src/herder/ParallelTxSetBuilder.cpp index 96901eed16..dacb0ebdf5 100644 --- a/src/herder/ParallelTxSetBuilder.cpp +++ b/src/herder/ParallelTxSetBuilder.cpp @@ -8,6 +8,8 @@ #include "transactions/TransactionFrameBase.h" #include "util/BitSet.h" +#include +#include #include namespace stellar @@ -92,9 +94,15 @@ struct Cluster class Stage { public: - Stage(ParallelPartitionConfig cfg) : mConfig(cfg) + Stage(Stage const&) = delete; + Stage& operator=(Stage const&) = delete; + + Stage(Stage&&) = default; + Stage& operator=(Stage&&) = default; + + Stage(ParallelPartitionConfig cfg, size_t txCount) + : mConfig(cfg), mTxToCluster(txCount, nullptr) { - mBinPacking.resize(mConfig.mClustersPerStage); mBinInstructions.resize(mConfig.mClustersPerStage); } @@ -113,23 +121,45 @@ class Stage // First, find all clusters that conflict with the new transaction. auto conflictingClusters = getConflictingClusters(tx); - // Then, try creating new clusters by merging the conflicting clusters - // together and adding the new transaction to the resulting cluster. - // Note, that the new cluster is guaranteed to be added at the end of - // `newClusters`. - auto newClusters = createNewClusters(tx, conflictingClusters); - // Fail fast if a new cluster will end up too large to fit into the - // stage and thus no new clusters could be created. - if (!newClusters) + // Check if the merged cluster would exceed the instruction limit. + uint64_t mergedInstructions = tx.mInstructions; + for (auto const* cluster : conflictingClusters) + { + mergedInstructions += cluster->mInstructions; + } + if (mergedInstructions > mConfig.mInstructionsPerCluster) { return false; } + + // Create the merged cluster from the new transaction and all + // conflicting clusters. + auto newCluster = std::make_unique(tx); + for (auto const* cluster : conflictingClusters) + { + newCluster->merge(*cluster); + } + + // Mutate mClusters in-place: remove conflicting clusters (saving + // them for potential rollback) and append the new merged cluster. + std::vector> savedClusters; + if (!conflictingClusters.empty()) + { + savedClusters.reserve(conflictingClusters.size()); + removeConflictingClusters(conflictingClusters, savedClusters); + } + mClusters.push_back(std::move(newCluster)); + // If it's possible to pack the newly-created cluster into one of the // bins 'in-place' without rebuilding the bin-packing, we do so. - if (inPlaceBinPacking(*newClusters->back(), conflictingClusters)) + auto* addedCluster = mClusters.back().get(); + if (inPlaceBinPacking(*addedCluster, conflictingClusters)) { - mClusters = std::move(newClusters.value()); mInstructions += tx.mInstructions; + // Update the global conflict mask so future lookups can + // fast-path when a tx has no conflicts with any cluster. + mAllConflictTxs.inplaceUnion(tx.mConflictTxs); + updateTxToCluster(*addedCluster); return true; } @@ -162,25 +192,28 @@ class Stage { if (mTriedCompactingBinPacking) { + rollbackClusters(addedCluster, savedClusters); return false; } mTriedCompactingBinPacking = true; } // Try to recompute the bin-packing from scratch with a more efficient - // heuristic. + // heuristic. binPacking() sorts mClusters in-place. std::vector newBinInstructions; - auto newPacking = binPacking(*newClusters, newBinInstructions); // Even if the new cluster is below the limit, it may invalidate the // stage as a whole in case if we can no longer pack the clusters into // the required number of bins. - if (!newPacking) + if (!binPacking(mClusters, newBinInstructions)) { + rollbackClusters(addedCluster, savedClusters); return false; } - mClusters = std::move(newClusters.value()); - mBinPacking = std::move(newPacking.value()); mInstructions += tx.mInstructions; mBinInstructions = newBinInstructions; + // Update the global conflict mask so future lookups can + // fast-path when a tx has no conflicts with any cluster. + mAllConflictTxs.inplaceUnion(tx.mConflictTxs); + updateTxToCluster(*addedCluster); return true; } @@ -205,17 +238,41 @@ class Stage std::unordered_set getConflictingClusters(BuilderTx const& tx) const { + // Fast path: if the tx's id is not in any cluster's conflict set, + // there are no conflicting clusters. + if (!mAllConflictTxs.get(tx.mId)) + { + return {}; + } + // O(K) lookup: iterate the conflict tx ids and find their + // clusters via the tx-to-cluster mapping, instead of scanning + // all clusters (which would be O(C)). std::unordered_set conflictingClusters; - for (auto const& cluster : mClusters) + size_t conflictTxId = 0; + while (tx.mConflictTxs.nextSet(conflictTxId)) { - if (cluster->mConflictTxs.get(tx.mId)) + auto const* cluster = mTxToCluster[conflictTxId]; + if (cluster != nullptr) { - conflictingClusters.insert(cluster.get()); + conflictingClusters.insert(cluster); } + ++conflictTxId; } return conflictingClusters; } + void + updateTxToCluster(Cluster const& cluster) + { + auto* clusterPtr = &cluster; + size_t txId = 0; + while (cluster.mTxIds.nextSet(txId)) + { + mTxToCluster[txId] = clusterPtr; + ++txId; + } + } + bool inPlaceBinPacking( Cluster const& newCluster, @@ -225,8 +282,6 @@ class Stage for (auto const& cluster : clustersToRemove) { mBinInstructions[cluster->mBinId.value()] -= cluster->mInstructions; - mBinPacking[cluster->mBinId.value()].inplaceDifference( - cluster->mTxIds); } for (size_t binId = 0; binId < mConfig.mClustersPerStage; ++binId) @@ -235,7 +290,6 @@ class Stage mConfig.mInstructionsPerCluster) { mBinInstructions[binId] += newCluster.mInstructions; - mBinPacking[binId].inplaceUnion(newCluster.mTxIds); newCluster.mBinId = std::make_optional(binId); return true; } @@ -244,53 +298,65 @@ class Stage for (auto const& cluster : clustersToRemove) { mBinInstructions[cluster->mBinId.value()] += cluster->mInstructions; - mBinPacking[cluster->mBinId.value()].inplaceUnion(cluster->mTxIds); } return false; } - std::optional>> - createNewClusters( - BuilderTx const& tx, - std::unordered_set const& txConflicts) const + // Remove conflicting clusters from mClusters in-place, saving them + // in 'saved' for potential rollback. + void + removeConflictingClusters( + std::unordered_set const& toRemove, + std::vector>& saved) { - uint64_t newInstructions = tx.mInstructions; - for (auto const* cluster : txConflicts) - { - newInstructions += cluster->mInstructions; - } - - // Fast-fail condition to ensure that the new cluster doesn't exceed - // the instructions limit. - if (newInstructions > mConfig.mInstructionsPerCluster) - { - return std::nullopt; - } - auto newCluster = std::make_shared(tx); - for (auto const* cluster : txConflicts) + size_t writePos = 0; + for (size_t readPos = 0; readPos < mClusters.size(); ++readPos) { - newCluster->merge(*cluster); + if (toRemove.find(mClusters[readPos].get()) != toRemove.end()) + { + saved.push_back(std::move(mClusters[readPos])); + } + else + { + if (writePos != readPos) + { + mClusters[writePos] = std::move(mClusters[readPos]); + } + ++writePos; + } } + mClusters.resize(writePos); + } - std::vector> newClusters; - newClusters.reserve(mClusters.size() + 1 - txConflicts.size()); - for (auto const& cluster : mClusters) + // Rollback an in-place mutation: find and remove the merged cluster, + // then restore the saved conflicting clusters. + void + rollbackClusters(Cluster const* mergedCluster, + std::vector>& savedClusters) + { + // Find and swap-pop the merged cluster. + for (size_t i = 0; i < mClusters.size(); ++i) { - if (txConflicts.find(cluster.get()) == txConflicts.end()) + if (mClusters[i].get() == mergedCluster) { - newClusters.push_back(cluster); + mClusters[i] = std::move(mClusters.back()); + mClusters.pop_back(); + break; } } - newClusters.push_back(newCluster); - return std::make_optional(std::move(newClusters)); + // Restore the saved conflicting clusters. + for (auto& saved : savedClusters) + { + mClusters.push_back(std::move(saved)); + } } // Simple bin-packing first-fit-decreasing heuristic // (https://en.wikipedia.org/wiki/First-fit-decreasing_bin_packing). // This has around 11/9 maximum approximation ratio, which probably has // the best complexity/performance tradeoff out of all the heuristics. - std::optional> - binPacking(std::vector>& clusters, + bool + binPacking(std::vector>& clusters, std::vector& binInsns) const { // We could consider dropping the sort here in order to save some time @@ -302,7 +368,6 @@ class Stage }); size_t const binCount = mConfig.mClustersPerStage; binInsns.resize(binCount); - std::vector bins(binCount); std::vector newBinId(clusters.size()); // Just add every cluster into the first bin it fits into. for (size_t clusterId = 0; clusterId < clusters.size(); ++clusterId) @@ -315,7 +380,6 @@ class Stage mConfig.mInstructionsPerCluster) { binInsns[i] += cluster->mInstructions; - bins[i].inplaceUnion(cluster->mTxIds); newBinId[clusterId] = i; packed = true; break; @@ -323,7 +387,7 @@ class Stage } if (!packed) { - return std::nullopt; + return false; } } for (size_t clusterId = 0; clusterId < clusters.size(); ++clusterId) @@ -331,7 +395,7 @@ class Stage clusters[clusterId]->mBinId = std::make_optional(newBinId[clusterId]); } - return std::make_optional(bins); + return true; } // The `Cluster`s in `mClusters` are groups of transactions that have // (transitive) data dependencies between one another. If there is a data @@ -344,7 +408,7 @@ class Stage // Looked at another way: two clusters that _aren't_ merged by the end of // the process of forming clusters _are_ data-independent and _could_ // potentially run in parallel. - std::vector> mClusters; + std::vector> mClusters; // The clusters formed by data dependency merging may, however, // significantly outnumber the maximum _allowed_ amount of parallelism in // the stage -- a number called `ledgerMaxDependentTxClusters` in CAP-0063 @@ -369,11 +433,18 @@ class Stage // threads that all nodes _must_ have, and running bin-packing against that // minimum assumption, we can form txsets into binned clusters each small // enough to run in the close-time target on the guaranteed parallelism. - std::vector mBinPacking; std::vector mBinInstructions; uint64_t mInstructions = 0; ParallelPartitionConfig mConfig; bool mTriedCompactingBinPacking = false; + // Union of all clusters' mConflictTxs. Used as a fast-path check in + // getConflictingClusters to avoid scanning all clusters when the + // transaction has no conflicts with any existing cluster. + BitSet mAllConflictTxs; + // Maps tx id -> cluster pointer for O(K) conflict lookup. + // Sized to the total number of transactions; nullptr means the tx + // has not been added to this stage. + std::vector mTxToCluster; }; struct ParallelPhaseBuildResult @@ -385,53 +456,68 @@ struct ParallelPhaseBuildResult ParallelPhaseBuildResult buildSurgePricedParallelSorobanPhaseWithStageCount( - SurgePricingPriorityQueue queue, - std::unordered_map const& - builderTxForTx, - TxFrameList const& txFrames, uint32_t stageCount, - SorobanNetworkConfig const& sorobanCfg, - std::shared_ptr laneConfig, uint32_t ledgerVersion) + std::vector const& sortedTxOrder, + std::vector const& txResources, Resource const& laneLimit, + std::vector const& builderTxs, TxFrameList const& txFrames, + uint32_t stageCount, SorobanNetworkConfig const& sorobanCfg) { ZoneScoped; ParallelPartitionConfig partitionCfg(stageCount, sorobanCfg); - std::vector stages(partitionCfg.mStageCount, partitionCfg); + std::vector stages; + stages.reserve(partitionCfg.mStageCount); + for (uint32_t i = 0; i < partitionCfg.mStageCount; ++i) + { + stages.emplace_back(partitionCfg, txFrames.size()); + } + + // Iterate transactions in decreasing fee order and try greedily pack them + // into one of the stages until the limits are reached. Transactions that + // don't fit into any of the stages are skipped and surge pricing will be + // triggered for the transaction set. + Resource laneLeft = laneLimit; + bool hadTxNotFittingLane = false; - // Visit the transactions in the surge pricing queue and try to add them to - // at least one of the stages. - auto visitor = [&stages, - &builderTxForTx](TransactionFrameBaseConstPtr const& tx) { + for (size_t txIdx : sortedTxOrder) + { + auto const& txRes = txResources[txIdx]; + + // Check if the transaction fits within the remaining lane resource + // limits. This mirrors the anyGreater check in popTopTxs that skips + // transactions exceeding resource limits. + if (anyGreater(txRes, laneLeft)) + { + hadTxNotFittingLane = true; + continue; + } + + // Try to add the transaction to one of the stages. bool added = false; - auto builderTxIt = builderTxForTx.find(tx); - releaseAssert(builderTxIt != builderTxForTx.end()); for (auto& stage : stages) { - if (stage.tryAdd(*builderTxIt->second)) + if (stage.tryAdd(builderTxs[txIdx])) { added = true; break; } } + if (added) { - return SurgePricingPriorityQueue::VisitTxResult::PROCESSED; + // Transaction included in the stage, update the remaining lane + // resources. + laneLeft -= txRes; } - // If a transaction didn't fit into any of the stages, we consider it - // to have been excluded due to resource limits and thus notify the - // surge pricing queue that surge pricing should be triggered ( - // REJECTED imitates the behavior for exceeding the resource limit - // within the queue itself). - return SurgePricingPriorityQueue::VisitTxResult::REJECTED; - }; + else + { + // Transaction didn't fit into any of the stages, mark that lane + // limits were exceeded to trigger surge pricing. + hadTxNotFittingLane = true; + } + } ParallelPhaseBuildResult result; - std::vector laneLeftUntilLimitUnused; - queue.popTopTxs(/* allowGaps */ true, visitor, laneLeftUntilLimitUnused, - result.mHadTxNotFittingLane, ledgerVersion); - // There is only a single fee lane for Soroban, so there is only a single - // flag that indicates whether there was a transaction that didn't fit into - // lane (and thus all transactions are surge priced at once). - releaseAssert(result.mHadTxNotFittingLane.size() == 1); + result.mHadTxNotFittingLane = {hadTxNotFittingLane}; // At this point the stages have been filled with transactions and we just // need to place the full transactions into the respective stages/clusters. @@ -442,22 +528,20 @@ buildSurgePricedParallelSorobanPhaseWithStageCount( auto& resStage = result.mStages.emplace_back(); resStage.reserve(partitionCfg.mClustersPerStage); - std::unordered_map clusterIdToStageCluster; + std::vector binToStageCluster( + partitionCfg.mClustersPerStage, std::numeric_limits::max()); - stage.visitAllTransactions( - [&resStage, &txFrames, &clusterIdToStageCluster, - &totalInclusionFee](size_t clusterId, size_t txId) { - auto it = clusterIdToStageCluster.find(clusterId); - if (it == clusterIdToStageCluster.end()) - { - it = clusterIdToStageCluster - .emplace(clusterId, resStage.size()) - .first; - resStage.emplace_back(); - } - totalInclusionFee += txFrames[txId]->getInclusionFee(); - resStage[it->second].push_back(txFrames[txId]); - }); + stage.visitAllTransactions([&resStage, &txFrames, &binToStageCluster, + &totalInclusionFee](size_t binId, + size_t txId) { + if (binToStageCluster[binId] == std::numeric_limits::max()) + { + binToStageCluster[binId] = resStage.size(); + resStage.emplace_back(); + } + totalInclusionFee += txFrames[txId]->getInclusionFee(); + resStage[binToStageCluster[binId]].push_back(txFrames[txId]); + }); // Algorithm ensures that clusters are populated from first to last and // no empty clusters are generated. for (auto const& cluster : resStage) @@ -480,107 +564,188 @@ buildSurgePricedParallelSorobanPhaseWithStageCount( return result; } -} // namespace - -TxStageFrameList -buildSurgePricedParallelSorobanPhase( - TxFrameList const& txFrames, Config const& cfg, - SorobanNetworkConfig const& sorobanCfg, - std::shared_ptr laneConfig, - std::vector& hadTxNotFittingLane, uint32_t ledgerVersion) +std::vector +prepareBuilderTxs(TxFrameList const& txFrames) { - ZoneScoped; - // We prefer the transaction sets that are well utilized, but we also want - // to lower the stage count when possible. Thus we will nominate a tx set - // that has the lowest amount of stages while still being within - // MAX_INCLUSION_FEE_TOLERANCE_FOR_STAGE_COUNT from the maximum total - // inclusion fee (a proxy for the transaction set utilization). - double const MAX_INCLUSION_FEE_TOLERANCE_FOR_STAGE_COUNT = 0.999; - - // Simplify the transactions to the minimum necessary amount of data. - std::unordered_map - builderTxForTx; - std::vector> builderTxs; + std::vector builderTxs; builderTxs.reserve(txFrames.size()); for (size_t i = 0; i < txFrames.size(); ++i) { - auto const& txFrame = txFrames[i]; - builderTxs.emplace_back(std::make_unique(i, *txFrame)); - builderTxForTx.emplace(txFrame, builderTxs.back().get()); + builderTxs.emplace_back(i, *txFrames[i]); } // Before trying to include any transactions, find all the pairs of the // conflicting transactions and mark the conflicts in the builderTxs. // - // In order to find the conflicts, we build the maps from the footprint - // keys to transactions, then mark the conflicts between the transactions - // that share RW key, or between the transactions that share RO and RW key. - // - // The approach here is optimized towards the low number of conflicts, - // specifically when there are no conflicts at all, the complexity is just - // O(total_footprint_entry_count). The worst case is roughly - // O(max_tx_footprint_size * transaction_count ^ 2), which is equivalent - // to the complexity of the straightforward approach of iterating over all - // the transaction pairs. + // We use a sort-based approach: collect all footprint entries into a flat + // vector tagged with (key hash, tx id, RO/RW), sort by hash, + // then scan for groups sharing the same key hash. This is significantly + // faster in practice than using hash map lookups. // // This also has the further optimization potential: we could populate the // key maps and even the conflicting transactions eagerly in tx queue, thus // amortizing the costs across the whole ledger duration. - UnorderedMap> txsWithRoKey; - UnorderedMap> txsWithRwKey; + struct FpEntry + { + size_t keyHash; + uint32_t txId; + bool isRW; + }; + + // Count total footprint entries for a single allocation. + size_t totalFpEntries = 0; + for (auto const& txFrame : txFrames) + { + auto const& fp = txFrame->sorobanResources().footprint; + totalFpEntries += fp.readOnly.size() + fp.readWrite.size(); + } + + std::vector fpEntries; + fpEntries.reserve(totalFpEntries); + std::hash keyHasher; for (size_t i = 0; i < txFrames.size(); ++i) { - auto const& txFrame = txFrames[i]; - auto const& footprint = txFrame->sorobanResources().footprint; + auto const& footprint = txFrames[i]->sorobanResources().footprint; for (auto const& key : footprint.readOnly) { - txsWithRoKey[key].push_back(i); + fpEntries.push_back( + {keyHasher(key), static_cast(i), false}); } for (auto const& key : footprint.readWrite) { - txsWithRwKey[key].push_back(i); + fpEntries.push_back( + {keyHasher(key), static_cast(i), true}); } } - for (auto const& [key, rwTxIds] : txsWithRwKey) + // Sort by hash for cache-friendly grouping. + std::sort(fpEntries.begin(), fpEntries.end(), + [](FpEntry const& a, FpEntry const& b) { + return a.keyHash < b.keyHash; + }); + + // Scan sorted entries for groups sharing the same hash, then mark + // conflicts between transactions that share RW keys (RW-RW and RO-RW). + // Conservatively treat hash collisions as potential conflicts - collisions + // should generally be rare and allocating collisions to the same thread + // is guaranteed to be safe (while disambiguating the conflicts would be + // expensive and complex). Collision probability is really low (K^2/2^64). + for (size_t groupStart = 0; groupStart < fpEntries.size();) { + size_t groupEnd = groupStart + 1; + while (groupEnd < fpEntries.size() && + fpEntries[groupEnd].keyHash == fpEntries[groupStart].keyHash) + { + ++groupEnd; + } + + // Skip singleton groups — no possible conflicts. + if (groupEnd - groupStart < 2) + { + groupStart = groupEnd; + continue; + } + + // Collect all entries with the matching key hash. + std::vector roTxs; + std::vector rwTxs; + for (size_t i = groupStart; i < groupEnd; ++i) + { + if (fpEntries[i].isRW) + { + rwTxs.push_back(fpEntries[i].txId); + } + else + { + roTxs.push_back(fpEntries[i].txId); + } + } // RW-RW conflicts - for (size_t i = 0; i < rwTxIds.size(); ++i) + for (size_t i = 0; i < rwTxs.size(); ++i) { - for (size_t j = i + 1; j < rwTxIds.size(); ++j) + for (size_t j = i + 1; j < rwTxs.size(); ++j) { - builderTxs[rwTxIds[i]]->mConflictTxs.set(rwTxIds[j]); - builderTxs[rwTxIds[j]]->mConflictTxs.set(rwTxIds[i]); + // In a rare case of hash collision within a transaction, we + // might have the same transaction appear several times in the + // same group. + if (rwTxs[i] == rwTxs[j]) + { + continue; + } + builderTxs[rwTxs[i]].mConflictTxs.set(rwTxs[j]); + builderTxs[rwTxs[j]].mConflictTxs.set(rwTxs[i]); } } // RO-RW conflicts - auto roIt = txsWithRoKey.find(key); - if (roIt != txsWithRoKey.end()) + for (size_t i = 0; i < roTxs.size(); ++i) { - auto const& roTxIds = roIt->second; - for (size_t i = 0; i < roTxIds.size(); ++i) + for (size_t j = 0; j < rwTxs.size(); ++j) { - for (size_t j = 0; j < rwTxIds.size(); ++j) + // In a rare case of hash collision within a transaction, we + // might have the same transaction appear several times in the + // same group. + if (roTxs[i] == rwTxs[j]) { - builderTxs[roTxIds[i]]->mConflictTxs.set(rwTxIds[j]); - builderTxs[rwTxIds[j]]->mConflictTxs.set(roTxIds[i]); + continue; } + builderTxs[roTxs[i]].mConflictTxs.set(rwTxs[j]); + builderTxs[rwTxs[j]].mConflictTxs.set(roTxs[i]); } } + + groupStart = groupEnd; } + return builderTxs; +} + +} // namespace - // Process the transactions in the surge pricing (decreasing fee) order. - // This also automatically ensures that the resource limits are respected - // for all the dimensions besides instructions. - SurgePricingPriorityQueue queue( - /* isHighestPriority */ true, laneConfig, +TxStageFrameList +buildSurgePricedParallelSorobanPhase( + TxFrameList const& txFrames, Config const& cfg, + SorobanNetworkConfig const& sorobanCfg, + std::shared_ptr laneConfig, + std::vector& hadTxNotFittingLane, uint32_t ledgerVersion) +{ + ZoneScoped; + // We prefer the transaction sets that are well utilized, but we also want + // to lower the stage count when possible. Thus we will nominate a tx set + // that has the lowest amount of stages while still being within + // MAX_INCLUSION_FEE_TOLERANCE_FOR_STAGE_COUNT from the maximum total + // inclusion fee (a proxy for the transaction set utilization). + double const MAX_INCLUSION_FEE_TOLERANCE_FOR_STAGE_COUNT = 0.999; + + // Simplify the transactions to the minimum necessary amount of data. + auto builderTxs = prepareBuilderTxs(txFrames); + + // Sort transactions in decreasing inclusion fee order. + TxFeeComparator txComparator( + /* isGreater */ true, stellar::rand_uniform(0, std::numeric_limits::max())); + std::vector sortedTxOrder(txFrames.size()); + std::iota(sortedTxOrder.begin(), sortedTxOrder.end(), 0); + std::sort(sortedTxOrder.begin(), sortedTxOrder.end(), + [&txFrames, &txComparator](size_t a, size_t b) { + return txComparator(txFrames[a], txFrames[b]); + }); + + // Precompute per-transaction resources to avoid repeated virtual calls + // and heap allocations across threads. + std::vector txResources; + txResources.reserve(txFrames.size()); for (auto const& tx : txFrames) { - queue.add(tx, ledgerVersion); + txResources.push_back( + tx->getResources(/* useByteLimitInClassic */ false, ledgerVersion)); } - // Create a worker thread for each stage count. + // Get the lane limit. Soroban uses a single generic lane. + auto const& laneLimits = laneConfig->getLaneLimits(); + releaseAssert(laneLimits.size() == 1); + auto const& laneLimit = laneLimits[0]; + + // Create a worker thread for each stage count. The sorted order and + // precomputed resources are shared across all threads (read-only). std::vector threads; uint32_t stageCountOptions = cfg.SOROBAN_PHASE_MAX_STAGE_COUNT - cfg.SOROBAN_PHASE_MIN_STAGE_COUNT + 1; @@ -590,13 +755,13 @@ buildSurgePricedParallelSorobanPhase( stageCount <= cfg.SOROBAN_PHASE_MAX_STAGE_COUNT; ++stageCount) { size_t resultIndex = stageCount - cfg.SOROBAN_PHASE_MIN_STAGE_COUNT; - threads.emplace_back([queue, &builderTxForTx, txFrames, stageCount, - sorobanCfg, laneConfig, resultIndex, &results, - ledgerVersion]() { + threads.emplace_back([&sortedTxOrder, &txResources, &laneLimit, + &builderTxs, &txFrames, stageCount, &sorobanCfg, + resultIndex, &results]() { results.at(resultIndex) = buildSurgePricedParallelSorobanPhaseWithStageCount( - std::move(queue), builderTxForTx, txFrames, stageCount, - sorobanCfg, laneConfig, ledgerVersion); + sortedTxOrder, txResources, laneLimit, builderTxs, txFrames, + stageCount, sorobanCfg); }); } for (auto& thread : threads) diff --git a/src/herder/PendingEnvelopes.cpp b/src/herder/PendingEnvelopes.cpp index c2d5fb21ed..385ffaa22d 100644 --- a/src/herder/PendingEnvelopes.cpp +++ b/src/herder/PendingEnvelopes.cpp @@ -674,34 +674,60 @@ PendingEnvelopes::readySlots() } void -PendingEnvelopes::eraseBelow(uint64 slotIndex, uint64 slotToKeep) +PendingEnvelopes::eraseOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep) { - stopAllBelow(slotIndex, slotToKeep); + stopAllOutsideRange(minSlot, maxSlot, slotToKeep); - // report only for the highest slot that we're purging - reportCostOutliersForSlot(slotIndex - 1, true); + // Erases the envelope pointed to by `iter` if it is not for `slotToKeep`. + // Always advances the iterator. + auto const maybeEraseEnvelope = [&](auto& iter) { + if (iter->first == slotToKeep) + { + ++iter; + } + else + { + iter = mEnvelopes.erase(iter); + } + }; - for (auto iter = mEnvelopes.begin(); iter != mEnvelopes.end();) + if (minSlot) { - if (iter->first < slotIndex) + if (*minSlot > 0) { - if (iter->first == slotToKeep) + // report only for the highest non-future slot that we're purging + reportCostOutliersForSlot(*minSlot - 1, true); + } + + for (auto iter = mEnvelopes.begin(); iter != mEnvelopes.end();) + { + if (iter->first < *minSlot) { - ++iter; + maybeEraseEnvelope(iter); } else - { - iter = mEnvelopes.erase(iter); - } + break; + } + } + + if (maxSlot) + { + auto iter = mEnvelopes.upper_bound(*maxSlot); + while (iter != mEnvelopes.end()) + { + maybeEraseEnvelope(iter); } - else - break; } // 0 is special mark for data that we do not know the slot index // it is used for state loaded from database mTxSetCache.erase_if([&](TxSetFramCacheItem const& i) { - return i.first != 0 && i.first < slotIndex && i.first != slotToKeep; + if (i.first == 0 || i.first == slotToKeep) + return false; + return (minSlot && i.first < *minSlot) || + (maxSlot && i.first > *maxSlot); }); cleanKnownData(); @@ -709,26 +735,45 @@ PendingEnvelopes::eraseBelow(uint64 slotIndex, uint64 slotToKeep) } void -PendingEnvelopes::stopAllBelow(uint64 slotIndex, uint64 slotToKeep) +PendingEnvelopes::stopAllOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep) { // Before we purge a slot, check if any envelopes are still in // "fetching" mode and attempt to record cost - for (auto it = mEnvelopes.begin(); - it != mEnvelopes.end() && it->first < slotIndex; it++) - { + auto const maybeRecordCost = [&](auto const& it) { if (it->first == slotToKeep) { - continue; + return; } - auto& envs = it->second; + auto const& envs = it->second; for (auto const& env : envs.mFetchingEnvelopes) { recordReceivedCost(env.first); } + }; + + if (minSlot) + { + for (auto it = mEnvelopes.begin(); + it != mEnvelopes.end() && it->first < *minSlot; it++) + { + maybeRecordCost(it); + } } - mTxSetFetcher.stopFetchingBelow(slotIndex, slotToKeep); - mQuorumSetFetcher.stopFetchingBelow(slotIndex, slotToKeep); + + if (maxSlot) + { + for (auto it = mEnvelopes.upper_bound(*maxSlot); it != mEnvelopes.end(); + it++) + { + maybeRecordCost(it); + } + } + + mTxSetFetcher.stopFetchingOutsideRange(minSlot, maxSlot, slotToKeep); + mQuorumSetFetcher.stopFetchingOutsideRange(minSlot, maxSlot, slotToKeep); } void diff --git a/src/herder/PendingEnvelopes.h b/src/herder/PendingEnvelopes.h index 1bbbb93d68..d6de92dd7a 100644 --- a/src/herder/PendingEnvelopes.h +++ b/src/herder/PendingEnvelopes.h @@ -121,9 +121,12 @@ class PendingEnvelopes UnorderedMap getCostPerValidator(uint64 slotIndex) const; - // stops all pending downloads for slots strictly below `slotIndex` - // counts partially downloaded data towards the cost for that slot - void stopAllBelow(uint64 slotIndex, uint64 slotToKeep); + // stops all pending downloads for slots outside the range + // [minSlot, maxSlot]. Either bound may be nullopt to skip + // that direction. Counts partially downloaded data towards + // the cost for those slots. + void stopAllOutsideRange(std::optional minSlot, + std::optional maxSlot, uint64 slotToKeep); public: PendingEnvelopes(Application& app, HerderImpl& herder); @@ -188,9 +191,11 @@ class PendingEnvelopes SCPEnvelopeWrapperPtr pop(uint64 slotIndex); - // erases data for all slots strictly below `slotIndex` except - // slotToKeep. - void eraseBelow(uint64 slotIndex, uint64 slotToKeep); + // erases data for all slots outside the range [minSlot, maxSlot]. + // Either bound may be nullopt to skip that direction. + // The slotToKeep slot is never erased. + void eraseOutsideRange(std::optional minSlot, + std::optional maxSlot, uint64 slotToKeep); void forceRebuildQuorum(); diff --git a/src/herder/SurgePricingUtils.cpp b/src/herder/SurgePricingUtils.cpp index 40514992dd..fe9d0c17b8 100644 --- a/src/herder/SurgePricingUtils.cpp +++ b/src/herder/SurgePricingUtils.cpp @@ -70,8 +70,7 @@ computeBetterFee(TransactionFrameBase const& tx, int64_t refFeeBid, return minFee; } -SurgePricingPriorityQueue::TxComparator::TxComparator(bool isGreater, - size_t _seed) +TxFeeComparator::TxFeeComparator(bool isGreater, size_t _seed) : mIsGreater(isGreater) #ifndef BUILD_TESTS , mSeed(_seed) @@ -80,47 +79,43 @@ SurgePricingPriorityQueue::TxComparator::TxComparator(bool isGreater, } bool -SurgePricingPriorityQueue::TxComparator::operator()( - TransactionFrameBasePtr const& tx1, - TransactionFrameBasePtr const& tx2) const +TxFeeComparator::operator()(TransactionFrameBasePtr const& tx1, + TransactionFrameBasePtr const& tx2) const { - return txLessThan(tx1, tx2) ^ mIsGreater; + return txLessThan(tx1, tx2); } bool -SurgePricingPriorityQueue::TxComparator::compareFeeOnly( - TransactionFrameBase const& tx1, TransactionFrameBase const& tx2) const +TxFeeComparator::compareFeeOnly(TransactionFrameBase const& tx1, + TransactionFrameBase const& tx2) const { return compareFeeOnly(tx1.getInclusionFee(), tx1.getNumOperations(), tx2.getInclusionFee(), tx2.getNumOperations()); } bool -SurgePricingPriorityQueue::TxComparator::compareFeeOnly(int64_t tx1Bid, - uint32_t tx1Ops, - int64_t tx2Bid, - uint32_t tx2Ops) const +TxFeeComparator::compareFeeOnly(int64_t tx1Bid, uint32_t tx1Ops, int64_t tx2Bid, + uint32_t tx2Ops) const { bool isLess = feeRate3WayCompare(tx1Bid, tx1Ops, tx2Bid, tx2Ops) < 0; return isLess ^ mIsGreater; } bool -SurgePricingPriorityQueue::TxComparator::isGreater() const +TxFeeComparator::isGreater() const { return mIsGreater; } bool -SurgePricingPriorityQueue::TxComparator::txLessThan( - TransactionFrameBasePtr const& tx1, - TransactionFrameBasePtr const& tx2) const +TxFeeComparator::txLessThan(TransactionFrameBasePtr const& tx1, + TransactionFrameBasePtr const& tx2) const { auto cmp3 = feeRate3WayCompare(*tx1, *tx2); if (cmp3 != 0) { - return cmp3 < 0; + return mIsGreater ? cmp3 > 0 : cmp3 < 0; } #ifndef BUILD_TESTS // break tie with pointer arithmetic @@ -132,7 +127,7 @@ SurgePricingPriorityQueue::TxComparator::txLessThan( auto lx = tx1->getFullHash(); auto rx = tx2->getFullHash(); #endif - return lx < rx; + return mIsGreater ? rx < lx : lx < rx; } SurgePricingPriorityQueue::SurgePricingPriorityQueue( diff --git a/src/herder/SurgePricingUtils.h b/src/herder/SurgePricingUtils.h index 19927bc857..0c353dbf07 100644 --- a/src/herder/SurgePricingUtils.h +++ b/src/herder/SurgePricingUtils.h @@ -21,6 +21,36 @@ int feeRate3WayCompare(int64_t lFeeBid, uint32_t lNbOps, int64_t rFeeBid, int64_t computeBetterFee(TransactionFrameBase const& tx, int64_t refFeeBid, uint32_t refNbOps); +// Transaction comparator for transaction prioritization and surge pricing +// based on transaction inclusion fees. +// operator() is suitable for sorting the transactions while shuffling +// transactions with the same fee rate in random order. +// compareFeeOnly can be used to just determine whether one transaction has a +// strictly higher fee rate than the other. +class TxFeeComparator +{ + public: + TxFeeComparator(bool isGreater, size_t seed); + + bool operator()(TransactionFrameBasePtr const& tx1, + TransactionFrameBasePtr const& tx2) const; + + bool compareFeeOnly(TransactionFrameBase const& tx1, + TransactionFrameBase const& tx2) const; + bool compareFeeOnly(int64_t tx1Bid, uint32_t tx1Ops, int64_t tx2Bid, + uint32_t tx2Ops) const; + bool isGreater() const; + + private: + bool txLessThan(TransactionFrameBasePtr const& tx1, + TransactionFrameBasePtr const& tx2) const; + + bool const mIsGreater; +#ifndef BUILD_TESTS + size_t mSeed; +#endif +}; + // Configuration for multi-lane transaction limiting and surge pricing. // // This configuration defines how many 'lanes' are there to compare and limit @@ -225,31 +255,7 @@ class SurgePricingPriorityQueue std::nullopt); private: - class TxComparator - { - public: - TxComparator(bool isGreater, size_t seed); - - bool operator()(TransactionFrameBasePtr const& tx1, - TransactionFrameBasePtr const& tx2) const; - - bool compareFeeOnly(TransactionFrameBase const& tx1, - TransactionFrameBase const& tx2) const; - bool compareFeeOnly(int64_t tx1Bid, uint32_t tx1Ops, int64_t tx2Bid, - uint32_t tx2Ops) const; - bool isGreater() const; - - private: - bool txLessThan(TransactionFrameBasePtr const& tx1, - TransactionFrameBasePtr const& tx2) const; - - bool const mIsGreater; -#ifndef BUILD_TESTS - size_t mSeed; -#endif - }; - - using TxSortedSet = std::set; + using TxSortedSet = std::set; using LaneIter = std::pair; // Iterator for walking the queue from top to bottom, possibly restricted @@ -285,7 +291,7 @@ class SurgePricingPriorityQueue Iterator getTop() const; - TxComparator const mComparator; + TxFeeComparator const mComparator; std::shared_ptr mLaneConfig; std::vector const& mLaneLimits; diff --git a/src/herder/TransactionQueue.cpp b/src/herder/TransactionQueue.cpp index bbb3567c24..b8c904770f 100644 --- a/src/herder/TransactionQueue.cpp +++ b/src/herder/TransactionQueue.cpp @@ -4,6 +4,7 @@ #include "herder/TransactionQueue.h" #include "crypto/Hex.h" +#include "crypto/KeyUtils.h" #include "crypto/SecretKey.h" #include "herder/SurgePricingUtils.h" #include "herder/TxQueueLimiter.h" @@ -107,10 +108,22 @@ TransactionQueue::TransactionQueue(Application& app, uint32 pendingDepth, auto const& filteredTypes = app.getConfig().EXCLUDE_TRANSACTIONS_CONTAINING_OPERATION_TYPE; mFilteredTypes.insert(filteredTypes.begin(), filteredTypes.end()); + + for (auto const& addr : app.getConfig().FILTERED_G_ADDRESSES) + { + mFilteredAccounts.emplace(KeyUtils::fromStrKey(addr)); + } + mBroadcastSeed = rand_uniform(0, std::numeric_limits::max()); } +void +TransactionQueue::setFilteredAccounts(std::set const& accounts) +{ + mFilteredAccounts = accounts; +} + ClassicTransactionQueue::ClassicTransactionQueue(Application& app, uint32 pendingDepth, uint32 banDepth, @@ -140,7 +153,9 @@ ClassicTransactionQueue::ClassicTransactionQueue(Application& app, app.getMetrics().NewCounter( {"herder", "pending-txs", "not-included-due-to-low-fee-count"}), app.getMetrics().NewCounter( - {"herder", "pending-txs", "filtered-due-to-fp-keys"})); + {"herder", "pending-txs", "filtered-due-to-fp-keys"}), + app.getMetrics().NewCounter( + {"herder", "pending-txs", "filtered-due-to-account-keys"})); mBroadcastOpCarryover.resize(1, Resource::makeEmpty(NUM_CLASSIC_TX_RESOURCES)); } @@ -300,7 +315,8 @@ TransactionQueue::sourceAccountPending(AccountID const& accountID) const TransactionQueue::AddResult TransactionQueue::canAdd( TransactionFrameBasePtr tx, AccountStates::iterator& stateIter, - std::vector>& txsToEvict + std::vector>& txsToEvict, + bool force #ifdef BUILD_TESTS , bool isLoadgenTx @@ -327,6 +343,11 @@ TransactionQueue::canAdd( mQueueMetrics->mTxsFilteredDueToFootprintKeys.inc(); return AddResult(TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); } + if (!force && !tx->validateAccountFilterForFlooding(mFilteredAccounts)) + { + mQueueMetrics->mTxsFilteredDueToAccountKeys.inc(); + return AddResult(TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } int64_t newFullFee = tx->getFullFee(); if (newFullFee < 0 || tx->getInclusionFee() < 0) @@ -418,7 +439,7 @@ TransactionQueue::canAdd( } } - LedgerSnapshot ls(mApp); + LedgerReadView lrv(mApp); // Subtle: transactions are rejected based on the source account limit // prior to this point. This is safe because we can't evict transactions // from the same source account, so a newer transaction won't replace an @@ -443,11 +464,12 @@ TransactionQueue::canAdd( auto closeTime = mApp.getLedgerManager() .getLastClosedLedgerHeader() .header.scpValue.closeTime; + // Validate minSeqLedgerGap and LedgerBounds against the next ledgerSeq, + // which is what will be used at apply time. + std::optional validationLedgerSeq; if (protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_19)) { - // This is done so minSeqLedgerGap is validated against the next - // ledgerSeq, which is what will be used at apply time - ls.getLedgerHeader().currentToModify().ledgerSeq = + validationLedgerSeq = mApp.getLedgerManager().getLastClosedLedgerNum() + 1; } @@ -457,9 +479,10 @@ TransactionQueue::canAdd( if (!isLoadgenTx) #endif { - auto validationResult = tx->checkValid( - mApp.getAppConnector(), ls, 0, 0, - getUpperBoundCloseTimeOffset(mApp, closeTime), diagnosticEvents); + auto validationResult = + tx->checkValid(mApp.getAppConnector(), lrv, 0, 0, + getUpperBoundCloseTimeOffset(mApp, closeTime), + diagnosticEvents, validationLedgerSeq); if (!validationResult->isSuccess()) { return AddResult(TransactionQueue::AddResultCode::ADD_STATUS_ERROR, @@ -476,12 +499,12 @@ TransactionQueue::canAdd( if (!isLoadgenTx && !mApp.getRunInOverlayOnlyMode()) #endif { - auto const feeSource = ls.getAccount(tx->getFeeSourceID()); + auto const feeSource = lrv.getAccount(tx->getFeeSourceID()); auto feeStateIter = mAccountStates.find(tx->getFeeSourceID()); int64_t totalFees = feeStateIter == mAccountStates.end() ? 0 : feeStateIter->second.mTotalFees; - if (getAvailableBalance(ls.getLedgerHeader().current(), + if (getAvailableBalance(lrv.getLedgerHeader().current(), feeSource.current()) - newFullFee < totalFees) @@ -649,7 +672,8 @@ TransactionQueue::findAllAssetPairsInvolvedInPaymentLoops( } TransactionQueue::AddResult -TransactionQueue::tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf +TransactionQueue::tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf, + bool force #ifdef BUILD_TESTS , bool isLoadgenTx @@ -667,7 +691,7 @@ TransactionQueue::tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf AccountStates::iterator stateIter; std::vector> txsToEvict; - auto res = canAdd(tx, stateIter, txsToEvict + auto res = canAdd(tx, stateIter, txsToEvict, force #ifdef BUILD_TESTS , isLoadgenTx @@ -1097,7 +1121,9 @@ SorobanTransactionQueue::SorobanTransactionQueue( app.getMetrics().NewCounter({"herder", "pending-soroban-txs", "not-included-due-to-low-fee-count"}), app.getMetrics().NewCounter( - {"herder", "pending-soroban-txs", "filtered-due-to-fp-keys"})); + {"herder", "pending-soroban-txs", "filtered-due-to-fp-keys"}), + app.getMetrics().NewCounter( + {"herder", "pending-soroban-txs", "filtered-due-to-account-keys"})); mBroadcastOpCarryover.resize(1, Resource::makeEmptySoroban()); mKeysToFilter = keysToFilter; } diff --git a/src/herder/TransactionQueue.h b/src/herder/TransactionQueue.h index dfa8a66a7d..ef3a3247a3 100644 --- a/src/herder/TransactionQueue.h +++ b/src/herder/TransactionQueue.h @@ -138,9 +138,10 @@ class TransactionQueue #ifdef BUILD_TESTS AddResult tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf, - bool isLoadgenTx = false); + bool force = false, bool isLoadgenTx = false); #else - AddResult tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf); + AddResult tryAdd(TransactionFrameBasePtr tx, bool submittedFromSelf, + bool force = false); #endif void removeApplied(Transactions const& txs); // Ban transactions that are no longer valid or have insufficient fee; @@ -162,6 +163,8 @@ class TransactionQueue TxFrameList getTransactions(LedgerHeader const& lcl) const; bool sourceAccountPending(AccountID const& accountID) const; + void setFilteredAccounts(std::set const& accounts); + virtual size_t getMaxQueueSizeOps() const = 0; #ifdef BUILD_TESTS @@ -192,6 +195,7 @@ class TransactionQueue AccountStates mAccountStates; BannedTransactions mBannedTransactions; UnorderedSet mKeysToFilter; + std::set mFilteredAccounts; // counters struct QueueMetrics @@ -203,7 +207,8 @@ class TransactionQueue medida::Counter& txsEvictedByHigherFeeTxCounter, medida::Counter& txsEvictedDueToAgeCounter, medida::Counter& txsNotAcceptedDueToLowFeeCounter, - medida::Counter& txsFilteredDueToFpKeys) + medida::Counter& txsFilteredDueToFpKeys, + medida::Counter& txsFilteredDueToAccountKeys) : mSizeByAge(std::move(sizeByAge)) , mBannedTransactionsCounter(bannedTransactionsCounter) , mTransactionsDelay(transactionsDelay) @@ -213,6 +218,7 @@ class TransactionQueue , mTxsNotAcceptedDueToLowFeeCounter( txsNotAcceptedDueToLowFeeCounter) , mTxsFilteredDueToFootprintKeys(txsFilteredDueToFpKeys) + , mTxsFilteredDueToAccountKeys(txsFilteredDueToAccountKeys) { } std::vector mSizeByAge; @@ -238,6 +244,7 @@ class TransactionQueue medida::Counter& mTxsNotAcceptedDueToLowFeeCounter; medida::Counter& mTxsFilteredDueToFootprintKeys; + medida::Counter& mTxsFilteredDueToAccountKeys; }; std::unique_ptr mQueueMetrics; @@ -268,11 +275,12 @@ class TransactionQueue TransactionQueue::AddResult canAdd(TransactionFrameBasePtr tx, AccountStates::iterator& stateIter, std::vector>& txsToEvict, - bool isLoadgenTx = false); + bool force = false, bool isLoadgenTx = false); #else TransactionQueue::AddResult canAdd(TransactionFrameBasePtr tx, AccountStates::iterator& stateIter, - std::vector>& txsToEvict); + std::vector>& txsToEvict, + bool force = false); #endif void releaseFeeMaybeEraseAccountState(TransactionFrameBasePtr tx); diff --git a/src/herder/TxSetFrame.cpp b/src/herder/TxSetFrame.cpp index 602f0cf181..0eb6c4e3c6 100644 --- a/src/herder/TxSetFrame.cpp +++ b/src/herder/TxSetFrame.cpp @@ -217,7 +217,7 @@ computePerOpFee(TransactionFrameBase const& tx, uint32_t ledgerVersion) protocolVersionStartsFrom(ledgerVersion, SOROBAN_PROTOCOL_VERSION) ? Rounding::ROUND_DOWN : Rounding::ROUND_UP; - auto txOps = tx.getNumOperations(); + auto txOps = std::max(tx.getNumOperations(), 1u); return bigDivideOrThrow(tx.getInclusionFee(), 1, static_cast(txOps), rounding); } @@ -833,6 +833,7 @@ makeTxSetFromTransactions( static_cast(TxSetPhase::PHASE_COUNT)); std::vector validatedPhases; + UnorderedMap accountFeeMap; for (size_t i = 0; i < txPhases.size(); ++i) { auto const& phaseTxs = txPhases[i]; @@ -856,7 +857,7 @@ makeTxSetFromTransactions( { #endif validatedTxs = TxSetUtils::trimInvalid( - phaseTxs, app, lowerBoundCloseTimeOffset, + phaseTxs, app, accountFeeMap, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, invalid); #ifdef BUILD_TESTS } @@ -940,15 +941,20 @@ makeTxSetFromTransactions( static_cast(i)); } } - + if (!valid) + { + throw std::runtime_error("Created invalid tx set frame - shape is " + "mismatched after roundtrip."); + } // We already trimmed invalid transactions in an earlier call to // `trimInvalid`, so skip transaction validation here - valid = valid && outputApplicableTxSet->checkValidInternal( - app, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, true); - if (!valid) + auto validationResult = outputApplicableTxSet->checkValidInternalWithResult( + app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, true); + if (validationResult != TxSetValidationResult::VALID) { - throw std::runtime_error("Created invalid tx set frame"); + throw std::runtime_error(fmt::format( + FMT_STRING("Created invalid tx set frame, validation result: {:s}"), + toString(validationResult))); } return std::make_pair(outputTxSet, std::move(outputApplicableTxSet)); @@ -1439,6 +1445,13 @@ TxSetPhaseFrame::makeFromWire(TxSetPhase phase, Hash const& networkID, if (component.txsMaybeDiscountedFee().baseFee) { baseFee = *component.txsMaybeDiscountedFee().baseFee; + if (*baseFee < 0) + { + CLOG_DEBUG(Herder, + "Got bad generalized txSet: component " + "has negative base fee"); + return std::nullopt; + } } size_t prevSize = txList.size(); if (!addWireTxsToList(networkID, @@ -1470,6 +1483,12 @@ TxSetPhaseFrame::makeFromWire(TxSetPhase phase, Hash const& networkID, if (xdrPhase.parallelTxsComponent().baseFee) { baseFee = *xdrPhase.parallelTxsComponent().baseFee; + if (*baseFee < 0) + { + CLOG_DEBUG(Herder, "Got bad generalized txSet: component " + "has negative base fee"); + return std::nullopt; + } } TxStageFrameList stages; stages.reserve(xdrStages.size()); @@ -1714,16 +1733,17 @@ TxSetPhaseFrame::checkValid(Application& app, uint64_t upperBoundCloseTimeOffset, bool txsAreValidated) const { + UnorderedMap accountFeeMap; return checkValidWithResult(app, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, txsAreValidated) == - TxSetValidationResult::VALID; + upperBoundCloseTimeOffset, txsAreValidated, + accountFeeMap) == TxSetValidationResult::VALID; } TxSetValidationResult -TxSetPhaseFrame::checkValidWithResult(Application& app, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - bool txsAreValidated) const +TxSetPhaseFrame::checkValidWithResult( + Application& app, uint64_t lowerBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, bool txsAreValidated, + UnorderedMap& accountFeeMap) const { auto const& lcl = app.getLedgerManager().getLastClosedLedgerHeader(); // Verify the fee map for the phase. This check is independent of the phase @@ -1769,7 +1789,8 @@ TxSetPhaseFrame::checkValidWithResult(Application& app, } auto invalid = TxSetUtils::getInvalidTxListWithErrors( - *this, app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset); + *this, app, accountFeeMap, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset); if (invalid.first.empty()) { releaseAssert(invalid.second == TxSetValidationResult::VALID); @@ -2144,11 +2165,18 @@ ApplicableTxSetFrame::checkValidInternalWithResult( } } + bool useCrossPhaseFeeMap = protocolVersionStartsFrom( + lcl.header.ledgerVersion, ProtocolVersion::V_26); + UnorderedMap accountFeeMap; for (auto const& phase : mPhases) { - auto result = phase.checkValidWithResult(app, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, - txsAreValidated); + if (!useCrossPhaseFeeMap) + { + accountFeeMap.clear(); + } + auto result = phase.checkValidWithResult( + app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, + txsAreValidated, accountFeeMap); if (result != TxSetValidationResult::VALID) { return result; diff --git a/src/herder/TxSetFrame.h b/src/herder/TxSetFrame.h index 4b537d0558..de9908645e 100644 --- a/src/herder/TxSetFrame.h +++ b/src/herder/TxSetFrame.h @@ -10,6 +10,7 @@ #include "transactions/TransactionFrame.h" #include "util/NonCopyable.h" #include "util/ProtocolVersion.h" +#include "util/UnorderedMap.h" #include "xdr/Stellar-internal.h" #include @@ -411,7 +412,8 @@ class TxSetPhaseFrame TxSetValidationResult checkValidWithResult(Application& app, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, - bool txsAreValidated = false) const; + bool txsAreValidated, + UnorderedMap& accountFeeMap) const; TxSetValidationResult checkValidClassic(LedgerHeader const& lclHeader) const; TxSetValidationResult diff --git a/src/herder/TxSetUtils.cpp b/src/herder/TxSetUtils.cpp index 30541d9977..df132c4aad 100644 --- a/src/herder/TxSetUtils.cpp +++ b/src/herder/TxSetUtils.cpp @@ -164,19 +164,24 @@ TxSetUtils::buildAccountTxQueues(TxFrameList const& txs) template TxFrameListWithErrors -TxSetUtils::getInvalidTxListWithErrors(T const& txs, Application& app, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset) +TxSetUtils::getInvalidTxListWithErrors( + T const& txs, Application& app, + UnorderedMap& accountFeeMap, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset) { ZoneScoped; releaseAssert(threadIsMain()); - LedgerSnapshot ls(app); - // This is done so minSeqLedgerGap is validated against the next - // ledgerSeq, which is what will be used at apply time - ls.getLedgerHeader().currentToModify().ledgerSeq = - app.getLedgerManager().getLastClosedLedgerNum() + 1; + LedgerReadView lrv(app); + // Validate minSeqLedgerGap and LedgerBounds against the next ledgerSeq, + // which is what will be used at apply time. + std::optional validationLedgerSeq; + if (protocolVersionStartsFrom(lrv.getLedgerHeader().current().ledgerVersion, + ProtocolVersion::V_19)) + { + validationLedgerSeq = + app.getLedgerManager().getLastClosedLedgerNum() + 1; + } - UnorderedMap accountFeeMap; TxFrameListWithErrors invalidTxsWithError; auto& invalidTxs = invalidTxsWithError.first; auto& errorCode = invalidTxsWithError.second; @@ -186,9 +191,9 @@ TxSetUtils::getInvalidTxListWithErrors(T const& txs, Application& app, auto diagnostics = DiagnosticEventManager::createDisabled(); for (auto const& tx : txs) { - auto txResult = tx->checkValid(app.getAppConnector(), ls, 0, - lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, diagnostics); + auto txResult = tx->checkValid( + app.getAppConnector(), lrv, 0, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset, diagnostics, validationLedgerSeq); if (!txResult->isSuccess()) { invalidTxs.emplace_back(tx); @@ -209,7 +214,7 @@ TxSetUtils::getInvalidTxListWithErrors(T const& txs, Application& app, } } - auto header = ls.getLedgerHeader().current(); + auto header = lrv.getLedgerHeader().current(); for (auto const& tx : txs) { // Already added invalid tx @@ -219,7 +224,7 @@ TxSetUtils::getInvalidTxListWithErrors(T const& txs, Application& app, } auto feeSourceID = tx->getFeeSourceID(); - auto feeSource = ls.getAccount(feeSourceID); + auto feeSource = lrv.getAccount(feeSourceID); // feeSource should exist since we've already run checkValid, log // internal bug if (!feeSource) @@ -253,19 +258,23 @@ TxSetUtils::getInvalidTxListWithErrors(T const& txs, Application& app, template TxFrameListWithErrors TxSetUtils::getInvalidTxListWithErrors( TxFrameList const& txs, Application& app, + UnorderedMap& accountFeeMap, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset); template TxFrameListWithErrors TxSetUtils::getInvalidTxListWithErrors( TxSetPhaseFrame const& txs, Application& app, + UnorderedMap& accountFeeMap, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset); TxFrameList TxSetUtils::trimInvalid(TxFrameList const& txs, Application& app, + UnorderedMap& accountFeeMap, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs) { - invalidTxs = getInvalidTxListWithErrors(txs, app, lowerBoundCloseTimeOffset, + invalidTxs = getInvalidTxListWithErrors(txs, app, accountFeeMap, + lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset) .first; return removeTxs(txs, invalidTxs); diff --git a/src/herder/TxSetUtils.h b/src/herder/TxSetUtils.h index b4af8f436e..d744dc9476 100644 --- a/src/herder/TxSetUtils.h +++ b/src/herder/TxSetUtils.h @@ -50,12 +50,14 @@ class TxSetUtils template static TxFrameListWithErrors getInvalidTxListWithErrors(TxContainer const& txs, Application& app, + UnorderedMap& accountFeeMap, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset); - static TxFrameList trimInvalid(TxFrameList const& txs, Application& app, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - TxFrameList& invalidTxs); + static TxFrameList + trimInvalid(TxFrameList const& txs, Application& app, + UnorderedMap& accountFeeMap, + uint64_t lowerBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs); }; // class TxSetUtils } // namespace stellar diff --git a/src/herder/Upgrades.cpp b/src/herder/Upgrades.cpp index 8eb55047b4..daa2cbf367 100644 --- a/src/herder/Upgrades.cpp +++ b/src/herder/Upgrades.cpp @@ -40,11 +40,11 @@ namespace { // The current version of the upgrade parameters serialization. -constexpr const uint32_t UPGRADE_VERSION = 1; +constexpr uint32_t UPGRADE_VERSION = 1; // The version of upgrade parameters serialization that introduced the // nominationtimeoutlimit and expirationminutes fields. -constexpr const uint32_t UPGRADE_VERSION_WITH_NOMINATION_STRIPPING = 1; +constexpr uint32_t UPGRADE_VERSION_WITH_NOMINATION_STRIPPING = 1; } namespace cereal @@ -174,12 +174,12 @@ namespace stellar namespace { uint32_t -readMaxSorobanTxSetSize(LedgerSnapshot const& ls) +readMaxSorobanTxSetSize(LedgerReadView const& lrv) { LedgerKey key(LedgerEntryType::CONFIG_SETTING); key.configSetting().configSettingID = ConfigSettingID::CONFIG_SETTING_CONTRACT_EXECUTION_LANES; - return ls.load(key) + return lrv.load(key) .current() .data.configSetting() .contractExecutionLanes() @@ -211,7 +211,7 @@ Upgrades::UpgradeParameters::toJson() const } std::string -Upgrades::UpgradeParameters::toDebugJson(LedgerSnapshot const& ls) const +Upgrades::UpgradeParameters::toDebugJson(LedgerReadView const& lrv) const { Json::Value upgradesJson; Json::Reader reader; @@ -226,7 +226,7 @@ Upgrades::UpgradeParameters::toDebugJson(LedgerSnapshot const& ls) const upgradesJson.removeMember("configupgradesetkey"); auto upgradeSetPtr = - ConfigUpgradeSetFrame::makeFromKey(ls, *mConfigUpgradeSetKey); + ConfigUpgradeSetFrame::makeFromKey(lrv, *mConfigUpgradeSetKey); if (upgradeSetPtr) { Json::Value configUpgradeSetJson; @@ -277,7 +277,7 @@ Upgrades::getParameters() const std::vector Upgrades::createUpgradesFor(LedgerHeader const& lclHeader, - LedgerSnapshot const& ls) const + LedgerReadView const& lrv) const { auto result = std::vector{}; if (!timeForUpgrade(lclHeader.scpValue.closeTime)) @@ -316,29 +316,29 @@ Upgrades::createUpgradesFor(LedgerHeader const& lclHeader, result.back().newFlags() = *mParams.mFlags; } } - if (mParams.mMaxSorobanTxSetSize) - { - if (protocolVersionStartsFrom(lclHeader.ledgerVersion, - SOROBAN_PROTOCOL_VERSION) && - readMaxSorobanTxSetSize(ls) != *mParams.mMaxSorobanTxSetSize) - { - result.emplace_back(LEDGER_UPGRADE_MAX_SOROBAN_TX_SET_SIZE); - result.back().newMaxSorobanTxSetSize() = - *mParams.mMaxSorobanTxSetSize; - } - } auto key = mParams.mConfigUpgradeSetKey; if (key) { - auto cfgUpgrade = ConfigUpgradeSetFrame::makeFromKey(ls, *key); + auto cfgUpgrade = ConfigUpgradeSetFrame::makeFromKey(lrv, *key); if (cfgUpgrade != nullptr && cfgUpgrade->isValidForApply() == UpgradeValidity::VALID && - cfgUpgrade->upgradeNeeded(ls)) + cfgUpgrade->upgradeNeeded(lrv)) { result.emplace_back(LEDGER_UPGRADE_CONFIG); result.back().newConfig() = cfgUpgrade->getKey(); } } + if (mParams.mMaxSorobanTxSetSize) + { + if (protocolVersionStartsFrom(lclHeader.ledgerVersion, + SOROBAN_PROTOCOL_VERSION) && + readMaxSorobanTxSetSize(lrv) != *mParams.mMaxSorobanTxSetSize) + { + result.emplace_back(LEDGER_UPGRADE_MAX_SOROBAN_TX_SET_SIZE); + result.back().newMaxSorobanTxSetSize() = + *mParams.mMaxSorobanTxSetSize; + } + } return result; } @@ -365,7 +365,7 @@ Upgrades::applyTo(LedgerUpgrade const& upgrade, Application& app, break; case LEDGER_UPGRADE_CONFIG: { - LedgerSnapshot ltxState(ltx); + LedgerReadView ltxState(ltx); auto cfgUpgrade = ConfigUpgradeSetFrame::makeFromKey(ltxState, upgrade.newConfig()); if (!cfgUpgrade) @@ -564,7 +564,7 @@ Upgrades::removeUpgrades(std::vector::const_iterator beginUpdates, Upgrades::UpgradeValidity Upgrades::isValidForApply(UpgradeType const& opaqueUpgrade, LedgerUpgrade& upgrade, Application& app, - LedgerSnapshot const& ls) + LedgerReadView const& lrv) { try { @@ -576,7 +576,7 @@ Upgrades::isValidForApply(UpgradeType const& opaqueUpgrade, } bool res = true; - auto version = ls.getLedgerHeader().current().ledgerVersion; + auto version = lrv.getLedgerHeader().current().ledgerVersion; switch (upgrade.type()) { case LEDGER_UPGRADE_VERSION: @@ -609,7 +609,7 @@ Upgrades::isValidForApply(UpgradeType const& opaqueUpgrade, return UpgradeValidity::INVALID; } auto cfgUpgrade = - ConfigUpgradeSetFrame::makeFromKey(ls, upgrade.newConfig()); + ConfigUpgradeSetFrame::makeFromKey(lrv, upgrade.newConfig()); if (!cfgUpgrade) { return UpgradeValidity::INVALID; @@ -638,9 +638,9 @@ Upgrades::isValidForApply(UpgradeType const& opaqueUpgrade, bool Upgrades::isValidForNomination(LedgerUpgrade const& upgrade, - LedgerSnapshot const& ls) const + LedgerReadView const& lrv) const { - if (!timeForUpgrade(ls.getLedgerHeader().current().scpValue.closeTime)) + if (!timeForUpgrade(lrv.getLedgerHeader().current().scpValue.closeTime)) { return false; } @@ -668,10 +668,10 @@ Upgrades::isValidForNomination(LedgerUpgrade const& upgrade, } auto cfgUpgrade = - ConfigUpgradeSetFrame::makeFromKey(ls, upgrade.newConfig()); + ConfigUpgradeSetFrame::makeFromKey(lrv, upgrade.newConfig()); return cfgUpgrade && cfgUpgrade->isConsistentWith(ConfigUpgradeSetFrame::makeFromKey( - ls, *mParams.mConfigUpgradeSetKey)); + lrv, *mParams.mConfigUpgradeSetKey)); } case LEDGER_UPGRADE_MAX_SOROBAN_TX_SET_SIZE: return mParams.mMaxSorobanTxSetSize && @@ -687,13 +687,13 @@ Upgrades::isValid(UpgradeType const& upgrade, LedgerUpgradeType& upgradeType, bool nomination, Application& app) const { LedgerUpgrade lupgrade; - auto ls = LedgerSnapshot(app); + auto lrv = LedgerReadView(app); bool res = - isValidForApply(upgrade, lupgrade, app, ls) == UpgradeValidity::VALID; + isValidForApply(upgrade, lupgrade, app, lrv) == UpgradeValidity::VALID; if (nomination) { - res = res && isValidForNomination(lupgrade, ls); + res = res && isValidForNomination(lupgrade, lrv); } if (res) @@ -1246,13 +1246,10 @@ Upgrades::applyVersionUpgrade(Application& app, AbstractLedgerTxn& ltx, PubKeyUtils::enableRustDalekVerify(); SorobanNetworkConfig::createCostTypesForV25(ltx, app); } - // Starting from protocol 23 we need to fully override the Soroban in-memory - // state size on upgrade, as before protocol 23 bucket list size has bene - // used. - if (protocolVersionStartsFrom(newVersion, ProtocolVersion::V_23)) + if (needUpgradeToVersion(ProtocolVersion::V_26, prevVersion, newVersion)) { - app.getLedgerManager().handleUpgradeAffectingSorobanInMemoryStateSize( - ltx); + SorobanNetworkConfig::updateCostTypesForV26(ltx, app); + SorobanNetworkConfig::createLedgerEntriesForV26(ltx, app); } if (protocolVersionEquals(prevVersion, ProtocolVersion::V_23) && @@ -1264,9 +1261,16 @@ Upgrades::applyVersionUpgrade(Application& app, AbstractLedgerTxn& ltx, header.current().feePool += 31879035; } - if (needUpgradeToVersion(ProtocolVersion::V_26, prevVersion, newVersion)) + // Starting from protocol 23 we need to fully override the Soroban in-memory + // state size on upgrade, as before protocol 23 bucket list size has been + // used. + // NB: this has to be the last step in this function, as it reloads the + // network config from the ledger and expects it to already have all the + // expected entries. + if (protocolVersionStartsFrom(newVersion, ProtocolVersion::V_23)) { - SorobanNetworkConfig::updateCostTypesForV26(ltx, app); + app.getLedgerManager().handleUpgradeAffectingSorobanInMemoryStateSize( + ltx); } } @@ -1286,19 +1290,19 @@ Upgrades::applyReserveUpgrade(AbstractLedgerTxn& ltx, uint32_t newReserve) } ConfigUpgradeSetFrameConstPtr -ConfigUpgradeSetFrame::makeFromKey(LedgerSnapshot const& ls, +ConfigUpgradeSetFrame::makeFromKey(LedgerReadView const& lrv, ConfigUpgradeSetKey const& key) { auto lk = ConfigUpgradeSetFrame::getLedgerKey(key); - auto ltxe = ls.load(lk); + auto ltxe = lrv.load(lk); if (!ltxe) { return nullptr; } - auto ttlLtxe = ls.load(getTTLKey(lk)); + auto ttlLtxe = lrv.load(getTTLKey(lk)); releaseAssert(ttlLtxe); - if (!isLive(ttlLtxe.current(), ls.getLedgerHeader().current().ledgerSeq)) + if (!isLive(ttlLtxe.current(), lrv.getLedgerHeader().current().ledgerSeq)) { return nullptr; } @@ -1322,7 +1326,7 @@ ConfigUpgradeSetFrame::makeFromKey(LedgerSnapshot const& ls, } return std::shared_ptr(new ConfigUpgradeSetFrame( - upgradeSet, key, ls.getLedgerHeader().current().ledgerVersion)); + upgradeSet, key, lrv.getLedgerHeader().current().ledgerVersion)); } ConfigUpgradeSetFrame::ConfigUpgradeSetFrame( @@ -1410,19 +1414,29 @@ ConfigUpgradeSetFrame::getLedgerKey(ConfigUpgradeSetKey const& upgradeKey) } bool -ConfigUpgradeSetFrame::upgradeNeeded(LedgerSnapshot const& ls) const +ConfigUpgradeSetFrame::upgradeNeeded(LedgerReadView const& lrv) const { - if (protocolVersionIsBefore(ls.getLedgerHeader().current().ledgerVersion, + if (protocolVersionIsBefore(lrv.getLedgerHeader().current().ledgerVersion, SOROBAN_PROTOCOL_VERSION)) { return false; } for (auto const& updatedEntry : mConfigUpgradeSet.updatedEntry) { + // The delta entry has no stored counterpart — it always needs + // to be applied (it modifies CONFIG_SETTING_FROZEN_LEDGER_KEYS). + if (updatedEntry.configSettingID() == + ConfigSettingID::CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA || + updatedEntry.configSettingID() == + ConfigSettingID::CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + return true; + } + LedgerKey key(LedgerEntryType::CONFIG_SETTING); key.configSetting().configSettingID = updatedEntry.configSettingID(); bool isSame = - ls.load(key).current().data.configSetting() == updatedEntry; + lrv.load(key).current().data.configSetting() == updatedEntry; if (!isSame) { return true; @@ -1438,10 +1452,74 @@ ConfigUpgradeSetFrame::applyTo(AbstractLedgerTxn& ltx, Application& app) const bool hasMemorySettingsUpgrade = false; for (auto const& updatedEntry : mConfigUpgradeSet.updatedEntry) { - LedgerKey key(LedgerEntryType::CONFIG_SETTING); auto const id = updatedEntry.configSettingID(); + // Delta entries are not stored config entries. They modify the + // corresponding base entries instead. + if (id == ConfigSettingID::CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA) + { + LedgerKey frozenKeysLk(LedgerEntryType::CONFIG_SETTING); + frozenKeysLk.configSetting().configSettingID = + CONFIG_SETTING_FROZEN_LEDGER_KEYS; + auto frozenKeysLtxe = ltx.load(frozenKeysLk); + auto& frozenKeysVec = frozenKeysLtxe.current() + .data.configSetting() + .frozenLedgerKeys() + .keys; + std::set> existing; + for (auto const& k : frozenKeysVec) + { + existing.insert(k); + } + + auto const& delta = updatedEntry.frozenLedgerKeysDelta(); + for (auto const& k : delta.keysToFreeze) + { + existing.insert(k); + } + for (auto const& k : delta.keysToUnfreeze) + { + existing.erase(k); + } + + frozenKeysVec.assign(existing.begin(), existing.end()); + continue; + } + + if (id == ConfigSettingID::CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + LedgerKey bypassTxsLk(LedgerEntryType::CONFIG_SETTING); + bypassTxsLk.configSetting().configSettingID = + CONFIG_SETTING_FREEZE_BYPASS_TXS; + auto bypassTxsLtxe = ltx.load(bypassTxsLk); + auto& bypassTxsVec = bypassTxsLtxe.current() + .data.configSetting() + .freezeBypassTxs() + .txHashes; + + std::set existing; + for (auto const& h : bypassTxsVec) + { + existing.insert(h); + } + + auto const& delta = updatedEntry.freezeBypassTxsDelta(); + for (auto const& h : delta.addTxs) + { + existing.insert(h); + } + for (auto const& h : delta.removeTxs) + { + existing.erase(h); + } + + bypassTxsVec.assign(existing.begin(), existing.end()); + continue; + } + + LedgerKey key(LedgerEntryType::CONFIG_SETTING); key.configSetting().configSettingID = id; - auto& currentEntry = ltx.load(key).current().data.configSetting(); + auto ltxe = ltx.load(key); + auto& currentEntry = ltxe.current().data.configSetting(); if (id == ConfigSettingID::CONFIG_SETTING_STATE_ARCHIVAL && currentEntry.stateArchivalSettings() .liveSorobanStateSizeWindowSampleSize != diff --git a/src/herder/Upgrades.h b/src/herder/Upgrades.h index 306ef0f172..9a5da3b566 100644 --- a/src/herder/Upgrades.h +++ b/src/herder/Upgrades.h @@ -20,7 +20,7 @@ class Config; class Database; struct LedgerHeader; struct LedgerUpgrade; -class LedgerSnapshot; +class LedgerReadView; class ConfigUpgradeSetFrame; using ConfigUpgradeSetFrameConstPtr = @@ -70,7 +70,7 @@ class Upgrades std::string toJson() const; void fromJson(std::string const& s); - std::string toDebugJson(LedgerSnapshot const& ls) const; + std::string toDebugJson(LedgerReadView const& lrv) const; }; Upgrades() @@ -85,7 +85,7 @@ class Upgrades // create upgrades for given ledger std::vector createUpgradesFor(LedgerHeader const& lclHeader, - LedgerSnapshot const& ls) const; + LedgerReadView const& lrv) const; // apply upgrade to ledger header static void applyTo(LedgerUpgrade const& upgrade, Application& app, @@ -109,7 +109,7 @@ class Upgrades static UpgradeValidity isValidForApply(UpgradeType const& upgrade, LedgerUpgrade& lupgrade, Application& app, - LedgerSnapshot const& ls); + LedgerReadView const& lrv); // returns true if upgrade is a valid upgrade step // in which case it also sets upgradeType @@ -136,7 +136,7 @@ class Upgrades // returns true if upgrade is a valid upgrade step // in which case it also sets lupgrade bool isValidForNomination(LedgerUpgrade const& upgrade, - LedgerSnapshot const& ls) const; + LedgerReadView const& lrv) const; static void applyVersionUpgrade(Application& app, AbstractLedgerTxn& ltx, uint32_t newVersion); @@ -156,7 +156,7 @@ class ConfigUpgradeSetFrame { public: static ConfigUpgradeSetFrameConstPtr - makeFromKey(LedgerSnapshot const& ls, ConfigUpgradeSetKey const& key); + makeFromKey(LedgerReadView const& lrv, ConfigUpgradeSetKey const& key); static LedgerKey getLedgerKey(ConfigUpgradeSetKey const& upgradeKey); @@ -164,7 +164,7 @@ class ConfigUpgradeSetFrame ConfigUpgradeSetKey const& getKey() const; - bool upgradeNeeded(LedgerSnapshot const& ls) const; + bool upgradeNeeded(LedgerReadView const& lrv) const; void applyTo(AbstractLedgerTxn& ltx, Application& app) const; diff --git a/src/herder/test/HerderTests.cpp b/src/herder/test/HerderTests.cpp index ca857813f2..45d2c7f0b0 100644 --- a/src/herder/test/HerderTests.cpp +++ b/src/herder/test/HerderTests.cpp @@ -24,7 +24,6 @@ #include "crypto/SHA.h" #include "database/Database.h" #include "herder/HerderUtils.h" -#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnHeader.h" @@ -44,6 +43,7 @@ #include "util/ProtocolVersion.h" #include "crypto/Hex.h" +#include "crypto/KeyUtils.h" #include "ledger/test/LedgerTestUtils.h" #include "test/TxTests.h" #include "xdr/Stellar-ledger.h" @@ -311,7 +311,7 @@ testTxSet(uint32 protocolVersion) SECTION("invalid tx") { auto diagnostics = DiagnosticEventManager::createDisabled(); - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); SECTION("no user") { @@ -321,7 +321,7 @@ testTxSet(uint32 protocolVersion) // Individual tx check: account doesn't exist REQUIRE(badTx - ->checkValid(app->getAppConnector(), ls, 0, 0, 0, + ->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txNO_ACCOUNT); @@ -351,7 +351,7 @@ testTxSet(uint32 protocolVersion) // Individual tx check: bad sequence number REQUIRE(badTx - ->checkValid(app->getAppConnector(), ls, 0, 0, 0, + ->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txBAD_SEQ); @@ -382,7 +382,7 @@ testTxSet(uint32 protocolVersion) // Individual tx check: insufficient balance // Need fresh snapshot after account creation - LedgerSnapshot lsNew(*app); + LedgerReadView lsNew(*app); REQUIRE(badTx ->checkValid(app->getAppConnector(), lsNew, 0, 0, 0, diagnostics) @@ -416,7 +416,7 @@ testTxSet(uint32 protocolVersion) // Individual tx check: bad auth (signature invalidated by maxTime // change) REQUIRE(badTx - ->checkValid(app->getAppConnector(), ls, 0, 0, 0, + ->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txBAD_AUTH); @@ -437,6 +437,47 @@ testTxSet(uint32 protocolVersion) txs, TxSetValidationResult::TX_VALIDATION_FAILED); } } + SECTION("zero ops transaction") + { + auto lclHeader = + app->getLedgerManager().getLastClosedLedgerHeader(); + + auto tx = + transactionFromOperations(*app, root->getSecretKey(), + root->nextSequenceNumber(), {}, 1000); + + SECTION("legacy tx set") + { + // This is a regression test - legacy tx sets are not allowed in + // new protocols, but Core still accepts them and it does some + // tx-related validation before reaching the + // `GENERALIZED_TXSET_MISMATCH` check. + TransactionSet txSet; + txSet.previousLedgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + txSet.txs.push_back(tx->getEnvelope()); + auto applicableTxSet = + TxSetXDRFrame::makeFromWire(txSet)->prepareForApply( + *app, lclHeader.header); + REQUIRE(applicableTxSet != nullptr); + REQUIRE(applicableTxSet->checkValidWithResult(*app, 0, 0) == + TxSetValidationResult::GENERALIZED_TXSET_MISMATCH); + } + SECTION("generalized tx set") + { + auto txSet = + testtxset::makeNonValidatedGeneralizedTxSet( + {{std::make_pair( + std::nullopt, + std::vector{tx})}, + {}}, + *app, lclHeader.hash) + .second; + REQUIRE(txSet); + REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == + TxSetValidationResult::TX_VALIDATION_FAILED); + } + } } } @@ -491,7 +532,7 @@ testTxSetWithFeeBumps(uint32 protocolVersion) }; auto diagnostics = DiagnosticEventManager::createDisabled(); - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); SECTION("invalid transaction") { @@ -501,7 +542,7 @@ testTxSetWithFeeBumps(uint32 protocolVersion) auto fb1 = feeBump(*app, account2, tx1, minBalance2); // Individual tx check: fee bump exceeds fee source balance - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txINSUFFICIENT_BALANCE); @@ -527,10 +568,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) auto fb2 = feeBump(*app, account2, tx2, 200); // Individual tx checks: first exceeds balance, second is valid - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txINSUFFICIENT_BALANCE); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); @@ -555,10 +596,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) auto tx2 = transaction(*app, account3, 1, 1, 100); auto fb2 = feeBump(*app, account2, tx2, minBalance2); - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txINSUFFICIENT_BALANCE); @@ -584,10 +625,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) auto fb2 = feeBump(*app, account2, tx2, 200); // Individual tx checks - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txFEE_BUMP_INNER_FAILED); @@ -616,14 +657,14 @@ testTxSetWithFeeBumps(uint32 protocolVersion) feeBump(*app, account2, tx3, minBalance2 - minBalance0 - 199); // Individual tx checks - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txFEE_BUMP_INNER_FAILED); // Individually, fb2 is valid, but with fb1 it would exceed balance - REQUIRE(fb3->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb3->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); @@ -644,10 +685,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("two fee bumps, same fee source, valid individually, combined " "exceed balance") { - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); auto balanceOfFbAccount = getAvailableBalance( - ls.getLedgerHeader().current(), - ls.getAccount(account2.getPublicKey()).current()); + lrv.getLedgerHeader().current(), + lrv.getAccount(account2.getPublicKey()).current()); // Enforce balance invariance int64_t fee1 = 200; @@ -663,10 +704,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) auto fb2 = feeBump(*app, account2, tx2, fee2); // Individual txs are valid auto diagnostics = DiagnosticEventManager::createDisabled(); - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); @@ -716,10 +757,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) createUploadWasmTx(*app, sorobanAccount2, 100, DEFAULT_TEST_RESOURCE_FEE, resources); - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); auto balanceOfFbAccount = getAvailableBalance( - ls.getLedgerHeader().current(), - ls.getAccount(feeSourceAccount.getPublicKey()).current()); + lrv.getLedgerHeader().current(), + lrv.getAccount(feeSourceAccount.getPublicKey()).current()); // Set fees so that each is valid individually but combined they // exceed the fee source's balance @@ -737,10 +778,10 @@ testTxSetWithFeeBumps(uint32 protocolVersion) // Individual txs are valid auto diagnostics = DiagnosticEventManager::createDisabled(); - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); @@ -770,6 +811,84 @@ testTxSetWithFeeBumps(uint32 protocolVersion) TxSetValidationResult::ACCOUNT_CANT_PAY_FEE); } } + SECTION("cross-phase fee bumps") + { + modifySorobanNetworkConfig(*app, [](SorobanNetworkConfig& cfg) { + auto mx = std::numeric_limits::max(); + cfg.mLedgerMaxTxCount = mx; + cfg.mLedgerMaxInstructions = mx; + cfg.mLedgerMaxDiskReadBytes = mx; + cfg.mLedgerMaxWriteBytes = mx; + cfg.mLedgerMaxDiskReadEntries = mx; + cfg.mLedgerMaxWriteLedgerEntries = mx; + }); + + auto& feeSourceAccount = account1; + + SorobanResources resources; + resources.instructions = 1'000'000; + resources.diskReadBytes = 1000; + resources.writeBytes = 1000; + + auto classicTx = transaction(*app, account2, 1, 1, 100); + auto sorobanTx = createUploadWasmTx( + *app, account3, 100, DEFAULT_TEST_RESOURCE_FEE, resources); + + auto balanceOfFbAccount = feeSourceAccount.getAvailableBalance(); + + auto classicFb = feeBump(*app, feeSourceAccount, classicTx, 200); + int64_t sorobanFee = + balanceOfFbAccount - classicFb->getFullFee() + 1; + auto sorobanFb = + feeBump(*app, feeSourceAccount, sorobanTx, sorobanFee, + /* useInclusionAsFullFee */ true); + + REQUIRE(balanceOfFbAccount < + classicFb->getFullFee() + sorobanFb->getFullFee()); + REQUIRE(classicFb->getFullFee() < balanceOfFbAccount); + REQUIRE(sorobanFb->getFullFee() < balanceOfFbAccount); + + auto diagnostics = DiagnosticEventManager::createDisabled(); + REQUIRE(classicFb + ->checkValid(app->getAppConnector(), lrv, 0, 0, 0, + diagnostics) + ->isSuccess()); + REQUIRE(sorobanFb + ->checkValid(app->getAppConnector(), lrv, 0, 0, 0, + diagnostics) + ->isSuccess()); + + PerPhaseTransactionList invalidPerPhase; + invalidPerPhase.resize(2); + SECTION("build block") + { + auto txSet = makeTxSetFromTransactions( + {{classicFb}, {sorobanFb}}, *app, 0, 0, invalidPerPhase); + compareTxs(invalidPerPhase[0], {}); + compareTxs(invalidPerPhase[1], {sorobanFb}); + } + SECTION("validate block") + { + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto txSet = + testtxset::makeNonValidatedGeneralizedTxSet( + {{std::make_pair( + std::nullopt, + std::vector{classicFb})}, + {std::make_pair( + std::nullopt, + std::vector{sorobanFb})}}, + *app, ledgerHash) + .second; + auto expected = + protocolVersion >= + static_cast(ProtocolVersion::V_26) + ? TxSetValidationResult::ACCOUNT_CANT_PAY_FEE + : TxSetValidationResult::VALID; + REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == expected); + } + } } } @@ -788,10 +907,10 @@ TEST_CASE("getInvalidTxListWithErrors returns no duplicates") auto account3 = root->create("a3", minBalance2); auto account4 = root->create("a4", minBalance2); - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); auto balanceOfFeeSource = - getAvailableBalance(ls.getLedgerHeader().current(), - ls.getAccount(account2.getPublicKey()).current()); + getAvailableBalance(lrv.getLedgerHeader().current(), + lrv.getAccount(account2.getPublicKey()).current()); // Create three fee bumps from account2 (fee source): // - fb1: fails checkValid (bad sequence number) @@ -823,12 +942,12 @@ TEST_CASE("getInvalidTxListWithErrors returns no duplicates") // Verify fb1 fails checkValid - inner tx has bad sequence number auto diagnostics = DiagnosticEventManager::createDisabled(); - REQUIRE(fb1->checkValid(app->getAppConnector(), ls, 0, 0, 0, diagnostics) + REQUIRE(fb1->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->getResultCode() == txFEE_BUMP_INNER_FAILED); // Verify fb2 and fb3 pass checkValid individually - REQUIRE(fb2->checkValid(app->getAppConnector(), ls, 0, 0, 0, diagnostics) + REQUIRE(fb2->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); - REQUIRE(fb3->checkValid(app->getAppConnector(), ls, 0, 0, 0, diagnostics) + REQUIRE(fb3->checkValid(app->getAppConnector(), lrv, 0, 0, 0, diagnostics) ->isSuccess()); // Verify combined fees of fb2 + fb3 exceed balance @@ -838,8 +957,10 @@ TEST_CASE("getInvalidTxListWithErrors returns no duplicates") REQUIRE(fb3->getFullFee() < balanceOfFeeSource); TxFrameList txs = {fb1, fb2, fb3}; + UnorderedMap accountFeeMap; auto invalidTxs = - TxSetUtils::getInvalidTxListWithErrors(txs, *app, 0, 0).first; + TxSetUtils::getInvalidTxListWithErrors(txs, *app, accountFeeMap, 0, 0) + .first; // Check for no duplicates by comparing size with unique count std::unordered_set uniqueHashes; @@ -2802,10 +2923,11 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) // and only if we expect it to be invalid. auto closeTimeOffset = nextCloseTime - lclCloseTime; TxFrameList removed; + UnorderedMap accountFeeMap; TxSetUtils::trimInvalid( applicableTxSet->getPhase(TxSetPhase::CLASSIC) .getSequentialTxs(), - *app, closeTimeOffset, closeTimeOffset, removed); + *app, accountFeeMap, closeTimeOffset, closeTimeOffset, removed); REQUIRE(removed.size() == (expectValid ? 0 : 1)); }; @@ -5054,8 +5176,9 @@ TEST_CASE("ledger state update flow with parallel apply", "[herder][parallel]") REQUIRE(lm.getLastClosedLedgerNum() == lcl); REQUIRE(lm.getLastClosedLedgerHAS().currentLedger == lastHeader.ledgerSeq); - REQUIRE(lm.getLastClosedSnapshot()->getLedgerHeader() == - lastHeader); + REQUIRE( + lm.copyLedgerStateSnapshot().getLedgerHeader().current() == + lastHeader); // Apply state got committed, but has not yet been propagated to // read-only state @@ -5107,8 +5230,9 @@ TEST_CASE("ledger state update flow with parallel apply", "[herder][parallel]") auto readOnly = lm.getLastClosedLedgerHeader(); REQUIRE(readOnly.header.ledgerSeq == lcl + 1); REQUIRE(lm.getLastClosedLedgerNum() == lcl + 1); - REQUIRE(lm.getLastClosedSnapshot()->getLedgerHeader() == - readOnly.header); + REQUIRE( + lm.copyLedgerStateSnapshot().getLedgerHeader().current() == + readOnly.header); auto has = lm.getLastClosedLedgerHAS(); REQUIRE(has.currentLedger == readOnly.header.ledgerSeq); @@ -6281,6 +6405,167 @@ TEST_CASE("exclude transactions by operation type", "[herder]") } } +TEST_CASE("filter transactions by G address", "[herder]") +{ + SECTION("no filter - transaction accepted") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto acc = getAccount("acc"); + auto tx = root->tx({createAccount(acc.getPublicKey(), 1)}); + + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } + + SECTION("default filter does not reject unrelated source") + { + VirtualClock clock; + auto cfg = getTestConfig(); + // keep defaults + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto acc = getAccount("acc"); + auto tx = root->tx({createAccount(acc.getPublicKey(), 1)}); + + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } + + SECTION("filtered source account is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + // Use a custom key for a funded account, then add it to the filter + auto srcKey = SecretKey::pseudoRandomForTesting(); + cfg.FILTERED_G_ADDRESSES = {KeyUtils::toStrKey(srcKey.getPublicKey())}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto src = root->create(srcKey, 1000000000); + auto acc = getAccount("acc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } + + SECTION("filtered operation source account is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + cfg.FILTERED_G_ADDRESSES = { + KeyUtils::toStrKey(filteredKey.getPublicKey())}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto fa = root->create(filteredKey, 1000000000); + // Build a tx from root but with an op sourced from filtered account + auto op = payment(root->getPublicKey(), 1); + op.sourceAccount.activate() = + toMuxedAccount(filteredKey.getPublicKey()); + auto tx = root->tx({op}); + + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } + + SECTION("soroban tx with filtered account in write footprint is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + cfg.FILTERED_G_ADDRESSES = { + KeyUtils::toStrKey(filteredKey.getPublicKey())}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + + // Build a Soroban tx whose write footprint contains the filtered + // account key + SorobanResources resources; + resources.footprint.readWrite = { + accountKey(filteredKey.getPublicKey())}; + resources.instructions = 1'000'000; + resources.diskReadBytes = 1000; + resources.writeBytes = 1000; + + auto op = createUploadWasmOperation(1000); + auto tx = sorobanTransactionFrameFromOps( + app->getNetworkID(), *root, {op}, {}, resources, + /* inclusionFee */ 1000, /* resourceFee */ 10000); + + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } + + SECTION("fee-bump with filtered fee source is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + cfg.FILTERED_G_ADDRESSES = { + KeyUtils::toStrKey(filteredKey.getPublicKey())}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto fa = root->create(filteredKey, 1000000000); + auto feeSource = TestAccount{*app, filteredKey}; + + auto innerTx = root->tx({payment(root->getPublicKey(), 1)}); + auto fb = feeBump(*app, feeSource, innerTx, 200); + + REQUIRE(app->getHerder().recvTransaction(fb, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } + + SECTION("fee-bump with filtered inner source is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + cfg.FILTERED_G_ADDRESSES = { + KeyUtils::toStrKey(filteredKey.getPublicKey())}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto filteredAcct = root->create(filteredKey, 1000000000); + auto otherKey = getAccount("other"); + auto other = root->create(otherKey, 1000000000); + + // Inner tx source is filtered; fee source (other) is not + auto innerTx = filteredAcct.tx({payment(other.getPublicKey(), 1)}); + auto fb = feeBump(*app, other, innerTx, 200); + + REQUIRE(app->getHerder().recvTransaction(fb, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } + + SECTION("fee-bump with non-filtered accounts is accepted") + { + VirtualClock clock; + auto cfg = getTestConfig(); + // keep defaults - none of the test accounts match + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto otherKey = getAccount("other"); + auto other = root->create(otherKey, 1000000000); + + auto innerTx = root->tx({payment(other.getPublicKey(), 1)}); + auto fb = feeBump(*app, other, innerTx, 200); + + REQUIRE(app->getHerder().recvTransaction(fb, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } +} + // Test that Herder updates the scphistory table with additional messages from // ledger `n-1` when closing ledger `n` TEST_CASE("SCP message capture from previous ledger", "[herder]") @@ -7727,3 +8012,113 @@ TEST_CASE("late joining node reaches consensus", "[herder]") REQUIRE(B->getLedgerManager().getLastClosedLedgerNum() >= targetLedger); REQUIRE(C->getLedgerManager().getLastClosedLedgerNum() >= targetLedger); } + +TEST_CASE("far-future slots cleanup", "[herder]") +{ + SIMULATION_CREATE_NODE(0); + SIMULATION_CREATE_NODE(1); + SIMULATION_CREATE_NODE(2); + SIMULATION_CREATE_NODE(3); + + auto mode = Simulation::OVER_LOOPBACK; + auto networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); + + Simulation simulation(mode, networkID, [](int i) { + auto cfg = getTestConfig(i); + // Ensure we can test catch-up without history + cfg.MAX_SLOTS_TO_REMEMBER = 100; + return cfg; + }); + + // 3 validators with threshold 2 (majority) + SCPQuorumSet qSet; + qSet.threshold = 2; + qSet.validators.push_back(v1NodeID); + qSet.validators.push_back(v2NodeID); + qSet.validators.push_back(v3NodeID); + + // Add all 4 nodes. v0 is a non-validator watcher. + // Use config index 4 to avoid collisions with the simulation's internal + // config counter (which allocates indices 0-2 for v1, v2, v3). + simulation.addNode(v0SecretKey, qSet); + simulation.addNode(v1SecretKey, qSet); + simulation.addNode(v2SecretKey, qSet); + simulation.addNode(v3SecretKey, qSet); + + // Connect all nodes and start + simulation.addPendingConnection(v0NodeID, v1NodeID); + simulation.addPendingConnection(v1NodeID, v2NodeID); + simulation.addPendingConnection(v2NodeID, v3NodeID); + simulation.startAllNodes(); + + // Close a few ledgers so all nodes are in sync and tracking + auto const INITIAL_LEDGERS = 3u; + simulation.crankUntil( + [&]() { + return simulation.haveAllExternalized( + LedgerManager::GENESIS_LEDGER_SEQ + INITIAL_LEDGERS, 1); + }, + 10 * INITIAL_LEDGERS * simulation.getExpectedLedgerCloseTime(), false); + + auto app0 = simulation.getNode(v0NodeID); + auto& herder0 = static_cast(app0->getHerder()); + REQUIRE(herder0.isTracking()); + + // Disconnect v0 from the network + simulation.dropConnection(v0NodeID, v1NodeID); + + // Run the simulation until v0 is no longer tracking. + simulation.crankUntil([&]() { return !herder0.isTracking(); }, + 50 * simulation.getExpectedLedgerCloseTime(), false); + + // Inject far-future envelopes into the non-tracking v0. + auto localQSet = herder0.getSCP().getLocalQuorumSet(); + auto qsetHash = sha256(xdr::xdr_to_opaque(localQSet)); + auto const ct = app0->getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue.closeTime + + 1; + auto injectEnvelope = [&](SecretKey const& sk, uint64_t slotIndex) { + SCPEnvelope envelope; + envelope.statement.slotIndex = slotIndex; + envelope.statement.pledges.type(SCP_ST_EXTERNALIZE); + auto& ext = envelope.statement.pledges.externalize(); + auto txSet = TxSetXDRFrame::makeEmpty( + app0->getLedgerManager().getLastClosedLedgerHeader()); + StellarValue sv = herder0.makeStellarValue( + txSet->getContentsHash(), ct, xdr::xvector{}, + v1SecretKey); + ext.commit.counter = 1; + ext.commit.value = xdr::xdr_to_opaque(sv); + ext.commitQuorumSetHash = qsetHash; + ext.nH = 1; + envelope.statement.nodeID = sk.getPublicKey(); + herder0.signEnvelope(sk, envelope); + return herder0.recvSCPEnvelope(envelope, localQSet, txSet); + }; + + auto const NUM_FUTURE = 50; + auto const FAR_FUTURE_BASE = 1'000'000; + auto slotsBefore = herder0.getSCP().getKnownSlotsCount(); + + for (uint32_t i = 0; i < NUM_FUTURE; ++i) + { + auto res = injectEnvelope(v1SecretKey, FAR_FUTURE_BASE + i); + REQUIRE(res == Herder::ENVELOPE_STATUS_READY); + } + + // V0 should have NUM_FUTURE more slots now. + auto slotsAfterInject = herder0.getSCP().getKnownSlotsCount(); + REQUIRE(slotsAfterInject >= slotsBefore + NUM_FUTURE); + REQUIRE(herder0.getSCP().getHighestKnownSlotIndex() >= FAR_FUTURE_BASE); + + // Reconnect v0 to the validators so it can catch up + simulation.addConnection(v0NodeID, v1NodeID); + + // Crank until v0 starts tracking the network again + simulation.crankUntil([&]() { return herder0.isTracking(); }, + 60 * simulation.getExpectedLedgerCloseTime(), false); + + // Check that far-future slots have been removed + REQUIRE(herder0.getSCP().getHighestKnownSlotIndex() < FAR_FUTURE_BASE); +} diff --git a/src/herder/test/PendingEnvelopesTests.cpp b/src/herder/test/PendingEnvelopesTests.cpp index e2395e6050..8d9b699c2c 100644 --- a/src/herder/test/PendingEnvelopesTests.cpp +++ b/src/herder/test/PendingEnvelopesTests.cpp @@ -270,16 +270,16 @@ TEST_CASE("PendingEnvelopes recvSCPEnvelope", "[herder]") SECTION("with slotIndex difference less or equal than " "MAX_SLOTS_TO_REMEMBER") { - pendingEnvelopes.eraseBelow( + pendingEnvelopes.eraseOutsideRange( saneEnvelope2.statement.slotIndex - app->getConfig().MAX_SLOTS_TO_REMEMBER, - lastCheckpointSeq); + std::nullopt, lastCheckpointSeq); REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope2) == Herder::ENVELOPE_STATUS_READY); - pendingEnvelopes.eraseBelow( + pendingEnvelopes.eraseOutsideRange( saneEnvelope3.statement.slotIndex - app->getConfig().MAX_SLOTS_TO_REMEMBER, - lastCheckpointSeq); + std::nullopt, lastCheckpointSeq); REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope3) == Herder::ENVELOPE_STATUS_READY); } @@ -288,7 +288,8 @@ TEST_CASE("PendingEnvelopes recvSCPEnvelope", "[herder]") { auto const minSlot = saneEnvelope3.statement.slotIndex - app->getConfig().MAX_SLOTS_TO_REMEMBER; - pendingEnvelopes.eraseBelow(minSlot, lastCheckpointSeq); + pendingEnvelopes.eraseOutsideRange(minSlot, std::nullopt, + lastCheckpointSeq); auto saneQSetP = pendingEnvelopes.getQSet(saneQSetHash); // 3 as we have "p", "txSet" and SCP @@ -297,7 +298,8 @@ TEST_CASE("PendingEnvelopes recvSCPEnvelope", "[herder]") REQUIRE(saneQSetP.use_count() == 4); // clears SCP - herder.getSCP().purgeSlots(minSlot, lastCheckpointSeq); + herder.getSCP().purgeSlotsOutsideRange(minSlot, std::nullopt, + lastCheckpointSeq); REQUIRE(txSet.use_count() == 2); REQUIRE(saneQSetP.use_count() == 3); @@ -328,6 +330,63 @@ TEST_CASE("PendingEnvelopes recvSCPEnvelope", "[herder]") Herder::ENVELOPE_STATUS_FETCHING); } } + + SECTION("eraseOutsideRange with upper bound only") + { + // Receive saneEnvelope2 and saneEnvelope3 via PendingEnvelopes. + // Since qset and txset are already cached from processing + // saneEnvelope, both go to READY. + REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope2) == + Herder::ENVELOPE_STATUS_READY); + REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope3) == + Herder::ENVELOPE_STATUS_READY); + + // Erase everything above saneEnvelope2's slot. + auto const maxSlot = saneEnvelope2.statement.slotIndex; + pendingEnvelopes.eraseOutsideRange(std::nullopt, maxSlot, + lastCheckpointSeq); + herder.getSCP().purgeSlotsOutsideRange(std::nullopt, maxSlot, + lastCheckpointSeq); + + // saneEnvelope is still PROCESSED + REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope) == + Herder::ENVELOPE_STATUS_PROCESSED); + + // saneEnvelope2 is still PROCESSED + REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope2) == + Herder::ENVELOPE_STATUS_PROCESSED); + + // saneEnvelope3 was erased. + // Re-receiving it goes to READY (txset/qset still resolvable + // via refs held by in-range slots). + REQUIRE(pendingEnvelopes.recvSCPEnvelope(saneEnvelope3) == + Herder::ENVELOPE_STATUS_READY); + } + + SECTION("eraseOutsideRange with both bounds") + { + // Erase everything outside [envelope2.slot, envelope2.slot], + // This erases: + // - saneEnvelope + // - txset cache entry + // and purges SCP slot 2. + auto const boundSlot = saneEnvelope2.statement.slotIndex; + pendingEnvelopes.eraseOutsideRange(boundSlot, boundSlot, + lastCheckpointSeq); + + auto saneQSetP = pendingEnvelopes.getQSet(saneQSetHash); + + // txSet refs: "p", "txSet", SCP (saneEnvelope's slot still in SCP) + REQUIRE(txSet.use_count() == 3); + // qSet refs: "saneQSetP", SCP, cache, quorum tracker + REQUIRE(saneQSetP.use_count() == 4); + + // Purge SCP: saneEnvelope's slot removed + herder.getSCP().purgeSlotsOutsideRange(boundSlot, boundSlot, + lastCheckpointSeq); + REQUIRE(txSet.use_count() == 2); + REQUIRE(saneQSetP.use_count() == 3); + } } SECTION("do not fetch if txsets are not signed") diff --git a/src/herder/test/TxSetTests.cpp b/src/herder/test/TxSetTests.cpp index 376bfef3a1..78563bf51d 100644 --- a/src/herder/test/TxSetTests.cpp +++ b/src/herder/test/TxSetTests.cpp @@ -1153,8 +1153,8 @@ TEST_CASE("applicable txset validation - transactions belong to correct phase", 1)}, 2000); } - LedgerSnapshot ls(*app); - REQUIRE(tx->checkValid(app->getAppConnector(), ls, 0, 0, 0) + LedgerReadView lrv(*app); + REQUIRE(tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); return tx; }; @@ -1314,8 +1314,8 @@ TEST_CASE("applicable txset validation - Soroban resources", "[txset][soroban]") auto tx = sorobanTransactionFrameFromOps( app->getNetworkID(), source, {op}, {}, resources, 2000, 100'000'000); - LedgerSnapshot ls(*app); - REQUIRE(tx->checkValid(app->getAppConnector(), ls, 0, 0, 0) + LedgerReadView lrv(*app); + REQUIRE(tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); return tx; }; @@ -1681,8 +1681,8 @@ TEST_CASE("generalized tx set with multiple txs per source account", // tx1 is valid on its own { - LedgerSnapshot ls(*app); - REQUIRE(tx1->checkValid(app->getAppConnector(), ls, 0, 0, 0) + LedgerReadView lrv(*app); + REQUIRE(tx1->checkValid(app->getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); } @@ -1714,10 +1714,10 @@ TEST_CASE("generalized tx set with multiple txs per source account", // Both txs individually are valid { - LedgerSnapshot ls(*app); - REQUIRE(tx1->checkValid(app->getAppConnector(), ls, 0, 0, 0) + LedgerReadView lrv(*app); + REQUIRE(tx1->checkValid(app->getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); - REQUIRE(tx2->checkValid(app->getAppConnector(), ls, 0, 0, 0) + REQUIRE(tx2->checkValid(app->getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); } @@ -1787,6 +1787,7 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") auto source = root->create("unique " + std::to_string(accountId++), app->getLedgerManager().getLastMinBalance(2)); + TransactionTestFramePtr tx; if (isSoroban) { SorobanResources resources; @@ -1796,16 +1797,9 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") resources.footprint.readWrite.emplace_back(); auto resourceFee = sorobanResourceFee(*app, resources, 5000, 40); resources.footprint.readWrite.pop_back(); - auto tx = createUploadWasmTx(*app, source, inclusionFee, - resourceFee, resources); + tx = createUploadWasmTx(*app, source, inclusionFee, resourceFee, + resources); REQUIRE(tx->getInclusionFee() == inclusionFee); - LedgerTxn ltx(app->getLedgerTxnRoot()); - if (validateTx) - { - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - } - return tx; } else { @@ -1815,10 +1809,17 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") ops.emplace_back(createAccount( getAccount(std::to_string(accountId++)).getPublicKey(), 1)); } - return transactionFromOperations(*app, source.getSecretKey(), - source.nextSequenceNumber(), ops, - inclusionFee); + tx = transactionFromOperations(*app, source.getSecretKey(), + source.nextSequenceNumber(), ops, + inclusionFee); + } + if (validateTx) + { + REQUIRE(tx->checkValid(app->getAppConnector(), LedgerReadView(*app), + 0, 0, 0) + ->isSuccess()); } + return tx; }; SECTION("valid txset") @@ -1905,6 +1906,24 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") } } } + SECTION("valid tx set with Soroban fee bump") + { + auto tx = createTx(1, 100, /* isSoroban */ true); + auto feeBumpTx = feeBump(*app, *root, tx, 200); + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto txSet = + testtxset::makeNonValidatedGeneralizedTxSet( + { + {}, + {std::make_pair( + 100, std::vector{feeBumpTx})}, + }, + *app, ledgerHash) + .second; + REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == + TxSetValidationResult::VALID); + } SECTION("tx with too low discounted fee") { SECTION("classic") @@ -1950,7 +1969,7 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") // level, resulting in TX_VALIDATION_FAILED SECTION("classic") { - auto tx = createTx(2, 199); + auto tx = createTx(2, 199, false, false); auto ledgerHash = app->getLedgerManager().getLastClosedLedgerHeader().hash; auto txSet = @@ -1983,6 +2002,82 @@ TEST_CASE("generalized tx set fees", "[txset][soroban]") TxSetValidationResult::TX_VALIDATION_FAILED); } } + SECTION("negative base fee") + { + SECTION("classic") + { + auto tx = createTx(2, 1000); + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto [xdrTxSet, applicableTxSet] = + testtxset::makeNonValidatedGeneralizedTxSet( + {{std::make_pair(-100, + std::vector{tx})}, + {}}, + *app, ledgerHash); + REQUIRE(applicableTxSet == nullptr); + } + SECTION("Soroban") + { + auto tx = createTx(1, 100, /* isSoroban */ true); + auto feeBumpTx = feeBump(*app, *root, tx, 300); + REQUIRE(feeBumpTx + ->checkValid(app->getAppConnector(), + LedgerReadView(*app), 0, 0, 0) + ->isSuccess()); + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto [xdrTxSet, applicableTxSet] = + testtxset::makeNonValidatedGeneralizedTxSet( + { + {}, + {std::make_pair( + std::numeric_limits::min(), + std::vector{feeBumpTx})}, + }, + *app, ledgerHash); + REQUIRE(applicableTxSet == nullptr); + } + } + SECTION("high base fee") + { + SECTION("classic") + { + auto tx = createTx(2, 1000); + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto [xdrTxSet, applicableTxSet] = + testtxset::makeNonValidatedGeneralizedTxSet( + {{std::make_pair(std::numeric_limits::max(), + std::vector{tx})}, + {}}, + *app, ledgerHash); + REQUIRE(applicableTxSet != nullptr); + REQUIRE(applicableTxSet->checkValidWithResult(*app, 0, 0) == + TxSetValidationResult::TX_FEE_BID_TOO_LOW); + } + SECTION("Soroban") + { + auto tx = createTx(1, 100, /* isSoroban */ true); + auto feeBumpTx = feeBump(*app, *root, tx, 200); + REQUIRE(feeBumpTx + ->checkValid(app->getAppConnector(), + LedgerReadView(*app), 0, 0, 0) + ->isSuccess()); + auto ledgerHash = + app->getLedgerManager().getLastClosedLedgerHeader().hash; + auto [xdrTxSet, applicableTxSet] = + testtxset::makeNonValidatedGeneralizedTxSet( + {{}, + {std::make_pair( + std::numeric_limits::max(), + std::vector{feeBumpTx})}}, + *app, ledgerHash); + REQUIRE(applicableTxSet != nullptr); + REQUIRE(applicableTxSet->checkValidWithResult(*app, 0, 0) == + TxSetValidationResult::TX_FEE_BID_TOO_LOW); + } + } } TEST_CASE("txset nomination", "[txset]") @@ -2462,9 +2557,9 @@ runParallelTxSetBuildingTest(bool variableStageCount) // its resources. auto tx = createUploadWasmTx(*app, source, inclusionFee, resourceFee, resources); - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); REQUIRE( - tx->checkValid(app->getAppConnector(), ls, 0, 0, 0)->isSuccess()); + tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0)->isSuccess()); return tx; }; @@ -3321,12 +3416,32 @@ TEST_CASE("parallel tx set building benchmark", << ", mean duration: " << 1e-6 * totalDuration / iterCount << " ms" << std::endl; }; + std::cout << "=== Parallel Tx Set Building Benchmark ===" << std::endl; + std::cout << "TX_COUNT=" + << MEAN_INCLUDED_TX_COUNT * TX_COUNT_MEMPOOL_MULTIPLIER + << " CLUSTER_COUNT=" << CLUSTER_COUNT + << " STAGES=" << MIN_STAGE_COUNT << "-" << MAX_STAGE_COUNT + << std::endl; + std::cout << "---" << std::endl; + // Fully independent (no conflicts) - stresses bin packing & cluster scan runBenchmark(0, 0, 0); + // Very sparse conflicts - mostly independent fast path + runBenchmark(0.1, 5, 1); + // Mix of independent and small conflict clusters + runBenchmark(0.5, 2, 2); + // Rare conflicts with large RO fan-out runBenchmark(1, 1000, 1); + // RW-only small conflict groups + runBenchmark(5, 0, 3); + // Moderate conflicts, large RO fan-out runBenchmark(10, 40, 1); + // Heavy conflicts, large RO fan-out runBenchmark(20, 40, 1); + // Moderate balanced RO/RW conflicts runBenchmark(10, 10, 10); + // Very heavy conflicts runBenchmark(50, 50, 5); + std::cout << "===" << std::endl; } } // namespace } // namespace stellar diff --git a/src/herder/test/UpgradesTests.cpp b/src/herder/test/UpgradesTests.cpp index 3d736cada2..f01acdf154 100644 --- a/src/herder/test/UpgradesTests.cpp +++ b/src/herder/test/UpgradesTests.cpp @@ -14,6 +14,7 @@ #include "herder/Upgrades.h" #include "history/HistoryArchiveManager.h" #include "history/test/HistoryTestsUtils.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -338,12 +339,12 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, makeTxCountUpgrade(cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE); auto baseReserveUpgrade = makeBaseReserveUpgrade(cfg.TESTING_UPGRADE_RESERVE); - auto ls = LedgerSnapshot(*app); + auto lrv = LedgerReadView(*app); SECTION("protocol version upgrade needed") { header.ledgerVersion--; - auto upgrades = Upgrades{cfg}.createUpgradesFor(header, ls); + auto upgrades = Upgrades{cfg}.createUpgradesFor(header, lrv); auto expected = shouldListAny ? std::vector{protocolVersionUpgrade} : std::vector{}; @@ -353,7 +354,7 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, SECTION("base fee upgrade needed") { header.baseFee /= 2; - auto upgrades = Upgrades{cfg}.createUpgradesFor(header, ls); + auto upgrades = Upgrades{cfg}.createUpgradesFor(header, lrv); auto expected = shouldListAny ? std::vector{baseFeeUpgrade} : std::vector{}; @@ -363,7 +364,7 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, SECTION("tx count upgrade needed") { header.maxTxSetSize /= 2; - auto upgrades = Upgrades{cfg}.createUpgradesFor(header, ls); + auto upgrades = Upgrades{cfg}.createUpgradesFor(header, lrv); auto expected = shouldListAny ? std::vector{txCountUpgrade} : std::vector{}; @@ -373,7 +374,7 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, SECTION("base reserve upgrade needed") { header.baseReserve /= 2; - auto upgrades = Upgrades{cfg}.createUpgradesFor(header, ls); + auto upgrades = Upgrades{cfg}.createUpgradesFor(header, lrv); auto expected = shouldListAny ? std::vector{baseReserveUpgrade} : std::vector{}; @@ -386,7 +387,7 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, header.baseFee /= 2; header.maxTxSetSize /= 2; header.baseReserve /= 2; - auto upgrades = Upgrades{cfg}.createUpgradesFor(header, ls); + auto upgrades = Upgrades{cfg}.createUpgradesFor(header, lrv); auto expected = shouldListAny ? std::vector{protocolVersionUpgrade, @@ -705,14 +706,14 @@ TEST_CASE("config upgrade validation", "[upgrades]") LedgerTxn ltx(app->getLedgerTxnRoot()); ltx.loadHeader().current() = header; - auto ls = LedgerSnapshot(ltx); + auto lrv = LedgerReadView(ltx); LedgerUpgrade outUpgrade; SECTION("valid") { REQUIRE(Upgrades::isValidForApply( toUpgradeType(makeConfigUpgrade(*configUpgradeSet)), outUpgrade, *app, - ls) == Upgrades::UpgradeValidity::VALID); + lrv) == Upgrades::UpgradeValidity::VALID); REQUIRE(outUpgrade.newConfig() == configUpgradeSet->getKey()); } SECTION("unknown upgrade") @@ -724,7 +725,7 @@ TEST_CASE("config upgrade validation", "[upgrades]") ConfigUpgradeSetKey{contractID, upgradeHash}; REQUIRE(Upgrades::isValidForApply(toUpgradeType(ledgerUpgrade), - outUpgrade, *app, ls) == + outUpgrade, *app, lrv) == Upgrades::UpgradeValidity::INVALID); } SECTION("not valid") @@ -741,7 +742,7 @@ TEST_CASE("config upgrade validation", "[upgrades]") toUpgradeType( makeConfigUpgrade(*configUpgradeSetFrame)), outUpgrade, *app, - ls) == Upgrades::UpgradeValidity::XDR_INVALID); + lrv) == Upgrades::UpgradeValidity::XDR_INVALID); }; SECTION("no updated entries") { @@ -795,7 +796,7 @@ TEST_CASE("config upgrade validation", "[upgrades]") upgrade.newConfig() = upgradeKey; REQUIRE(Upgrades::isValidForApply(toUpgradeType(upgrade), - outUpgrade, *app, ls) == + outUpgrade, *app, lrv) == Upgrades::UpgradeValidity::INVALID); } } @@ -806,7 +807,7 @@ TEST_CASE("config upgrade validation", "[upgrades]") toUpgradeType(makeConfigUpgrade( *makeMaxContractSizeBytesTestUpgrade(ltx, 0))), outUpgrade, *app, - ls) == Upgrades::UpgradeValidity::INVALID); + lrv) == Upgrades::UpgradeValidity::INVALID); } } @@ -878,11 +879,11 @@ TEST_CASE("config upgrade validation for protocol 23", "[upgrades]") } LedgerTxn ltx(app->getLedgerTxnRoot()); ltx.loadHeader().current() = header; - auto ls = LedgerSnapshot(ltx); + auto lrv = LedgerReadView(ltx); LedgerUpgrade outUpgrade; return Upgrades::isValidForApply( toUpgradeType(makeConfigUpgrade(*configUpgradeSet)), outUpgrade, - *app, ls); + *app, lrv); }; SECTION("valid for apply") @@ -1097,11 +1098,11 @@ TEST_CASE("upgrades affect in-memory Soroban state state size", .getLedgerManager() .getSorobanInMemoryStateSizeForTesting(); auto getExpectedInMemorySize = [&]() { - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto res = expectedInMemorySizeDelta; for (auto const& key : addedKeys) { - auto le = ls.load(key); + auto le = lrv.load(key); res += ledgerEntrySizeForRent(le.current(), xdr::xdr_size(le.current()), 23, test.getNetworkCfg()); @@ -1110,11 +1111,11 @@ TEST_CASE("upgrades affect in-memory Soroban state state size", }; auto getStateSizeWindow = [&]() { - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); LedgerKey key(CONFIG_SETTING); key.configSetting().configSettingID = ConfigSettingID::CONFIG_SETTING_LIVE_SOROBAN_STATE_SIZE_WINDOW; - auto le = ls.load(key); + auto le = lrv.load(key); REQUIRE(le); std::vector windowFromLtx = le.current().data.configSetting().liveSorobanStateSizeWindow(); @@ -1407,11 +1408,11 @@ TEST_CASE("config upgrades applied to ledger", "[soroban][upgrades]") .liveSorobanStateSizeWindowSampleSize == size); }; auto loadWindow = [&]() { - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); LedgerKey key(CONFIG_SETTING); key.configSetting().configSettingID = ConfigSettingID::CONFIG_SETTING_LIVE_SOROBAN_STATE_SIZE_WINDOW; - return ls.load(key) + return lrv.load(key) .current() .data.configSetting() .liveSorobanStateSizeWindow(); @@ -2797,7 +2798,6 @@ TEST_CASE("upgrade to version 25 and check cost types", "[upgrades]") } } -#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION TEST_CASE("upgrade to version 26 and check cost types", "[upgrades]") { VirtualClock clock; @@ -2851,7 +2851,6 @@ TEST_CASE("upgrade to version 26 and check cost types", "[upgrades]") static_cast(ContractCostType::Bn254G1Msm) + 1); } } -#endif // There is a subtle inconsistency where for a ledger that upgrades from // protocol vN to vN+1 that also changed LedgerCloseMeta version, the ledger @@ -2976,8 +2975,8 @@ TEST_CASE("parallel Soroban settings upgrade", "[upgrades]") } { - LedgerSnapshot ls(*app); - REQUIRE(!ls.load(getParallelComputeSettingsLedgerKey())); + LedgerReadView lrv(*app); + REQUIRE(!lrv.load(getParallelComputeSettingsLedgerKey())); } executeUpgrade(*app, makeProtocolVersionUpgrade(static_cast( @@ -2985,9 +2984,9 @@ TEST_CASE("parallel Soroban settings upgrade", "[upgrades]") // Make sure initial value is correct. { - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); auto parellelComputeEntry = - ls.load(getParallelComputeSettingsLedgerKey()) + lrv.load(getParallelComputeSettingsLedgerKey()) .current() .data.configSetting(); REQUIRE(parellelComputeEntry.configSettingID() == @@ -3012,9 +3011,9 @@ TEST_CASE("parallel Soroban settings upgrade", "[upgrades]") executeUpgrade(*app, makeConfigUpgrade(*configUpgradeSet)); } - LedgerSnapshot ls(*app); + LedgerReadView lrv(*app); - REQUIRE(ls.load(getParallelComputeSettingsLedgerKey()) + REQUIRE(lrv.load(getParallelComputeSettingsLedgerKey()) .current() .data.configSetting() .contractParallelCompute() @@ -4056,8 +4055,7 @@ TEST_CASE("p24 upgrade fixes corrupted hot archive entries", }; auto runUpgradeAndGetSnapshot = [&]() { executeUpgrade(*app, makeProtocolVersionUpgrade(fixedProtocolVersion)); - return app->getAppConnector() - .copySearchableHotArchiveBucketListSnapshot(); + return app->getAppConnector().copyLedgerStateSnapshot(); }; auto const& corruptedEntries = p23_hot_archive_bug::internal::P23_CORRUPTED_HOT_ARCHIVE_ENTRIES; @@ -4077,10 +4075,10 @@ TEST_CASE("p24 upgrade fixes corrupted hot archive entries", BucketTestUtils::addHotArchiveBatchAndUpdateSnapshot( *app, app->getLedgerManager().getLastClosedLedgerHeader().header, allCorruptedEntries, {}); - auto hotArchiveSnapshot = runUpgradeAndGetSnapshot(); + auto snap = runUpgradeAndGetSnapshot(); for (auto const& [key, expectedEntry] : allExpectedFixedByKey) { - auto actual = hotArchiveSnapshot->load(key); + auto actual = snap.loadArchiveEntry(key); REQUIRE(actual); REQUIRE(actual->archivedEntry() == expectedEntry); } @@ -4092,8 +4090,8 @@ TEST_CASE("p24 upgrade fixes corrupted hot archive entries", BucketTestUtils::addHotArchiveBatchAndUpdateSnapshot( *app, app->getLedgerManager().getLastClosedLedgerHeader().header, allCorruptedEntries, {}); - auto hotArchiveSnapshot = runUpgradeAndGetSnapshot(); - auto actual = hotArchiveSnapshot->load(removedKey); + auto snap = runUpgradeAndGetSnapshot(); + auto actual = snap.loadArchiveEntry(removedKey); REQUIRE(!actual); } } diff --git a/src/history/HistoryArchive.cpp b/src/history/HistoryArchive.cpp index c71b99ae15..8fe966d390 100644 --- a/src/history/HistoryArchive.cpp +++ b/src/history/HistoryArchive.cpp @@ -41,7 +41,7 @@ formatString(std::string const& templateString, Tokens const&... tokens) { try { - return fmt::format(templateString, tokens...); + return fmt::format(fmt::runtime(templateString), tokens...); } catch (fmt::format_error const& ex) { diff --git a/src/history/HistoryManager.h b/src/history/HistoryManager.h index d910901b31..9f731f310b 100644 --- a/src/history/HistoryManager.h +++ b/src/history/HistoryManager.h @@ -181,6 +181,9 @@ namespace stellar { class Application; class Bucket; +class CompleteConstLedgerState; +using CompleteConstLedgerStatePtr = + std::shared_ptr; class LiveBucketList; class Config; class Database; @@ -199,7 +202,8 @@ class HistoryManager VERIFY_STATUS_ERR_BAD_LEDGER_VERSION, VERIFY_STATUS_ERR_OVERSHOT, VERIFY_STATUS_ERR_UNDERSHOT, - VERIFY_STATUS_ERR_MISSING_ENTRIES + VERIFY_STATUS_ERR_MISSING_ENTRIES, + VERIFY_STATUS_ERR_CORRUPT_HEADER, }; // Check that config settings are at least somewhat reasonable. @@ -308,7 +312,8 @@ class HistoryManager return firstLedgerOfBufferedCheckpoint + 1; } - // Return the length of the current publishing queue. + // Return the number of checkpoints currently present in the publish + // queue directory, i.e., checkpoints currently awaiting publication. static size_t publishQueueLength(Config const& cfg); // Emit a log message and set StatusManager HISTORY_PUBLISH status to @@ -320,15 +325,15 @@ class HistoryManager // a multiple of getCheckpointFrequency(). Returns true if checkpoint // publication of the LCL was queued, otherwise false. ledgerVers must align // with lcl. - virtual bool maybeQueueHistoryCheckpoint(uint32_t lcl, - uint32_t ledgerVers) = 0; + virtual bool + maybeQueueHistoryCheckpoint(CompleteConstLedgerStatePtr ledgerState) = 0; // Checkpoint the LCL -- both the log of history from the previous // checkpoint to it, as well as the bucketlist of its state -- to a // publication-queue in the database. This should be followed shortly - // (typically after commit) with a call to publishQueuedHistory. ledgerVers - // must align with lcl. - virtual void queueCurrentHistory(uint32_t lcl, uint32_t ledgerVers) = 0; + // (typically after commit) with a call to publishQueuedHistory. + virtual void + queueCurrentHistory(CompleteConstLedgerStatePtr ledgerState) = 0; // Return the youngest ledger still in the outgoing publish queue; // returns 0 if the publish queue has nothing in it. @@ -391,11 +396,6 @@ class HistoryManager // tmpdir. virtual std::string localFilename(std::string const& basename) = 0; - // Return the number of checkpoints that have been enqueued for - // publication. This may be less than the number "started", but every - // enqueued checkpoint should eventually start. - virtual uint64_t getPublishQueueCount() const = 0; - // Return the number of checkpoints that completed publication successfully. virtual uint64_t getPublishSuccessCount() const = 0; diff --git a/src/history/HistoryManagerImpl.cpp b/src/history/HistoryManagerImpl.cpp index 97e14bb174..11eb836cae 100644 --- a/src/history/HistoryManagerImpl.cpp +++ b/src/history/HistoryManagerImpl.cpp @@ -8,8 +8,6 @@ #include "util/asio.h" #include "bucket/BucketManager.h" -#include "bucket/LiveBucket.h" -#include "bucket/LiveBucketList.h" #include "herder/HerderImpl.h" #include #include @@ -24,8 +22,7 @@ #include "historywork/PutSnapshotFilesWork.h" #include "historywork/ResolveSnapshotWork.h" #include "historywork/WriteSnapshotWork.h" -#include "ledger/LedgerHeaderUtils.h" -#include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "main/Application.h" #include "main/Config.h" #include "medida/meter.h" @@ -286,9 +283,10 @@ HistoryManager::getMaxLedgerQueuedToPublish(Config const& cfg) } bool -HistoryManagerImpl::maybeQueueHistoryCheckpoint(uint32_t lcl, - uint32_t ledgerVers) +HistoryManagerImpl::maybeQueueHistoryCheckpoint( + CompleteConstLedgerStatePtr ledgerState) { + auto lcl = ledgerState->getLastClosedLedgerHeader().header.ledgerSeq; if (!publishCheckpointOnLedgerClose(lcl, mApp.getConfig())) { return false; @@ -309,49 +307,22 @@ HistoryManagerImpl::maybeQueueHistoryCheckpoint(uint32_t lcl, return false; } - queueCurrentHistory(lcl, ledgerVers); + queueCurrentHistory(std::move(ledgerState)); return true; } void -HistoryManagerImpl::queueCurrentHistory(uint32_t ledger, uint32_t ledgerVers) +HistoryManagerImpl::queueCurrentHistory(CompleteConstLedgerStatePtr ledgerState) { ZoneScoped; - // Only one thread can modify the bucketlist, access BL from the _same_ - // thread - LiveBucketList bl = mApp.getBucketManager().getLiveBucketList(); - - HistoryArchiveState has; - if (protocolVersionStartsFrom( - ledgerVers, - LiveBucket::FIRST_PROTOCOL_SUPPORTING_PERSISTENT_EVICTION)) - { - auto hotBl = mApp.getBucketManager().getHotArchiveBucketList(); - has = HistoryArchiveState(ledger, bl, hotBl, - mApp.getConfig().NETWORK_PASSPHRASE); - } - else - { - has = HistoryArchiveState(ledger, bl, - mApp.getConfig().NETWORK_PASSPHRASE); - } - - CLOG_INFO(History, "Queueing publish state for ledger {}", ledger); - mEnqueueTimes.emplace(ledger, std::chrono::steady_clock::now()); + auto const& has = ledgerState->getLastClosedHistoryArchiveState(); + CLOG_INFO(History, "Queueing publish state for ledger {}", + has.currentLedger); + mEnqueueTimes.emplace(has.currentLedger, std::chrono::steady_clock::now()); // We queue history inside ledger commit, so do not finalize the file yet writeCheckpointFile(mApp, has, /* finalize */ false); - - // We have now written the current HAS to the database, so - // it's "safe" to crash (at least after the enclosing tx commits); - // but that HAS might have merges running and if we throw it - // away at this point we'll lose the merges and have to restart - // them. So instead we're going to insert the HAS we have in hand - // into the in-memory publish queue in order to preserve those - // merges-in-progress, avoid restarting them. - - mPublishQueued++; } void @@ -695,12 +666,6 @@ HistoryManagerImpl::restoreCheckpoint(uint32_t lcl) } } -uint64_t -HistoryManagerImpl::getPublishQueueCount() const -{ - return mPublishQueued; -} - uint64_t HistoryManagerImpl::getPublishSuccessCount() const { diff --git a/src/history/HistoryManagerImpl.h b/src/history/HistoryManagerImpl.h index db3253cd70..2a1a0ec506 100644 --- a/src/history/HistoryManagerImpl.h +++ b/src/history/HistoryManagerImpl.h @@ -28,7 +28,6 @@ class HistoryManagerImpl : public HistoryManager std::unique_ptr mWorkDir; std::shared_ptr mPublishWork; - std::atomic mPublishQueued{0}; medida::Meter& mPublishSuccess; medida::Meter& mPublishFailure; @@ -46,10 +45,10 @@ class HistoryManagerImpl : public HistoryManager void logAndUpdatePublishStatus() override; - bool maybeQueueHistoryCheckpoint(uint32_t lcl, - uint32_t ledgerVers) override; + bool maybeQueueHistoryCheckpoint( + CompleteConstLedgerStatePtr ledgerState) override; - void queueCurrentHistory(uint32_t lcl, uint32_t ledgerVers) override; + void queueCurrentHistory(CompleteConstLedgerStatePtr ledgerState) override; void takeSnapshotAndPublish(HistoryArchiveState const& has); @@ -74,7 +73,6 @@ class HistoryManagerImpl : public HistoryManager std::string localFilename(std::string const& basename) override; - uint64_t getPublishQueueCount() const override; uint64_t getPublishSuccessCount() const override; uint64_t getPublishFailureCount() const override; diff --git a/src/history/test/HistoryTests.cpp b/src/history/test/HistoryTests.cpp index 888be8bfe6..0e811557f4 100644 --- a/src/history/test/HistoryTests.cpp +++ b/src/history/test/HistoryTests.cpp @@ -4,6 +4,7 @@ #include "bucket/BucketManager.h" #include "bucket/test/BucketTestUtils.h" +#include "catchup/DownloadApplyTxsWork.h" #include "catchup/LedgerApplyManagerImpl.h" #include "catchup/test/CatchupWorkTests.h" #include "herder/HerderPersistence.h" @@ -16,9 +17,7 @@ #include "historywork/GunzipFileWork.h" #include "historywork/GzipFileWork.h" #include "historywork/PutHistoryArchiveStateWork.h" -#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" -#include "main/Maintainer.h" #include "main/PersistentState.h" #include "process/ProcessManager.h" #include "test/TestAccount.h" @@ -338,6 +337,72 @@ TEST_CASE("History bucket verification", "[history][catchup]") REQUIRE(verify->getState() == BasicWork::State::WORK_SUCCESS); } } + SECTION("truncated file") + { + SECTION("live buckets") + { + liveHashes.push_back(bucketGenerator.generateBucket( + TestBucketState::TRUNCATED_FILE)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + + SECTION("hot archive buckets") + { + hotHashes.push_back( + bucketGenerator.generateBucket( + TestBucketState::TRUNCATED_FILE)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + + SECTION("both live and hot archive buckets") + { + liveHashes.push_back(bucketGenerator.generateBucket( + TestBucketState::TRUNCATED_FILE)); + hotHashes.push_back( + bucketGenerator.generateBucket( + TestBucketState::TRUNCATED_FILE)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + } + SECTION("invalid enum variant") + { + SECTION("live buckets") + { + liveHashes.push_back(bucketGenerator.generateBucket( + TestBucketState::INVALID_ENUM)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + + SECTION("hot archive buckets") + { + hotHashes.push_back( + bucketGenerator.generateBucket( + TestBucketState::INVALID_ENUM)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + + SECTION("both live and hot archive buckets") + { + liveHashes.push_back(bucketGenerator.generateBucket( + TestBucketState::INVALID_ENUM)); + hotHashes.push_back( + bucketGenerator.generateBucket( + TestBucketState::INVALID_ENUM)); + auto verify = wm.executeWork( + buckets, hotBuckets, liveHashes, hotHashes, *tmpDir); + REQUIRE(verify->getState() == BasicWork::State::WORK_FAILURE); + } + } } TEST_CASE("Ledger chain verification", "[ledgerheaderverification]") @@ -403,6 +468,22 @@ TEST_CASE("Ledger chain verification", "[ledgerheaderverification]") checkExpectedBehavior(BasicWork::State::WORK_SUCCESS, lcl, last); REQUIRE(!w); } + SECTION("truncated XDR") + { + std::tie(lcl, last) = ledgerChainGenerator.makeLedgerChainFiles( + TestLedgerChainGenerator::XDRErrors::TRUNCATED); + auto w = + checkExpectedBehavior(BasicWork::State::WORK_FAILURE, lcl, last); + REQUIRE(!w); + } + SECTION("invalid XDR enum variant") + { + std::tie(lcl, last) = ledgerChainGenerator.makeLedgerChainFiles( + TestLedgerChainGenerator::XDRErrors::INVALID_ENUM); + auto w = + checkExpectedBehavior(BasicWork::State::WORK_FAILURE, lcl, last); + REQUIRE(!w); + } SECTION("invalid link due to bad hash") { std::tie(lcl, last) = ledgerChainGenerator.makeLedgerChainFiles( @@ -514,6 +595,265 @@ TEST_CASE("Ledger chain verification", "[ledgerheaderverification]") } } +// Hack to access private members of DownloadApplyTxsWork and BasicWork for +// testing purposes. From +// https://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html +namespace +{ +template struct Rob +{ + friend typename Tag::type + get(Tag) + { + return M; + } +}; + +// tag used to access BasicWork::mRetries +struct BasicWork_mRetries +{ + typedef size_t BasicWork::* type; + friend type get(BasicWork_mRetries); +}; + +template struct Rob; +} // namespace + +TEST_CASE("DownloadApplyTxsWork handles apply failure", "[history][catchup]") +{ + // Three archives: A with truncated transaction file (invalid XDR), B with + // truncated transaction file (subset of transactions), and C with correct + // transaction file. Helper to configure an archive in a Config + auto configureArchive = [](Config& cfg, std::string const& name, + std::string const& dir) { + std::string getCmd = "cp " + dir + "/{0} {1}"; + cfg.HISTORY[name] = HistoryArchiveConfiguration{name, getCmd}; + }; + + // Helper to create a test config with matching genesis settings + auto makeTestConfig = []() { + // We use 1 as the instance since 0 is taken by the catchup simulation + Config cfg = getTestConfig(1, Config::TESTDB_BUCKET_DB_PERSISTENT); + cfg.OVERRIDE_EVICTION_PARAMS_FOR_TESTING = true; + cfg.TESTING_MINIMUM_PERSISTENT_ENTRY_LIFETIME = 10; + cfg.TESTING_STARTING_EVICTION_SCAN_LEVEL = 1; + cfg.TESTING_EVICTION_SCAN_SIZE = 100'000; + cfg.TESTING_MAX_ENTRIES_TO_ARCHIVE = 1; + cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE = true; + cfg.HISTORY.clear(); + return cfg; + }; + + // Set up simulation with two archives and truncate archive A and B's tx + // file + auto multiCfg = + std::make_shared(/*numArchives=*/3); + auto const& configurators = multiCfg->getConfigurators(); + std::string archiveADir = configurators[0]->getArchiveDirName(); + std::string archiveBDir = configurators[1]->getArchiveDirName(); + std::string archiveCDir = configurators[2]->getArchiveDirName(); + + CatchupSimulation simulation(VirtualClock::VIRTUAL_TIME, multiCfg, false); + auto& simApp = simulation.getApp(); + for (auto const& cfgtor : configurators) + { + CHECK(simApp.getHistoryArchiveManager().initializeHistoryArchive( + cfgtor->getArchiveDirName())); + } + simApp.start(); + + auto checkpointLedger = simulation.getLastCheckpointLedger(1); + simulation.ensureOfflineCatchupPossible(checkpointLedger); + + // Truncate transaction file in archive A + FileTransferInfo txFileInfo(FileType::HISTORY_FILE_TYPE_TRANSACTIONS, + checkpointLedger, simApp.getConfig()); + std::string truncatedPath = archiveADir + "/" + txFileInfo.remoteName(); + fs::checkGzipSuffix(truncatedPath); + auto nonGzPath = truncatedPath.substr(0, truncatedPath.size() - 3); + { + std::ofstream out(nonGzPath, + std::ios::out | std::ios::binary | std::ios::trunc); + out.exceptions(std::ios::failbit | std::ios::badbit); + uint8_t buf[4] = {0xff, 0xff, 0xff, 0xff}; + out.write(reinterpret_cast(buf), 4); + } + auto& wm = simApp.getWorkScheduler(); + // re-gzip the truncated file + REQUIRE(wm.executeWork(nonGzPath)->getState() == + BasicWork::State::WORK_SUCCESS); + + // Truncate transaction file in archive B + truncatedPath = archiveBDir + "/" + txFileInfo.remoteName(); + fs::checkGzipSuffix(truncatedPath); + uint32_t lastLedgerSeqB; + { + nonGzPath = truncatedPath.substr(0, truncatedPath.size() - 3); + REQUIRE(wm.executeWork(truncatedPath)->getState() == + BasicWork::State::WORK_SUCCESS); + + XDRInputFileStream in; + in.open(nonGzPath); + std::vector txs; + TransactionHistoryEntry tx; + while (in && in.readOne(tx)) + { + txs.push_back(tx); + } + REQUIRE(txs.size() >= 2); + in.close(); + REQUIRE(std::filesystem::remove(nonGzPath)); + + XDROutputFileStream out(simApp.getClock().getIOContext(), true); + out.open(nonGzPath); + // Write only half the transactions to create a truncated file + for (size_t i = 0; i < txs.size() / 2; ++i) + { + out.writeOne(txs[i]); + } + lastLedgerSeqB = txs[txs.size() / 2].ledgerSeq; + out.close(); + REQUIRE(wm.executeWork(nonGzPath)->getState() == + BasicWork::State::WORK_SUCCESS); + } + + // Helper to run DownloadApplyTxsWork + auto runDownloadApplyTxs = [&](Application& app, uint32_t targetLedger, + std::shared_ptr archive = + nullptr) { + auto& wm = app.getWorkScheduler(); + auto tmpDir = app.getTmpDirManager().tmpDir("download-apply-test"); + + LedgerRange range = LedgerRange::inclusive( + LedgerManager::GENESIS_LEDGER_SEQ + 1, targetLedger); + CheckpointRange checkpointRange{range, app.getHistoryManager()}; + + auto downloadHeaders = wm.executeWork( + checkpointRange, FileType::HISTORY_FILE_TYPE_LEDGER, tmpDir); + REQUIRE(downloadHeaders->getState() == BasicWork::State::WORK_SUCCESS); + + auto lastApplied = app.getLedgerManager().getLastClosedLedgerHeader(); + auto work = wm.executeWork( + tmpDir, range, lastApplied, /*waitForPublish=*/true, archive); + return work; + }; + + // truncated file fails with only archive A + { + auto cfg = makeTestConfig(); + configureArchive(cfg, "archiveA", archiveADir); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + app->start(); + + CHECK(runDownloadApplyTxs(*app, checkpointLedger)->getState() == + BasicWork::State::WORK_FAILURE); + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + LedgerManager::GENESIS_LEDGER_SEQ); + } + + // truncated file fails with only archive B + { + auto cfg = makeTestConfig(); + configureArchive(cfg, "archiveB", archiveBDir); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + app->start(); + + CHECK(runDownloadApplyTxs(*app, checkpointLedger)->getState() == + BasicWork::State::WORK_FAILURE); + // Subtract 1 because the replay txset hash differs from txset hash in + // the last replay ledger + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + lastLedgerSeqB - 1); + } + + // Check that archive C succeeds + { + auto cfg = makeTestConfig(); + configureArchive(cfg, "archiveC", archiveCDir); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + app->start(); + + CHECK(runDownloadApplyTxs(*app, checkpointLedger)->getState() == + BasicWork::State::WORK_SUCCESS); + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + checkpointLedger); + } + + // We successfully catchup when using, in order, archive A, archive B, + // archive C + { + auto cfg = makeTestConfig(); + configureArchive(cfg, "archiveA", archiveADir); + configureArchive(cfg, "archiveB", archiveBDir); + configureArchive(cfg, "archiveC", archiveCDir); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + app->start(); + auto const& ham = app->getHistoryArchiveManager(); + auto archiveA = ham.getHistoryArchive("archiveA"); + auto archiveB = ham.getHistoryArchive("archiveB"); + auto archiveC = ham.getHistoryArchive("archiveC"); + + CHECK( + runDownloadApplyTxs(*app, checkpointLedger, archiveA)->getState() == + BasicWork::State::WORK_FAILURE); + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + LedgerManager::GENESIS_LEDGER_SEQ); + CHECK( + runDownloadApplyTxs(*app, checkpointLedger, archiveB)->getState() == + BasicWork::State::WORK_FAILURE); + // Subtract 1 because the replay txset hash differs from txset hash in + // the last replay ledger + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + lastLedgerSeqB - 1); + CHECK( + runDownloadApplyTxs(*app, checkpointLedger, archiveC)->getState() == + BasicWork::State::WORK_SUCCESS); + CHECK(app->getLedgerManager().getLastClosedLedgerNum() == + checkpointLedger); + } + + auto checkRetryLogic = [&](std::string const& badArchiveDir) { + auto cfg = makeTestConfig(); + // We use a few more badArchiveDir in the hope that we're more likely to + // pick it as the first archive, but not so many that we run out of + // retries before picking archive C + configureArchive(cfg, "archive1", badArchiveDir); + configureArchive(cfg, "archive2", badArchiveDir); + configureArchive(cfg, "archive3", archiveCDir); + + for (int i = 0; i < 10; ++i) + { + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + app->start(); + auto work = runDownloadApplyTxs(*app, checkpointLedger); + if (work->getState() == BasicWork::State::WORK_SUCCESS) + { + if ((*work).*get(BasicWork_mRetries{}) > 0) + { + // We succeeded and had to retry at least once, so the retry + // logic works + return true; + } + } + } + return false; + }; + + CHECK(checkRetryLogic(archiveADir)); + CHECK(checkRetryLogic(archiveBDir)); + // archiveC is good, so we should never retry + CHECK(!checkRetryLogic(archiveCDir)); +} + TEST_CASE("Tx results verification", "[batching][resultsverification]") { CatchupSimulation catchupSimulation{}; @@ -1597,7 +1937,7 @@ TEST_CASE_VERSIONS( auto& lm = app->getLedgerManager(); auto& bl = app->getBucketManager().getLiveBucketList(); - while (hm.getPublishQueueCount() != 1) + while (hm.publishQueueLength(cfg) != 1) { // With background apply, wait for any in-progress // ledger close to finish before writing to the shared @@ -1665,7 +2005,7 @@ TEST_CASE("persist publish queue", "[history][publish][acceptance]") VirtualClock clock; Application::pointer app0 = createTestApplication(clock, cfg); auto& hm0 = app0->getHistoryManager(); - while (hm0.getPublishQueueCount() < 5) + while (hm0.publishQueueLength(cfg) < 5) { clock.crank(true); } @@ -1674,9 +2014,6 @@ TEST_CASE("persist publish queue", "[history][publish][acceptance]") REQUIRE(hm0.getPublishSuccessCount() == 0); REQUIRE(HistoryManager::getMinLedgerQueuedToPublish(hm0.getConfig()) == 7); - - // Trim history after publishing. - app0->getMaintainer().performMaintenance(50000); } cfg.MAX_CONCURRENT_SUBPROCESSES = 32; @@ -1693,9 +2030,6 @@ TEST_CASE("persist publish queue", "[history][publish][acceptance]") while (hm1.getPublishSuccessCount() < 5) { clock.crank(true); - - // Trim history after publishing whenever possible. - app1->getMaintainer().performMaintenance(50000); } // Verify old history got trimmed diff --git a/src/history/test/HistoryTestsUtils.cpp b/src/history/test/HistoryTestsUtils.cpp index 219c3fbebc..c596b0e2ea 100644 --- a/src/history/test/HistoryTestsUtils.cpp +++ b/src/history/test/HistoryTestsUtils.cpp @@ -214,12 +214,35 @@ TestBucketGenerator::generateBucket(TestBucketState state) // Skip uploading the file, return any hash return binToHex(hash); } - MergeCounters mc; - BucketOutputIteratorForTesting bucketOut{ - mTmpDir->getName(), mApp.getConfig().LEDGER_PROTOCOL_VERSION, mc, - mApp.getClock().getIOContext()}; std::string filename; - std::tie(filename, hash) = bucketOut.writeTmpTestBucket(); + if (state == TestBucketState::TRUNCATED_FILE) + { + filename = BucketT::randomBucketName(mTmpDir->getName()); + std::ofstream out; + out.exceptions(std::ios::failbit | std::ios::badbit); + out.open(filename, std::ios::out | std::ios::binary); + uint8_t buf[4] = {0xff, 0xff, 0xff, 0xff}; + out.write(reinterpret_cast(buf), 4); + out.close(); + } + else if (state == TestBucketState::INVALID_ENUM) + { + filename = BucketT::randomBucketName(mTmpDir->getName()); + std::ofstream out; + out.exceptions(std::ios::failbit | std::ios::badbit); + out.open(filename, std::ios::out | std::ios::binary); + uint8_t buf[] = {0x80, 0x00, 0x00, 0x04, 0xff, 0x00, 0xcc, 0x00}; + out.write(reinterpret_cast(buf), sizeof(buf)); + out.close(); + } + else + { + MergeCounters mc; + BucketOutputIteratorForTesting bucketOut{ + mTmpDir->getName(), mApp.getConfig().LEDGER_PROTOCOL_VERSION, mc, + mApp.getClock().getIOContext()}; + std::tie(filename, hash) = bucketOut.writeTmpTestBucket(); + } if (state == TestBucketState::HASH_MISMATCH) { @@ -344,6 +367,60 @@ TestLedgerChainGenerator::makeLedgerChainFiles( return CheckpointEnds(beginRange, last); } +TestLedgerChainGenerator::CheckpointEnds +TestLedgerChainGenerator::makeLedgerChainFiles(XDRErrors error) +{ + Hash hash = HashUtils::pseudoRandomForTesting(); + LedgerHeaderHistoryEntry beginRange; + + LedgerHeaderHistoryEntry first, last; + for (auto i = mCheckpointRange.mFirst; i < mCheckpointRange.limit(); + i += HistoryManager::sizeOfCheckpointContaining(i, mApp.getConfig())) + { + std::tie(first, last) = + makeOneLedgerFile(i, hash, HistoryManager::VERIFY_STATUS_OK); + hash = last.hash; + + if (beginRange.header.ledgerSeq == 0) + { + beginRange = first; + } + + // Only corrupt first checkpoint (last to be verified) + if (i == mCheckpointRange.mFirst) + { + FileTransferInfo ft{mTmpDir, FileType::HISTORY_FILE_TYPE_LEDGER, i}; + XDROutputFileStream ledgerOut(mApp.getClock().getIOContext(), + /*doFsync=*/true); + ledgerOut.open(ft.localPath_nogz()); + if (error == XDRErrors::INVALID_ENUM) + { + LedgerHeaderHistoryEntry he; + std::vector buf; + uint32_t size = static_cast(xdr::xdr_size(he)); + buf.resize(size + 4); + buf[0] = static_cast((size >> 24) & 0xFF) | '\x80'; + buf[1] = static_cast((size >> 16) & 0xFF); + buf[2] = static_cast((size >> 8) & 0xFF); + buf[3] = static_cast(size & 0xFF); + xdr::xdr_put p(buf.data() + 4, buf.data() + 4 + size); + xdr_argpack_archive(p, he); + // Corrupt variant + buf[buf.size() - 3] = 0xff; + ledgerOut.writeBytes(buf.data(), buf.size()); + } + else + { + uint8_t buf[] = {0xff, 0xff, 0xff, 0xff}; + ledgerOut.writeBytes(reinterpret_cast(buf), sizeof(buf)); + } + ledgerOut.close(); + } + } + + return CheckpointEnds(beginRange, last); +} + CatchupPerformedWork::CatchupPerformedWork( LedgerApplyManager::CatchupMetrics const& metrics) : mHistoryArchiveStatesDownloaded{metrics.mHistoryArchiveStatesDownloaded} @@ -878,7 +955,7 @@ CatchupSimulation::catchupOffline(Application::pointer app, uint32_t toLedger, if (app->getHistoryArchiveManager().publishEnabled()) { auto& hm = app->getHistoryManager(); - REQUIRE(hm.getPublishQueueCount() - hm.getPublishSuccessCount() <= + REQUIRE(hm.publishQueueLength(app->getConfig()) <= CatchupWork::PUBLISH_QUEUE_MAX_SIZE); } } diff --git a/src/history/test/HistoryTestsUtils.h b/src/history/test/HistoryTestsUtils.h index eaef09cd0b..67f0cb6045 100644 --- a/src/history/test/HistoryTestsUtils.h +++ b/src/history/test/HistoryTestsUtils.h @@ -43,7 +43,9 @@ enum class TestBucketState CONTENTS_AND_HASH_OK, CORRUPTED_ZIPPED_FILE, FILE_NOT_UPLOADED, - HASH_MISMATCH + HASH_MISMATCH, + TRUNCATED_FILE, + INVALID_ENUM }; class HistoryConfigurator; @@ -153,6 +155,12 @@ class TestLedgerChainGenerator CheckpointEnds makeLedgerChainFiles(HistoryManager::LedgerVerificationStatus state = HistoryManager::VERIFY_STATUS_OK); + enum class XDRErrors + { + INVALID_ENUM, + TRUNCATED + }; + CheckpointEnds makeLedgerChainFiles(XDRErrors error); }; struct CatchupPerformedWork diff --git a/src/invariant/ArchivedStateConsistency.cpp b/src/invariant/ArchivedStateConsistency.cpp index 102988a1a7..79375e55a3 100644 --- a/src/invariant/ArchivedStateConsistency.cpp +++ b/src/invariant/ArchivedStateConsistency.cpp @@ -4,11 +4,9 @@ #include "invariant/ArchivedStateConsistency.h" #include "bucket/BucketListSnapshot.h" -#include "bucket/BucketSnapshotManager.h" -#include "bucket/HotArchiveBucket.h" #include "bucket/LedgerCmp.h" #include "invariant/InvariantManager.h" -#include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "main/Application.h" #include "transactions/TransactionUtils.h" @@ -40,8 +38,7 @@ ArchivedStateConsistency::getName() const std::string ArchivedStateConsistency::checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, @@ -51,14 +48,15 @@ ArchivedStateConsistency::checkOnLedgerCommit( LogSlowExecution::Mode::AUTOMATIC_RAII, "took", std::chrono::milliseconds(1)); + auto ledgerSeq = lclSnapshot.getLedgerSeq() + 1; + auto ledgerVers = lclSnapshot.getLedgerHeader().current().ledgerVersion; + if (protocolVersionIsBefore( - lclLiveState->getLedgerHeader().ledgerVersion, + ledgerVers, LiveBucket::FIRST_PROTOCOL_SUPPORTING_PERSISTENT_EVICTION)) { return std::string{}; } - auto ledgerSeq = lclLiveState->getLedgerSeq() + 1; - auto ledgerVers = lclLiveState->getLedgerHeader().ledgerVersion; // Collect all keys to preload LedgerKeySet allKeys; @@ -95,13 +93,13 @@ ArchivedStateConsistency::checkOnLedgerCommit( // Preload from both live and archived state UnorderedMap preloadedLiveEntries; auto preloadedLiveVector = - lclLiveState->loadKeys(allKeys, "ArchivedStateConsistency"); + lclSnapshot.loadLiveKeys(allKeys, "ArchivedStateConsistency"); for (auto const& entry : preloadedLiveVector) { preloadedLiveEntries[LedgerEntryKey(entry)] = entry; } - auto preloadedArchivedVector = lclHotArchiveState->loadKeys(allKeys); + auto preloadedArchivedVector = lclSnapshot.loadArchiveKeys(allKeys); UnorderedMap preloadedArchivedEntries; for (auto const& entry : preloadedArchivedVector) { @@ -428,7 +426,13 @@ ArchivedStateConsistency::checkRestoreInvariants( "in live state: {}"), xdrToCerealString(key, "key")); } - else if (liveEntry->second != entry) + // For non-TTL entries, `entry` (the restored value) should be + // identical to `liveEntry->second` (the value on the live BucketList) + // since data/code entries are not modified during a restore. TTL + // entries are excluded from this check because restoration updates the + // TTL's liveUntilLedgerSeq, so the restored value will differ from the + // on-disk value. + else if (key.type() != TTL && liveEntry->second != entry) { return fmt::format( FMT_STRING("ArchivedStateConsistency invariant failed: " @@ -438,14 +442,28 @@ ArchivedStateConsistency::checkRestoreInvariants( xdrToCerealString(entry, "entry_to_restore")); } - if (key.type() == TTL && isLive(entry, ledgerSeq)) + if (key.type() == TTL) { - return fmt::format( - FMT_STRING("ArchivedStateConsistency invariant failed: " - "Restored entry from live BucketList is not " - "expired: Entry: {}, TTL Entry: {}"), - xdrToCerealString(entry, "entry"), - xdrToCerealString(entry, "ttl_entry")); + // `entry` is the TTL after restoration (with updated + // liveUntilLedgerSeq). `liveEntry->second` is the original + // on-disk TTL before restoration. We check that the restored + // TTL is now live and the original was expired. + if (!isLive(entry, ledgerSeq)) + { + return fmt::format( + FMT_STRING("ArchivedStateConsistency invariant failed: " + "Restored entry's updated TTL is still " + "expired: TTL Entry: {}"), + xdrToCerealString(entry, "ttl_entry")); + } + if (isLive(liveEntry->second, ledgerSeq)) + { + return fmt::format( + FMT_STRING("ArchivedStateConsistency invariant failed: " + "Restored entry from live BucketList is not " + "expired: TTL Entry: {}"), + xdrToCerealString(liveEntry->second, "ttl_entry")); + } } } diff --git a/src/invariant/ArchivedStateConsistency.h b/src/invariant/ArchivedStateConsistency.h index 9d0e622794..795c2d90be 100644 --- a/src/invariant/ArchivedStateConsistency.h +++ b/src/invariant/ArchivedStateConsistency.h @@ -34,8 +34,7 @@ class ArchivedStateConsistency : public Invariant virtual std::string getName() const override; virtual std::string checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, diff --git a/src/invariant/BucketListStateConsistency.cpp b/src/invariant/BucketListStateConsistency.cpp index 30dd33ec54..65978b6710 100644 --- a/src/invariant/BucketListStateConsistency.cpp +++ b/src/invariant/BucketListStateConsistency.cpp @@ -8,6 +8,7 @@ #include "invariant/Invariant.h" #include "invariant/InvariantManager.h" #include "ledger/InMemorySorobanState.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/NetworkConfig.h" #include "main/Application.h" @@ -35,15 +36,14 @@ BucketListStateConsistency::BucketListStateConsistency() : Invariant(true) // 7. The cached total entry sizes match the sum of actual entry sizes std::string BucketListStateConsistency::checkSnapshot( - SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) { LogSlowExecution logSlow("BucketListStateConsistency::checkSnapshot", LogSlowExecution::Mode::AUTOMATIC_RAII, "took", std::chrono::minutes(2)); - auto const& header = liveSnapshot->getLedgerHeader(); + auto const& header = snapshot.getLedgerHeader().current(); if (protocolVersionIsBefore(header.ledgerVersion, SOROBAN_PROTOCOL_VERSION)) { @@ -66,13 +66,13 @@ BucketListStateConsistency::checkSnapshot( std::string errorMsg; // Property 7: Track total entry sizes for validation - auto sorobanConfig = SorobanNetworkConfig::loadFromLedger(liveSnapshot); + auto sorobanConfig = SorobanNetworkConfig::loadFromLedger(snapshot); uint64_t expectedSorobanSize = 0; auto checkLiveEntry = [&seenLiveNonTTLKeys, &seenDeadKeys, &errorMsg, - &inMemorySnapshot, &hotArchiveSnapshot, - checkHotArchive, &isStopping, &expectedSorobanSize, - &header, &sorobanConfig](BucketEntry const& be) { + &inMemorySnapshot, &snapshot, checkHotArchive, + &isStopping, &expectedSorobanSize, &header, + &sorobanConfig](BucketEntry const& be) { if (isStopping()) { return Loop::COMPLETE; @@ -116,7 +116,7 @@ BucketListStateConsistency::checkSnapshot( } // Check property 5: live entry should not exist in hot archive - if (checkHotArchive && hotArchiveSnapshot->load(lk)) + if (checkHotArchive && snapshot.loadArchiveEntry(lk)) { errorMsg = fmt::format( FMT_STRING("BucketListStateConsistency invariant failed: " @@ -158,7 +158,7 @@ BucketListStateConsistency::checkSnapshot( }; // First check contract data entries. - liveSnapshot->scanForEntriesOfType(CONTRACT_DATA, checkLiveEntry); + snapshot.scanLiveEntriesOfType(CONTRACT_DATA, checkLiveEntry); // Note: All BucketList scans will exit early if isStopping() is true or if // there is an error, so we need to call shouldAbortInvariantScan after each @@ -175,7 +175,7 @@ BucketListStateConsistency::checkSnapshot( // keys since we will need them when checking TTL entries. seenDeadKeys.clear(); - liveSnapshot->scanForEntriesOfType(CONTRACT_CODE, checkLiveEntry); + snapshot.scanLiveEntriesOfType(CONTRACT_CODE, checkLiveEntry); if (shouldAbortInvariantScan(errorMsg, isStopping)) { return errorMsg; @@ -304,7 +304,7 @@ BucketListStateConsistency::checkSnapshot( }; seenDeadKeys.clear(); - liveSnapshot->scanForEntriesOfType(TTL, checkTTLEntry); + snapshot.scanLiveEntriesOfType(TTL, checkTTLEntry); if (shouldAbortInvariantScan(errorMsg, isStopping)) { return errorMsg; @@ -376,7 +376,7 @@ BucketListStateConsistency::checkSnapshot( return Loop::INCOMPLETE; }; - hotArchiveSnapshot->scanAllEntries(checkHotArchiveEntry); + snapshot.scanAllArchiveEntries(checkHotArchiveEntry); if (shouldAbortInvariantScan(errorMsg, isStopping)) { return errorMsg; diff --git a/src/invariant/BucketListStateConsistency.h b/src/invariant/BucketListStateConsistency.h index 6c555fe092..e8595470e1 100644 --- a/src/invariant/BucketListStateConsistency.h +++ b/src/invariant/BucketListStateConsistency.h @@ -19,8 +19,7 @@ class BucketListStateConsistency : public Invariant virtual std::string getName() const override; virtual std::string - checkSnapshot(SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + checkSnapshot(ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) override; }; diff --git a/src/invariant/ConservationOfLumens.cpp b/src/invariant/ConservationOfLumens.cpp index 535a4532fb..2df5c01ed5 100644 --- a/src/invariant/ConservationOfLumens.cpp +++ b/src/invariant/ConservationOfLumens.cpp @@ -6,6 +6,7 @@ #include "invariant/Invariant.h" #include "invariant/InvariantManager.h" #include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "main/Application.h" #include "transactions/TransactionUtils.h" @@ -222,11 +223,9 @@ processEntryIfNew(LedgerEntry const& entry, LedgerKey const& key, // Scan live bucket list for entries that can hold the native asset static void -scanLiveBuckets( - std::shared_ptr const& liveSnapshot, - Asset const& asset, AssetContractInfo const& assetContractInfo, - int64_t& sumBalance, std::string& errorMsg, - std::function const& isStopping) +scanLiveBuckets(ApplyLedgerStateSnapshot const& snapshot, Asset const& asset, + AssetContractInfo const& assetContractInfo, int64_t& sumBalance, + std::string& errorMsg, std::function const& isStopping) { // Scan all entry types that can hold the native asset for (auto let : xdr::xdr_traits::enum_values()) @@ -239,7 +238,7 @@ scanLiveBuckets( std::unordered_set countedKeys; - liveSnapshot->scanForEntriesOfType( + snapshot.scanLiveEntriesOfType( type, [&](BucketEntry const& be) -> Loop { if (isStopping()) { @@ -271,15 +270,14 @@ scanLiveBuckets( } static void -scanHotArchiveBuckets( - std::shared_ptr const& - hotArchiveSnapshot, - Asset const& asset, AssetContractInfo const& assetContractInfo, - int64_t& sumBalance, std::string& errorMsg, - std::function const& isStopping) +scanHotArchiveBuckets(ApplyLedgerStateSnapshot const& snapshot, + Asset const& asset, + AssetContractInfo const& assetContractInfo, + int64_t& sumBalance, std::string& errorMsg, + std::function const& isStopping) { std::unordered_set countedKeys; - hotArchiveSnapshot->scanAllEntries([&](HotArchiveBucketEntry const& be) { + snapshot.scanAllArchiveEntries([&](HotArchiveBucketEntry const& be) { if (isStopping()) { return Loop::COMPLETE; @@ -312,8 +310,7 @@ scanHotArchiveBuckets( std::string ConservationOfLumens::checkSnapshot( - SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) { @@ -321,7 +318,7 @@ ConservationOfLumens::checkSnapshot( LogSlowExecution::Mode::AUTOMATIC_RAII, "took", std::chrono::seconds(90)); - auto const& header = liveSnapshot->getLedgerHeader(); + auto const& header = snapshot.getLedgerHeader().current(); // This invariant can fail prior to v24 due to bugs if (protocolVersionIsBefore(header.ledgerVersion, ProtocolVersion::V_24)) @@ -346,7 +343,7 @@ ConservationOfLumens::checkSnapshot( // Scan the Live BucketList for native balances using loopAllBuckets - scanLiveBuckets(liveSnapshot, nativeAsset, mLumenContractInfo, sumBalance, + scanLiveBuckets(snapshot, nativeAsset, mLumenContractInfo, sumBalance, errorMsg, isStopping); if (shouldAbortInvariantScan(errorMsg, isStopping)) @@ -355,8 +352,8 @@ ConservationOfLumens::checkSnapshot( } // Scan the Hot Archive for native balances - scanHotArchiveBuckets(hotArchiveSnapshot, nativeAsset, mLumenContractInfo, - sumBalance, errorMsg, isStopping); + scanHotArchiveBuckets(snapshot, nativeAsset, mLumenContractInfo, sumBalance, + errorMsg, isStopping); if (shouldAbortInvariantScan(errorMsg, isStopping)) { diff --git a/src/invariant/ConservationOfLumens.h b/src/invariant/ConservationOfLumens.h index 66bd4685e1..a58150f798 100644 --- a/src/invariant/ConservationOfLumens.h +++ b/src/invariant/ConservationOfLumens.h @@ -34,8 +34,7 @@ class ConservationOfLumens : public Invariant std::vector const& events, AppConnector& app) override; virtual std::string - checkSnapshot(SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + checkSnapshot(ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) override; diff --git a/src/invariant/Invariant.h b/src/invariant/Invariant.h index 14a1ef0daa..3ad52bda9a 100644 --- a/src/invariant/Invariant.h +++ b/src/invariant/Invariant.h @@ -4,7 +4,6 @@ #pragma once -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "ledger/LedgerStateSnapshot.h" #include "xdr/Stellar-ledger.h" @@ -74,8 +73,7 @@ class Invariant virtual std::string checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, @@ -85,8 +83,7 @@ class Invariant } virtual std::string - checkSnapshot(SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + checkSnapshot(ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) { diff --git a/src/invariant/InvariantManager.h b/src/invariant/InvariantManager.h index c19c1bc707..b6f96152cc 100644 --- a/src/invariant/InvariantManager.h +++ b/src/invariant/InvariantManager.h @@ -16,6 +16,8 @@ class Application; class Bucket; class Invariant; class LedgerManager; +class LedgerStateSnapshot; +class ApplyLedgerStateSnapshot; struct EvictedStateVectors; struct LedgerTxnDelta; struct Operation; @@ -54,8 +56,7 @@ class InvariantManager AppConnector& app) = 0; virtual void checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, @@ -66,11 +67,10 @@ class InvariantManager // The invariant will periodically run on a background thread against the // given ledger state snapshot. These invariants will only run if // INVARIANT_EXTRA_CHECKS is enabled. - virtual void runStateSnapshotInvariant( - SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, - InMemorySorobanState const& inMemorySnapshot, - std::function isStopping) = 0; + virtual void + runStateSnapshotInvariant(ApplyLedgerStateSnapshot const& snapshot, + InMemorySorobanState const& inMemorySnapshot, + std::function isStopping) = 0; virtual void registerInvariant(std::shared_ptr invariant) = 0; diff --git a/src/invariant/InvariantManagerImpl.cpp b/src/invariant/InvariantManagerImpl.cpp index 41f397c7ff..a3bf676644 100644 --- a/src/invariant/InvariantManagerImpl.cpp +++ b/src/invariant/InvariantManagerImpl.cpp @@ -4,7 +4,6 @@ #include "invariant/InvariantManagerImpl.h" #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "bucket/LedgerCmp.h" #include "bucket/LiveBucket.h" @@ -15,6 +14,7 @@ #include "invariant/InvariantManagerImpl.h" #include "ledger/InMemorySorobanState.h" #include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "lib/util/finally.h" #include "main/Application.h" @@ -26,9 +26,7 @@ #include "util/MetricsRegistry.h" #include "util/ProtocolVersion.h" #include "util/XDRCereal.h" -#include #include -#include #include #include @@ -174,8 +172,7 @@ InvariantManagerImpl::checkOnOperationApply( void InvariantManagerImpl::checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, @@ -184,9 +181,8 @@ InvariantManagerImpl::checkOnLedgerCommit( for (auto invariant : mEnabled) { auto result = invariant->checkOnLedgerCommit( - lclLiveState, lclHotArchiveState, persitentEvictedFromLive, - tempAndTTLEvictedFromLive, restoredFromArchive, - restoredFromLiveState); + lclSnapshot, persitentEvictedFromLive, tempAndTTLEvictedFromLive, + restoredFromArchive, restoredFromLiveState); if (result.empty()) { continue; @@ -195,8 +191,7 @@ InvariantManagerImpl::checkOnLedgerCommit( auto message = fmt::format( FMT_STRING(R"(Invariant "{}" does not hold on ledger commit: {})"), invariant->getName(), result); - onInvariantFailure(invariant, message, - lclLiveState->getLedgerSeq() + 1); + onInvariantFailure(invariant, message, lclSnapshot.getLedgerSeq() + 1); } } @@ -333,8 +328,7 @@ InvariantManagerImpl::handleInvariantFailure(bool isStrict, // required state, then call this function in a background thread. void InvariantManagerImpl::runStateSnapshotInvariant( - SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, + ApplyLedgerStateSnapshot const& snapshot, InMemorySorobanState const& inMemorySnapshot, std::function isStopping) { @@ -346,12 +340,11 @@ InvariantManagerImpl::runStateSnapshotInvariant( { for (auto const& invariant : mEnabled) { - auto result = invariant->checkSnapshot( - liveSnapshot, hotArchiveSnapshot, inMemorySnapshot, isStopping); + auto result = invariant->checkSnapshot(snapshot, inMemorySnapshot, + isStopping); if (!result.empty()) { - auto ledgerSeq = liveSnapshot->getLedgerSeq(); - onInvariantFailure(invariant, result, ledgerSeq); + onInvariantFailure(invariant, result, snapshot.getLedgerSeq()); } } } diff --git a/src/invariant/InvariantManagerImpl.h b/src/invariant/InvariantManagerImpl.h index 55d9bd7e18..32d1272361 100644 --- a/src/invariant/InvariantManagerImpl.h +++ b/src/invariant/InvariantManagerImpl.h @@ -17,7 +17,6 @@ class Counter; namespace stellar { -class MetricsRegistry; class InvariantManagerImpl : public InvariantManager { @@ -37,7 +36,7 @@ class InvariantManagerImpl : public InvariantManager std::string lastFailedWithMessage; }; - Mutex mutable mFailureInformationMutex; + ANNOTATED_MUTEX(mFailureInformationMutex); std::map mFailureInformation GUARDED_BY(mFailureInformationMutex); @@ -62,8 +61,7 @@ class InvariantManagerImpl : public InvariantManager std::unordered_set const& shadowedKeys) override; virtual void checkOnLedgerCommit( - SearchableSnapshotConstPtr lclLiveState, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveState, + ApplyLedgerStateSnapshot const& lclSnapshot, std::vector const& persitentEvictedFromLive, std::vector const& tempAndTTLEvictedFromLive, UnorderedMap const& restoredFromArchive, @@ -82,11 +80,9 @@ class InvariantManagerImpl : public InvariantManager bool shouldRunInvariantSnapshot() const override; void markStartOfInvariantSnapshot() override; - void runStateSnapshotInvariant( - SearchableSnapshotConstPtr liveSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, - InMemorySorobanState const& inMemorySnapshot, - std::function isStopping) override; + void runStateSnapshotInvariant(ApplyLedgerStateSnapshot const& snapshot, + InMemorySorobanState const& inMemorySnapshot, + std::function isStopping) override; #ifdef BUILD_TESTS void snapshotForFuzzer() override; diff --git a/src/invariant/test/ConservationOfLumensTests.cpp b/src/invariant/test/ConservationOfLumensTests.cpp index b1cf3fb84c..5edfcef625 100644 --- a/src/invariant/test/ConservationOfLumensTests.cpp +++ b/src/invariant/test/ConservationOfLumensTests.cpp @@ -7,6 +7,7 @@ #include "invariant/InvariantDoesNotHold.h" #include "invariant/InvariantManager.h" #include "invariant/test/InvariantTestUtils.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnHeader.h" #include "ledger/test/LedgerTestUtils.h" @@ -19,7 +20,6 @@ #include "transactions/test/SorobanTxTestUtils.h" #include "util/Math.h" #include -#include #include using namespace stellar; @@ -337,15 +337,12 @@ TEST_CASE( // Verify the snapshot invariant passes { - auto ledgerState = - app.getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app.getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app.getLedgerManager().getInMemorySorobanStateForTesting(); REQUIRE_NOTHROW(app.getInvariantManager().runStateSnapshotInvariant( - ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), inMemoryState, - []() { return false; })); + snap, inMemoryState, []() { return false; })); } // Now, manually modify totalCoins to be inconsistent. The invariant should @@ -359,18 +356,15 @@ TEST_CASE( closeLedger(test.getApp()); - auto ledgerState = - app.getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app.getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app.getLedgerManager().getInMemorySorobanStateForTesting(); Asset native(ASSET_TYPE_NATIVE); auto lumenInfo = getAssetContractInfo(native, app.getNetworkID()); ConservationOfLumens invariant(lumenInfo); - auto result = - invariant.checkSnapshot(ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), - inMemoryState, []() { return false; }); + auto result = invariant.checkSnapshot(snap, inMemoryState, + []() { return false; }); REQUIRE_FALSE(result.empty()); REQUIRE(result.find("Total native asset supply mismatch") != std::string::npos); @@ -430,15 +424,12 @@ TEST_CASE("ConservationOfLumens snapshot invariant detects bucket corruption", app->getInvariantManager().enableInvariant("ConservationOfLumens"); - auto ledgerState = - app->getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app->getLedgerManager().getInMemorySorobanStateForTesting(); REQUIRE_NOTHROW(app->getInvariantManager().runStateSnapshotInvariant( - ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), inMemoryState, - []() { return false; })); + snap, inMemoryState, []() { return false; })); } SECTION("Invariant fails when bucket balance doesn't match totalCoins") @@ -466,18 +457,15 @@ TEST_CASE("ConservationOfLumens snapshot invariant detects bucket corruption", BucketTestUtils::closeLedger(*app); - auto ledgerState = - app->getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app->getLedgerManager().getInMemorySorobanStateForTesting(); Asset native(ASSET_TYPE_NATIVE); auto lumenInfo = getAssetContractInfo(native, app->getNetworkID()); ConservationOfLumens invariant(lumenInfo); - auto result = - invariant.checkSnapshot(ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), - inMemoryState, []() { return false; }); + auto result = invariant.checkSnapshot(snap, inMemoryState, + []() { return false; }); REQUIRE_FALSE(result.empty()); REQUIRE(result.find("Total native asset supply mismatch") != std::string::npos); @@ -529,15 +517,12 @@ TEST_CASE("ConservationOfLumens snapshot invariant detects bucket corruption", app->getInvariantManager().enableInvariant("ConservationOfLumens"); - auto ledgerState = - app->getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app->getLedgerManager().getInMemorySorobanStateForTesting(); REQUIRE_NOTHROW(app->getInvariantManager().runStateSnapshotInvariant( - ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), inMemoryState, - []() { return false; })); + snap, inMemoryState, []() { return false; })); } SECTION("Invariant detects corrupted native balance in hot archive") @@ -588,16 +573,13 @@ TEST_CASE("ConservationOfLumens snapshot invariant detects bucket corruption", BucketTestUtils::closeLedger(*app); { - auto ledgerState = - app->getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app->getLedgerManager().getInMemorySorobanStateForTesting(); REQUIRE_NOTHROW( app->getInvariantManager().runStateSnapshotInvariant( - ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), inMemoryState, - []() { return false; })); + snap, inMemoryState, []() { return false; })); } // Corrupt the other live balance by adding 123 stroops to the balance @@ -611,18 +593,15 @@ TEST_CASE("ConservationOfLumens snapshot invariant detects bucket corruption", BucketTestUtils::closeLedger(*app); { - auto ledgerState = - app->getLedgerManager().getLastClosedLedgerStateForTesting(); + auto snap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); auto& inMemoryState = app->getLedgerManager().getInMemorySorobanStateForTesting(); Asset native(ASSET_TYPE_NATIVE); auto lumenInfo = getAssetContractInfo(native, app->getNetworkID()); ConservationOfLumens invariant(lumenInfo); - auto result = - invariant.checkSnapshot(ledgerState->getBucketSnapshot(), - ledgerState->getHotArchiveSnapshot(), - inMemoryState, []() { return false; }); + auto result = invariant.checkSnapshot(snap, inMemoryState, + []() { return false; }); REQUIRE_FALSE(result.empty()); REQUIRE(result.find("Total native asset supply mismatch") != std::string::npos); diff --git a/src/invariant/test/InvariantTests.cpp b/src/invariant/test/InvariantTests.cpp index ff68e4366f..a8de5500ec 100644 --- a/src/invariant/test/InvariantTests.cpp +++ b/src/invariant/test/InvariantTests.cpp @@ -2,10 +2,7 @@ // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 -#include "util/asio.h" - #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "bucket/LiveBucket.h" #include "bucket/test/BucketTestUtils.h" @@ -371,35 +368,25 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") } // Make sure the entries have not been evicted - auto liveBL = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - auto hotArchive = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - REQUIRE(liveBL->load(LedgerEntryKey(tempEntry))); - REQUIRE(liveBL->load(LedgerEntryKey(persistentEntry))); - REQUIRE(liveBL->load(getTTLKey(tempEntry))); - REQUIRE(liveBL->load(getTTLKey(persistentEntry))); - REQUIRE(!hotArchive->load(LedgerEntryKey(tempEntry))); - REQUIRE(!hotArchive->load(LedgerEntryKey(persistentEntry))); + auto snap = app->getLedgerManager().copyLedgerStateSnapshot(); + REQUIRE(snap.loadLiveEntry(LedgerEntryKey(tempEntry))); + REQUIRE(snap.loadLiveEntry(LedgerEntryKey(persistentEntry))); + REQUIRE(snap.loadLiveEntry(getTTLKey(tempEntry))); + REQUIRE(snap.loadLiveEntry(getTTLKey(persistentEntry))); + REQUIRE(!snap.loadArchiveEntry(LedgerEntryKey(tempEntry))); + REQUIRE(!snap.loadArchiveEntry(LedgerEntryKey(persistentEntry))); SECTION("Entries properly evicted") { closeLedger(*app); - liveBL = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - hotArchive = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - REQUIRE(!liveBL->load(LedgerEntryKey(tempEntry))); - REQUIRE(!liveBL->load(LedgerEntryKey(persistentEntry))); - REQUIRE(!liveBL->load(getTTLKey(tempEntry))); - REQUIRE(!liveBL->load(getTTLKey(persistentEntry))); - REQUIRE(!hotArchive->load(LedgerEntryKey(tempEntry))); - REQUIRE(hotArchive->load(LedgerEntryKey(persistentEntry))); + snap = app->getLedgerManager().copyLedgerStateSnapshot(); + REQUIRE(!snap.loadLiveEntry(LedgerEntryKey(tempEntry))); + REQUIRE(!snap.loadLiveEntry(LedgerEntryKey(persistentEntry))); + REQUIRE(!snap.loadLiveEntry(getTTLKey(tempEntry))); + REQUIRE(!snap.loadLiveEntry(getTTLKey(persistentEntry))); + REQUIRE(!snap.loadArchiveEntry(LedgerEntryKey(tempEntry))); + REQUIRE(snap.loadArchiveEntry(LedgerEntryKey(persistentEntry))); } SECTION("invariant check") @@ -410,20 +397,18 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") auto ledgerVersion = lm.getLastClosedLedgerHeader().header.ledgerVersion; - auto snapshot = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto applySnap = + app->getLedgerManager().copyApplyLedgerStateSnapshot(); + // Manually trigger eviction so we can test the invariant directly LedgerTxn ltx(app->getLedgerTxnRoot()); ltx.loadHeader().current().ledgerSeq++; auto evictedState = - app->getBucketManager().resolveBackgroundEvictionScan(snapshot, + app->getBucketManager().resolveBackgroundEvictionScan(applySnap, ltx, {}); - auto hotArchiveSnap = - app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + applySnap = app->getLedgerManager().copyApplyLedgerStateSnapshot(); + // Persistent entry REQUIRE(evictedState.archivedEntries.size() == 1); // Temp entry, temp TTL, persistent TTL @@ -446,7 +431,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -464,7 +449,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -479,7 +464,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -499,7 +484,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -514,7 +499,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -534,7 +519,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -553,8 +538,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") { REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, - evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -562,8 +546,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") { REQUIRE_NOTHROW( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, - evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap)); } } @@ -574,7 +557,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") evictedState.deletedKeys.push_back(getTTLKey(liveTempEntry)); REQUIRE_THROWS_AS( app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap), InvariantDoesNotHold); } @@ -584,7 +567,7 @@ TEST_CASE_VERSIONS("State archival eviction invariant", "[invariant][archival]") // Valid eviction should always pass UnorderedMap emptyMap; REQUIRE_NOTHROW(app->getInvariantManager().checkOnLedgerCommit( - snapshot, hotArchiveSnap, evictedState.archivedEntries, + applySnap, evictedState.archivedEntries, evictedState.deletedKeys, emptyMap, emptyMap)); } } @@ -613,16 +596,8 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") {}, {}); closeLedger(*app); - auto getLiveSnapshot = [&]() { - return app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - }; - - auto getHotArchiveSnapshot = [&]() { - return app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto makeSnap = [&]() { + return app->getLedgerManager().copyApplyLedgerStateSnapshot(); }; auto noopIsStopping = []() { return false; }; @@ -632,8 +607,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") SECTION("Valid state passes invariant") { auto result = invariant.checkSnapshot( - getLiveSnapshot(), getHotArchiveSnapshot(), - lm.getInMemorySorobanStateForTesting(), noopIsStopping); + makeSnap(), lm.getInMemorySorobanStateForTesting(), noopIsStopping); REQUIRE(result.empty()); } @@ -653,8 +627,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") } auto result = - invariant.checkSnapshot(getLiveSnapshot(), getHotArchiveSnapshot(), - modifiedState, noopIsStopping); + invariant.checkSnapshot(makeSnap(), modifiedState, noopIsStopping); REQUIRE(!result.empty()); }; @@ -701,8 +674,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") } auto result = - invariant.checkSnapshot(getLiveSnapshot(), getHotArchiveSnapshot(), - modifiedState, noopIsStopping); + invariant.checkSnapshot(makeSnap(), modifiedState, noopIsStopping); REQUIRE(!result.empty()); }; @@ -743,8 +715,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") } auto result = - invariant.checkSnapshot(getLiveSnapshot(), getHotArchiveSnapshot(), - modifiedState, noopIsStopping); + invariant.checkSnapshot(makeSnap(), modifiedState, noopIsStopping); REQUIRE(!result.empty()); }; @@ -774,8 +745,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") InternalContractDataMapEntry(entryCopy, wrongTTL)); auto result = - invariant.checkSnapshot(getLiveSnapshot(), getHotArchiveSnapshot(), - modifiedState, noopIsStopping); + invariant.checkSnapshot(makeSnap(), modifiedState, noopIsStopping); REQUIRE(!result.empty()); } @@ -790,8 +760,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") *app, lm.getLastClosedLedgerHeader().header, {phantomTTL}, {}, {}); auto result = invariant.checkSnapshot( - getLiveSnapshot(), getHotArchiveSnapshot(), - lm.getInMemorySorobanStateForTesting(), noopIsStopping); + makeSnap(), lm.getInMemorySorobanStateForTesting(), noopIsStopping); REQUIRE(!result.empty()); } @@ -803,8 +772,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]") *app, lm.getLastClosedLedgerHeader().header, {dataEntry1}, {}); auto result = invariant.checkSnapshot( - getLiveSnapshot(), getHotArchiveSnapshot(), - lm.getInMemorySorobanStateForTesting(), noopIsStopping); + makeSnap(), lm.getInMemorySorobanStateForTesting(), noopIsStopping); REQUIRE(!result.empty()); } } diff --git a/src/ledger/InMemorySorobanState.cpp b/src/ledger/InMemorySorobanState.cpp index c7d1b40565..1ea5053d2a 100644 --- a/src/ledger/InMemorySorobanState.cpp +++ b/src/ledger/InMemorySorobanState.cpp @@ -4,6 +4,7 @@ #include "ledger/InMemorySorobanState.h" #include "bucket/BucketListSnapshot.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/SorobanMetrics.h" #include "util/GlobalChecks.h" @@ -444,12 +445,14 @@ InMemorySorobanState::getTTL(LedgerKey const& ledgerKey) const void InMemorySorobanState::initializeStateFromSnapshot( - SearchableSnapshotConstPtr snap, uint32_t ledgerVersion) + ApplyLedgerStateSnapshot const& snap) { releaseAssertOrThrow(mContractDataEntries.empty()); releaseAssertOrThrow(mContractCodeEntries.empty()); releaseAssertOrThrow(mPendingTTLs.empty()); + auto const& lclHeader = snap.getLedgerHeader().current(); + auto ledgerVersion = lclHeader.ledgerVersion; if (protocolVersionStartsFrom(ledgerVersion, SOROBAN_PROTOCOL_VERSION)) { auto sorobanConfig = SorobanNetworkConfig::loadFromLedger(snap); @@ -519,12 +522,12 @@ InMemorySorobanState::initializeStateFromSnapshot( return Loop::INCOMPLETE; }; - snap->scanForEntriesOfType(CONTRACT_DATA, contractDataHandler); - snap->scanForEntriesOfType(TTL, ttlHandler); - snap->scanForEntriesOfType(CONTRACT_CODE, contractCodeHandler); + snap.scanLiveEntriesOfType(CONTRACT_DATA, contractDataHandler); + snap.scanLiveEntriesOfType(TTL, ttlHandler); + snap.scanLiveEntriesOfType(CONTRACT_CODE, contractCodeHandler); } - mLastClosedLedgerSeq = snap->getLedgerSeq(); + mLastClosedLedgerSeq = lclHeader.ledgerSeq; checkUpdateInvariants(); } diff --git a/src/ledger/InMemorySorobanState.h b/src/ledger/InMemorySorobanState.h index 385e494841..0a85aa4840 100644 --- a/src/ledger/InMemorySorobanState.h +++ b/src/ledger/InMemorySorobanState.h @@ -10,8 +10,6 @@ #include #include -#include "bucket/BucketSnapshotManager.h" -#include "invariant/InvariantManagerImpl.h" #include "ledger/LedgerTypeUtils.h" #include "util/types.h" #include "xdr/Stellar-ledger-entries.h" @@ -19,6 +17,7 @@ namespace stellar { +class ApplyLedgerStateSnapshot; class InvariantManagerImpl; class SorobanMetrics; @@ -440,8 +439,7 @@ class InMemorySorobanState // is reading state when these functions are called. // Initialize the map from a bucket list snapshot - void initializeStateFromSnapshot(SearchableSnapshotConstPtr snap, - uint32_t ledgerVersion); + void initializeStateFromSnapshot(ApplyLedgerStateSnapshot const& snap); // Update the map with entries from a ledger close. ledgerSeq must be // exactly mLastClosedLedgerSeq + 1. diff --git a/src/ledger/LedgerEntryScope.h b/src/ledger/LedgerEntryScope.h index 801216d79b..7b5b59b1ac 100644 --- a/src/ledger/LedgerEntryScope.h +++ b/src/ledger/LedgerEntryScope.h @@ -260,7 +260,7 @@ template class ScopedLedgerEntry LedgerEntryScopeID const mScopeID; // Must construct with a scope. - ScopedLedgerEntry() = delete; + ScopedLedgerEntry() = delete; ScopedLedgerEntry(ScopedLedgerEntry const& other); ScopedLedgerEntry(ScopedLedgerEntry&& other); @@ -296,7 +296,7 @@ template class ScopedLedgerEntryOpt LedgerEntryScopeID const mScopeID; // Must construct with a scope. - ScopedLedgerEntryOpt() = delete; + ScopedLedgerEntryOpt() = delete; ScopedLedgerEntryOpt(ScopedLedgerEntryOpt const& other); ScopedLedgerEntryOpt(ScopedLedgerEntryOpt&& other); diff --git a/src/ledger/LedgerHeaderUtils.cpp b/src/ledger/LedgerHeaderUtils.cpp index b98a0f058a..24f4132ae2 100644 --- a/src/ledger/LedgerHeaderUtils.cpp +++ b/src/ledger/LedgerHeaderUtils.cpp @@ -13,14 +13,10 @@ #include #include -#include namespace stellar { -namespace -{ - static bool isValid(LedgerHeader const& lh) { @@ -32,52 +28,51 @@ isValid(LedgerHeader const& lh) return res; } -static LedgerHeader -decodeFromData(std::string const& data) +namespace LedgerHeaderUtils { - ZoneScoped; - LedgerHeader lh; - std::vector decoded; - decoder::decode_b64(data, decoded); - xdr::xdr_get g(&decoded.front(), &decoded.back() + 1); - xdr::xdr_argpack_archive(g, lh); - g.done(); +uint32_t +getFlags(LedgerHeader const& lh) +{ + return lh.ext.v() == 1 ? lh.ext.v1().flags : 0; +} - if (!isValid(lh)) +static std::string +encodeHeader(LedgerHeader const& header, std::string* hash) +{ + if (!isValid(header)) { - throw std::runtime_error("invalid ledger header (load)"); + throw std::runtime_error("invalid ledger header (insert)"); } - return lh; + auto headerBytes(xdr::xdr_to_opaque(header)); + if (hash) + { + *hash = binToHex(sha256(headerBytes)); + } + return decoder::encode_b64(headerBytes); } -} // anonymous namespace - -namespace LedgerHeaderUtils +std::string +encodeHeader(LedgerHeader const& header) { + return encodeHeader(header, nullptr); +} -uint32_t -getFlags(LedgerHeader const& lh) +#ifdef BUILD_TESTS +std::string +encodeHeader(LedgerHeader const& header, std::string& hash) { - return lh.ext.v() == 1 ? lh.ext.v1().flags : 0; + return encodeHeader(header, &hash); } void storeInDatabase(Database& db, LedgerHeader const& header, SessionWrapper& sess) { ZoneScoped; - if (!isValid(header)) - { - throw std::runtime_error("invalid ledger header (insert)"); - } - auto headerBytes(xdr::xdr_to_opaque(header)); - std::string hash(binToHex(sha256(headerBytes))), - prevHash(binToHex(header.previousLedgerHash)), + std::string hash, prevHash(binToHex(header.previousLedgerHash)), bucketListHash(binToHex(header.bucketListHash)); - - std::string headerEncoded; - headerEncoded = decoder::encode_b64(headerBytes); + std::string headerEncoded = encodeHeader(header, hash); // note: columns other than "data" are there to facilitate lookup/processing auto prep = db.getPreparedStatement( @@ -103,13 +98,36 @@ storeInDatabase(Database& db, LedgerHeader const& header, SessionWrapper& sess) throw std::runtime_error("Could not update data in SQL"); } } +#endif -std::shared_ptr -loadByHash(Database& db, Hash const& hash) +LedgerHeader +decodeFromData(std::string const& data) { ZoneScoped; - std::shared_ptr lhPtr; + LedgerHeader lh; + std::vector decoded; + decoder::decode_b64(data, decoded); + + if (decoded.empty()) + { + throw std::runtime_error("invalid base64 ledger header data"); + } + xdr::xdr_get g(&decoded.front(), &decoded.back() + 1); + xdr::xdr_argpack_archive(g, lh); + g.done(); + + if (!isValid(lh)) + { + throw std::runtime_error("invalid ledger header (load)"); + } + return lh; +} + +std::string +getHeaderDataForHash(Database& db, Hash const& hash) +{ + ZoneScoped; std::string hash_s(binToHex(hash)); std::string headerEncoded; @@ -127,7 +145,6 @@ loadByHash(Database& db, Hash const& hash) if (st.got_data()) { auto lh = decodeFromData(headerEncoded); - lhPtr = std::make_shared(lh); auto ledgerHash = xdrSha256(lh); if (ledgerHash != hash) { @@ -138,15 +155,7 @@ loadByHash(Database& db, Hash const& hash) } } - return lhPtr; -} - -void -deleteOldEntries(soci::session& sess, uint32_t ledgerSeq, uint32_t count) -{ - ZoneScoped; - DatabaseUtils::deleteOldEntriesHelper(sess, ledgerSeq, count, - "ledgerheaders", "ledgerseq"); + return headerEncoded; } void diff --git a/src/ledger/LedgerHeaderUtils.h b/src/ledger/LedgerHeaderUtils.h index afcbaee1ce..3ab4e4f469 100644 --- a/src/ledger/LedgerHeaderUtils.h +++ b/src/ledger/LedgerHeaderUtils.h @@ -4,23 +4,35 @@ #pragma once -#include "database/Database.h" #include "xdr/Stellar-ledger.h" namespace stellar { +class Database; +class SessionWrapper; namespace LedgerHeaderUtils { uint32_t getFlags(LedgerHeader const& lh); +// Return base64-encoded header data. Throws if the header fails basic sanity +// checks (e.g., fee pool >= 0). +std::string encodeHeader(LedgerHeader const& header); + +#ifdef BUILD_TESTS +// Like the non-test encodeHeader, except also include the hex-encoded hash of +// the header in the `hash` out parameter +std::string encodeHeader(LedgerHeader const& header, std::string& hash); void storeInDatabase(Database& db, LedgerHeader const& header, SessionWrapper& sess); +#endif -std::shared_ptr loadByHash(Database& db, Hash const& hash); +LedgerHeader decodeFromData(std::string const& data); -void deleteOldEntries(soci::session& sess, uint32_t ledgerSeq, uint32_t count); +// Returns the base64-encoded header data for the given hash. Returns an empty +// string if no header is found for the hash. +std::string getHeaderDataForHash(Database& db, Hash const& hash); void maybeDropAndCreateNew(Database& db); } diff --git a/src/ledger/LedgerManager.h b/src/ledger/LedgerManager.h index dbc885008d..5a785ce267 100644 --- a/src/ledger/LedgerManager.h +++ b/src/ledger/LedgerManager.h @@ -7,6 +7,7 @@ #include "catchup/LedgerApplyManager.h" #include "history/HistoryManager.h" #include "ledger/LedgerCloseMetaFrame.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/NetworkConfig.h" #include "main/ApplicationImpl.h" #include "rust/RustBridge.h" @@ -229,8 +230,22 @@ class LedgerManager virtual LedgerHeaderHistoryEntry const& getLastClosedLedgerHeader() const = 0; - // Get bucketlist snapshot of LCL - virtual SearchableSnapshotConstPtr getLastClosedSnapshot() const = 0; + // Create a thread-safe copy of the current canonical ledger state + // snapshot. Can be called from any thread (except for apply, which must use + // copyApplyLedgerStateSnapshot instead). + virtual LedgerStateSnapshot copyLedgerStateSnapshot() const = 0; + + // Create a thread-safe copy of the current canonical ledger state + // snapshot, typed as an apply-time snapshot. Used by legacy (pre-V23) + // code paths that need an ApplyLedgerStateSnapshot but don't have + // access to ApplyState. + // TODO: Refactor such that this doesn't have to be a public function + virtual ApplyLedgerStateSnapshot copyApplyLedgerStateSnapshot() const = 0; + + // Refresh `snapshot` if its ledger seq differs from the current canonical + // state. No-op otherwise. Can be called from any thread. + virtual void + maybeUpdateLedgerStateSnapshot(LedgerStateSnapshot& snapshot) const = 0; // return the HAS that corresponds to the last closed ledger as persisted in // the database @@ -272,14 +287,13 @@ class LedgerManager virtual std::chrono::milliseconds getExpectedLedgerCloseTime() const = 0; #ifdef BUILD_TESTS + virtual void updateCanonicalStateForTesting(LedgerHeader const& header) = 0; virtual std::vector const& getLastClosedLedgerTxMeta() = 0; virtual std::optional const& getLastClosedLedgerCloseMeta() = 0; virtual void storeCurrentLedgerForTest(LedgerHeader const& header) = 0; virtual InMemorySorobanState const& getInMemorySorobanStateForTesting() = 0; - virtual CompleteConstLedgerStatePtr - getLastClosedLedgerStateForTesting() = 0; virtual void rebuildInMemorySorobanStateForTesting(uint32_t ledgerVersion) = 0; virtual ::rust::Box @@ -333,9 +347,7 @@ class LedgerManager advanceLedgerStateAndPublish(uint32_t ledgerSeq, bool calledViaExternalize, LedgerCloseData const& ledgerData, CompleteConstLedgerStatePtr newLedgerState, - bool upgradeApplied, - std::shared_ptr - inMemorySnapshotForInvariant) = 0; + bool upgradeApplied) = 0; virtual void assertSetupPhase() const = 0; #ifdef BUILD_TESTS diff --git a/src/ledger/LedgerManagerImpl.cpp b/src/ledger/LedgerManagerImpl.cpp index 0538046a9c..d1d4348f0d 100644 --- a/src/ledger/LedgerManagerImpl.cpp +++ b/src/ledger/LedgerManagerImpl.cpp @@ -4,7 +4,6 @@ #include "ledger/LedgerManagerImpl.h" #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/HotArchiveBucketList.h" #include "bucket/LiveBucketList.h" #include "catchup/AssumeStateWork.h" @@ -28,10 +27,10 @@ #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" -#include "ledger/LedgerTypeUtils.h" #include "ledger/P23HotArchiveBug.h" #include "ledger/SharedModuleCacheCompiler.h" #include "main/Application.h" +#include "main/CommandHandler.h" #include "main/Config.h" #include "main/ErrorMessages.h" #include "rust/RustBridge.h" @@ -42,6 +41,7 @@ #include "transactions/TransactionMeta.h" #include "transactions/TransactionUtils.h" #include "util/DebugMetaUtils.h" +#include "util/Decoder.h" #include "util/Fs.h" #include "util/GlobalChecks.h" #include "util/JitterInjection.h" @@ -49,12 +49,12 @@ #include "util/Logging.h" #include "util/MetricsRegistry.h" #include "util/ProtocolVersion.h" +#include "util/ThreadAnnotations.h" #include "util/XDRCereal.h" #include "util/XDRStream.h" #include "util/types.h" #include "work/WorkScheduler.h" #include "xdr/Stellar-ledger-entries.h" -#include "xdrpp/printer.h" #include #include @@ -76,7 +76,6 @@ #include "LedgerManagerImpl.h" #include #include -#include #include #include #include @@ -264,6 +263,13 @@ LedgerManagerImpl::ApplyState::getSorobanInMemoryStateSizeForTesting() const { return mInMemorySorobanState.getSize(); } + +void +LedgerManagerImpl::ApplyState::setLedgerStateForTesting( + CompleteConstLedgerStatePtr state) +{ + mLedgerState = std::move(state); +} #endif void @@ -333,13 +339,29 @@ LedgerManagerImpl::ApplyState::manuallyAdvanceLedgerHeader( LedgerManagerImpl::LedgerManagerImpl(Application& app) : mApp(app) , mApplyState(app) - , mLastClosedLedgerState(std::make_shared( - nullptr, nullptr, LedgerHeaderHistoryEntry(), HistoryArchiveState())) , mLastClose(mApp.getClock().now()) , mCatchupDuration( app.getMetrics().NewTimer({"ledger", "catchup", "duration"})) , mState(LM_BOOTING_STATE) { + // At this point, we haven't called assumeState yet, so the BucketLists are + // empty. We will create an "empty" snapshot that is not null, but + // references this empty BucketList (and a ledger header with ledgerSeq 0 + // and zero hash). + auto& bm = mApp.getBucketManager(); + LedgerHeaderHistoryEntry emptyLcl; + HistoryArchiveState emptyHas; + + auto initialState = std::make_shared( + bm.getLiveBucketList(), bm.getHotArchiveBucketList(), emptyLcl, + emptyHas, /*sorobanConfig*/ std::nullopt); + + mApplyState.setLedgerState(initialState); + { + SharedLockExclusive lock(mLedgerStateSnapshotMutex); + mLastClosedLedgerState = initialState; + } + setupLedgerCloseMetaStream(); } @@ -470,12 +492,15 @@ LedgerManagerImpl::startNewLedger(LedgerHeader const& genesisLedger) CLOG_INFO(Ledger, "Root account: {}", skey.getStrKeyPublic()); CLOG_INFO(Ledger, "Root account seed: {}", skey.getStrKeySeed().value); - auto& appConnector = mApp.getAppConnector(); - auto output = sealLedgerTxnAndStoreInBucketsAndDB( - appConnector.copySearchableLiveBucketListSnapshot(), - appConnector.copySearchableHotArchiveBucketListSnapshot(), ltx, - /*ledgerCloseMeta*/ nullptr, - /*initialLedgerVers*/ 0); + ApplyLedgerStateSnapshot snap = [this] { + SharedLockShared guard(mLedgerStateSnapshotMutex); + return ApplyLedgerStateSnapshot(mLastClosedLedgerState, + mApp.getMetrics()); + }(); + auto output = + sealLedgerTxnAndStoreInBucketsAndDB(snap, ltx, + /*ledgerCloseMeta*/ nullptr, + /*initialLedgerVers*/ 0); advanceLastClosedLedgerState(output); ltx.commit(); @@ -506,34 +531,25 @@ LedgerManagerImpl::loadLastKnownLedgerInternal(bool skipBuildingFullState) { ZoneScoped; mApplyState.assertSetupPhase(); + auto rebuildStart = mApp.getClock().now(); - // Step 1. Load LCL state from the DB and extract latest ledger hash - string lastLedger = mApp.getPersistentState().getState( - PersistentState::kLastClosedLedger, mApp.getDatabase().getSession()); - - if (lastLedger.empty()) - { - throw std::runtime_error( - "No reference in DB to any last closed ledger"); - } - - CLOG_INFO(Ledger, "Last closed ledger (LCL) hash is {}", lastLedger); - Hash lastLedgerHash = hexToBin256(lastLedger); - + // Step 1. Load LCL state from the DB HistoryArchiveState has; has.fromString(mApp.getPersistentState().getState( PersistentState::kHistoryArchiveState, mApp.getDatabase().getSession())); - // Step 2. Restore LedgerHeader from DB based on the ledger hash derived - // earlier, or verify we're at genesis if in no-history mode + // Step 2. Restore LedgerHeader from storestate std::optional latestLedgerHeader; - auto currentLedger = - LedgerHeaderUtils::loadByHash(getDatabase(), lastLedgerHash); - if (!currentLedger) + std::string headerEncoded = mApp.getPersistentState().getState( + PersistentState::kLastClosedLedgerHeader, + mApp.getDatabase().getSession()); + if (headerEncoded.empty()) { - throw std::runtime_error("Could not load ledger from database"); + throw std::runtime_error("Could not load ledger header from database"); } + auto currentLedger = std::make_shared( + LedgerHeaderUtils::decodeFromData(headerEncoded)); if (currentLedger->ledgerSeq != has.currentLedger) { @@ -562,13 +578,16 @@ LedgerManagerImpl::loadLastKnownLedgerInternal(bool skipBuildingFullState) // Only restart merges in full startup mode. Many modes in core // (standalone offline commands, in-memory setup) do not need to // spin up expensive merge processes. + auto assumeStart = mApp.getClock().now(); auto assumeStateWork = mApp.getWorkScheduler().executeWork( has, latestLedgerHeader->ledgerVersion, /* restartMerges */ !skipBuildingFullState); if (assumeStateWork->getState() == BasicWork::State::WORK_SUCCESS) { - CLOG_INFO(Ledger, "Assumed bucket-state for LCL: {}", - ledgerAbbrev(*latestLedgerHeader)); + std::chrono::duration assumeSecs = + mApp.getClock().now() - assumeStart; + CLOG_INFO(Ledger, "Assumed bucket-state for LCL: {} ({:.3f} sec)", + ledgerAbbrev(*latestLedgerHeader), assumeSecs.count()); } else { @@ -577,33 +596,41 @@ LedgerManagerImpl::loadLastKnownLedgerInternal(bool skipBuildingFullState) } // Step 4. Restore LedgerManager's LCL state - advanceLastClosedLedgerState( - advanceBucketListSnapshotAndMakeLedgerState(*latestLedgerHeader, has)); + advanceLastClosedLedgerState(advanceApplySnapshotAndMakeLedgerState( + *latestLedgerHeader, has, /* sorobanConfig */ std::nullopt)); // Maybe truncate checkpoint files if we're restarting after a crash // in applyLedger (in which case any modifications to the ledger state have // been rolled back) mApp.getHistoryManager().restoreCheckpoint(latestLedgerHeader->ledgerSeq); - // Prime module cache with LCL state, not apply-state. This is acceptable - // here because we just started and there is no apply-state yet and no apply - // thread to hold such state. - auto const& snapshot = mLastClosedLedgerState->getBucketSnapshot(); + // Prime module cache using mApplyState, which at this point contains LCL + // state. This is acceptable because we just started and there is no apply + // thread running yet. if (!skipBuildingFullState) { mApplyState.compileAllContractsInLedger( - snapshot, latestLedgerHeader->ledgerVersion); - mApplyState.populateInMemorySorobanState( - snapshot, latestLedgerHeader->ledgerVersion); - } + latestLedgerHeader->ledgerVersion); - if (!skipBuildingFullState) - { - maybeRunSnapshotInvariantFromLedgerState( - mLastClosedLedgerState, maybeCopySorobanStateForInvariant(), - /* runInParallel */ false); + auto populateStart = mApp.getClock().now(); + CLOG_INFO(Perf, + "Populating in-memory Soroban state from LCL for ledger {}", + ledgerAbbrev(*latestLedgerHeader)); + mApplyState.populateInMemorySorobanState(); + std::chrono::duration populateSecs = + mApp.getClock().now() - populateStart; + CLOG_INFO(Perf, "Populated in-memory Soroban state in {:.3f} sec", + populateSecs.count()); + + maybeRunSnapshotInvariantFromLedgerState(copyApplyLedgerStateSnapshot(), + /* runInParallel */ false); } mApplyState.markEndOfSetupPhase(); + + std::chrono::duration rebuildSecs = + mApp.getClock().now() - rebuildStart; + CLOG_INFO(Perf, "Startup state load took {:.3f} sec (full={})", + rebuildSecs.count(), !skipBuildingFullState); } void @@ -627,7 +654,8 @@ LedgerManagerImpl::getDatabase() uint32_t LedgerManagerImpl::getLastMaxTxSetSize() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedLedgerHeader() .header.maxTxSetSize; @@ -636,7 +664,8 @@ LedgerManagerImpl::getLastMaxTxSetSize() const uint32_t LedgerManagerImpl::getLastMaxTxSetSizeOps() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); auto n = mLastClosedLedgerState->getLastClosedLedgerHeader().header.maxTxSetSize; @@ -685,7 +714,8 @@ LedgerManagerImpl::maxSorobanTransactionResources() int64_t LedgerManagerImpl::getLastMinBalance(uint32_t ownerCount) const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); auto const& lh = mLastClosedLedgerState->getLastClosedLedgerHeader().header; if (protocolVersionIsBefore(lh.ledgerVersion, ProtocolVersion::V_9)) @@ -697,7 +727,8 @@ LedgerManagerImpl::getLastMinBalance(uint32_t ownerCount) const uint32_t LedgerManagerImpl::getLastReserve() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedLedgerHeader() .header.baseReserve; @@ -706,7 +737,8 @@ LedgerManagerImpl::getLastReserve() const uint32_t LedgerManagerImpl::getLastTxFee() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedLedgerHeader().header.baseFee; } @@ -714,7 +746,11 @@ LedgerManagerImpl::getLastTxFee() const LedgerHeaderHistoryEntry const& LedgerManagerImpl::getLastClosedLedgerHeader() const { + // Must be main thread: returns a reference into mLastClosedLedgerState, + // which is only replaced on the main thread (advanceLastClosedLedgerState). + // A cross-thread caller could hold a dangling reference after replacement. releaseAssert(threadIsMain()); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedLedgerHeader(); } @@ -722,7 +758,8 @@ LedgerManagerImpl::getLastClosedLedgerHeader() const HistoryArchiveState LedgerManagerImpl::getLastClosedLedgerHAS() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedHistoryArchiveState(); } @@ -730,65 +767,42 @@ LedgerManagerImpl::getLastClosedLedgerHAS() const uint32_t LedgerManagerImpl::getLastClosedLedgerNum() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->getLastClosedLedgerHeader().header.ledgerSeq; } -std::shared_ptr -LedgerManagerImpl::maybeCopySorobanStateForInvariant() -{ - std::shared_ptr inMemorySnapshotForInvariant = - nullptr; - if (mApp.getInvariantManager().shouldRunInvariantSnapshot()) - { - // The in memory state copy is expensive, so we need to mark - // that start of the invariant scan here, not in the callback, to ensure - // we don't trigger a race condition that creates two copies. - mApp.getInvariantManager().markStartOfInvariantSnapshot(); - inMemorySnapshotForInvariant = - std::make_shared( - mApplyState.getInMemorySorobanState()); - } - return inMemorySnapshotForInvariant; -} - void LedgerManagerImpl::maybeRunSnapshotInvariantFromLedgerState( - CompleteConstLedgerStatePtr const& ledgerState, - std::shared_ptr inMemorySnapshotForInvariant, - bool runInParallel) const + ApplyLedgerStateSnapshot const& ledgerState, bool runInParallel) { - releaseAssert(threadIsMain()); - - if (!inMemorySnapshotForInvariant || - !mApp.getConfig().INVARIANT_EXTRA_CHECKS || mApp.isStopping()) + if (!mApp.getConfig().INVARIANT_EXTRA_CHECKS || mApp.isStopping() || + !mApp.getInvariantManager().shouldRunInvariantSnapshot()) { return; } + // The in memory state copy is expensive, so we need to mark the start of + // the invariant scan here, not in the callback, to ensure we don't trigger + // a race condition that creates two copies. + mApp.getInvariantManager().markStartOfInvariantSnapshot(); + auto inMemorySnapshotForInvariant = + std::make_shared( + mApplyState.getInMemorySorobanState()); + // Verify consistency of all snapshot state. - auto ledgerSeq = ledgerState->getLastClosedLedgerHeader().header.ledgerSeq; + auto ledgerSeq = ledgerState.getLedgerSeq(); inMemorySnapshotForInvariant->assertLastClosedLedger(ledgerSeq); - // Copy snapshots from ledgerState to ensure consistency with the - // in-memory Soroban state - auto liveSnapshotCopy = - BucketSnapshotManager::copySearchableLiveBucketListSnapshot( - ledgerState->getBucketSnapshot(), mApp.getMetrics()); - auto hotArchiveSnapshotCopy = - BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot( - ledgerState->getHotArchiveSnapshot(), mApp.getMetrics()); - releaseAssertOrThrow(liveSnapshotCopy->getLedgerSeq() == ledgerSeq); - releaseAssertOrThrow(hotArchiveSnapshotCopy->getLedgerSeq() == ledgerSeq); - // Note: No race condition acquiring app by reference, as all worker // threads are joined before application destruction. - auto cb = [liveSnapshot = liveSnapshotCopy, - hotArchiveSnapshot = hotArchiveSnapshotCopy, &app = mApp, + // Make sure we make a new snapshot copy since invariant will run on another + // thread. + auto cb = [snap = ledgerState, &app = mApp, inMemorySnapshotForInvariant]() { app.getInvariantManager().runStateSnapshotInvariant( - liveSnapshot, hotArchiveSnapshot, *inMemorySnapshotForInvariant, + std::move(snap), *inMemorySnapshotForInvariant, [&app]() { return app.isStopping(); }); }; @@ -805,15 +819,21 @@ LedgerManagerImpl::maybeRunSnapshotInvariantFromLedgerState( SorobanNetworkConfig const& LedgerManagerImpl::getLastClosedSorobanNetworkConfig() const { + // Must be main thread: returns a reference into mLastClosedLedgerState, + // which is only replaced on the main thread (advanceLastClosedLedgerState). + // A cross-thread caller could hold a dangling reference after replacement. releaseAssert(threadIsMain()); - releaseAssert(hasLastClosedSorobanNetworkConfig()); + SharedLockShared guard(mLedgerStateSnapshotMutex); + releaseAssert(mLastClosedLedgerState); + releaseAssert(mLastClosedLedgerState->hasSorobanConfig()); return mLastClosedLedgerState->getSorobanConfig(); } bool LedgerManagerImpl::hasLastClosedSorobanNetworkConfig() const { - releaseAssert(threadIsMain()); + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); + SharedLockShared guard(mLedgerStateSnapshotMutex); releaseAssert(mLastClosedLedgerState); return mLastClosedLedgerState->hasSorobanConfig(); } @@ -867,19 +887,12 @@ LedgerManagerImpl::getInMemorySorobanStateForTesting() return mApplyState.getInMemorySorobanStateForTesting(); } -CompleteConstLedgerStatePtr -LedgerManagerImpl::getLastClosedLedgerStateForTesting() -{ - return mLastClosedLedgerState; -} - void LedgerManagerImpl::rebuildInMemorySorobanStateForTesting(uint32_t ledgerVersion) { mApplyState.resetToSetupPhase(); mApplyState.getInMemorySorobanStateForTesting().clearForTesting(); - mApplyState.populateInMemorySorobanState( - mLastClosedLedgerState->getBucketSnapshot(), ledgerVersion); + mApplyState.populateInMemorySorobanState(); mApplyState.markEndOfSetupPhase(); } @@ -981,19 +994,19 @@ LedgerManagerImpl::ApplyState::finishPendingCompilation() void LedgerManagerImpl::ApplyState::compileAllContractsInLedger( - SearchableSnapshotConstPtr snap, uint32_t minLedgerVersion) + uint32_t minLedgerVersion) { assertSetupPhase(); - startCompilingAllContracts(snap, minLedgerVersion); + startCompilingAllContracts(minLedgerVersion); finishPendingCompilation(); } void -LedgerManagerImpl::ApplyState::populateInMemorySorobanState( - SearchableSnapshotConstPtr snap, uint32_t ledgerVersion) +LedgerManagerImpl::ApplyState::populateInMemorySorobanState() { assertSetupPhase(); - mInMemorySorobanState.initializeStateFromSnapshot(snap, ledgerVersion); + mInMemorySorobanState.initializeStateFromSnapshot( + copyLedgerStateSnapshot()); } void @@ -1051,7 +1064,7 @@ LedgerManagerImpl::ApplyState::assertSetupPhase() const void LedgerManagerImpl::ApplyState::startCompilingAllContracts( - SearchableSnapshotConstPtr snap, uint32_t minLedgerVersion) + uint32_t minLedgerVersion) { threadInvariant(); // Always stop a previous compilation before starting a new one. Can only @@ -1066,7 +1079,7 @@ LedgerManagerImpl::ApplyState::startCompilingAllContracts( } } mCompiler = std::make_unique( - snap, mAppConnector.getMetrics(), mNumCompilationThreads, versions); + copyLedgerStateSnapshot(), mNumCompilationThreads, versions); mCompiler->start(); } @@ -1080,9 +1093,10 @@ LedgerManagerImpl::ApplyState::assertWritablePhase() const void LedgerManagerImpl::ApplyState::maybeRebuildModuleCache( - SearchableSnapshotConstPtr snap, uint32_t minLedgerVersion) + uint32_t minLedgerVersion) { assertCommittingPhase(); + auto snap = copyLedgerStateSnapshot(); // There is (currently) a grow-only arena underlying the module cache, so as // entries are uploaded and evicted that arena will still grow. To cap this @@ -1139,7 +1153,7 @@ LedgerManagerImpl::ApplyState::maybeRebuildModuleCache( "Rebuilding module cache: worst-case estimate {} " "model-bytes consumed of {} limit", bytesConsumed, limit); - startCompilingAllContracts(snap, minLedgerVersion); + startCompilingAllContracts(minLedgerVersion); break; } } @@ -1331,19 +1345,15 @@ getMetaIOContext(Application& app) } // namespace void -LedgerManagerImpl::ledgerCloseComplete( - uint32_t lcl, bool calledViaExternalize, LedgerCloseData const& ledgerData, - bool upgradeApplied, - std::shared_ptr inMemorySnapshotForInvariant) +LedgerManagerImpl::ledgerCloseComplete(uint32_t lcl, bool calledViaExternalize, + LedgerCloseData const& ledgerData, + bool upgradeApplied) { // We just finished applying `lcl`, maybe change LM's state // Also notify Herder so it can trigger next ledger. releaseAssert(threadIsMain()); - // Kick off the snapshot invariant, if enabled - maybeRunSnapshotInvariantFromLedgerState(mLastClosedLedgerState, - inMemorySnapshotForInvariant); uint32_t latestHeardFromNetwork = mApp.getLedgerApplyManager().getLargestLedgerSeqHeard(); uint32_t latestQueuedToApply = @@ -1385,8 +1395,7 @@ void LedgerManagerImpl::advanceLedgerStateAndPublish( uint32_t ledgerSeq, bool calledViaExternalize, LedgerCloseData const& ledgerData, - CompleteConstLedgerStatePtr newLedgerState, bool upgradeApplied, - std::shared_ptr inMemorySnapshotForInvariant) + CompleteConstLedgerStatePtr newLedgerState, bool upgradeApplied) { #ifdef BUILD_TESTS if (mAdvanceLedgerStateAndPublishOverride) @@ -1424,7 +1433,7 @@ LedgerManagerImpl::advanceLedgerStateAndPublish( // Maybe set LedgerManager into synced state, maybe let // Herder trigger next ledger ledgerCloseComplete(ledgerSeq, calledViaExternalize, ledgerData, - upgradeApplied, inMemorySnapshotForInvariant); + upgradeApplied); CLOG_INFO(Ledger, "Ledger close complete: {}", ledgerSeq); } @@ -1653,9 +1662,9 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, for (size_t i = 0; i < sv.upgrades.size(); i++) { LedgerUpgrade lupgrade; - LedgerSnapshot ls(ltx); + LedgerReadView lrv(ltx); auto valid = - Upgrades::isValidForApply(sv.upgrades[i], lupgrade, mApp, ls); + Upgrades::isValidForApply(sv.upgrades[i], lupgrade, mApp, lrv); switch (valid) { case Upgrades::UpgradeValidity::VALID: @@ -1700,14 +1709,11 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, } } - auto maybeNewVersion = ltx.loadHeader().current().ledgerVersion; auto ledgerSeq = ltx.loadHeader().current().ledgerSeq; - auto& appConnector = mApp.getAppConnector(); + auto lclSnap = mApplyState.copyLedgerStateSnapshot(); auto appliedLedgerState = sealLedgerTxnAndStoreInBucketsAndDB( - appConnector.copySearchableLiveBucketListSnapshot(), - appConnector.copySearchableHotArchiveBucketListSnapshot(), ltx, - ledgerCloseMeta, initialLedgerVers); + lclSnap, ltx, ledgerCloseMeta, initialLedgerVers); // NB: from now on, the ledger state may not change, but LCL still hasn't // advanced properly. Hence when requesting the ledger state data (such as @@ -1730,9 +1736,29 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, *ledgerData.getExpectedHash() != appliedLedgerState->getLastClosedLedgerHeader().hash) { +#ifdef BUILD_TESTS + if (ledgerCloseMeta) + { + ledgerCloseMeta->ledgerHeader() = + appliedLedgerState->getLastClosedLedgerHeader(); + CLOG_ERROR(Ledger, "LedgerCloseMeta (base64): {}", + decoder::encode_b64( + xdr::xdr_to_opaque(ledgerCloseMeta->getXDR()))); + } +#endif throw std::runtime_error("Local node's ledger corrupted during close"); } +#ifdef BUILD_TESTS + if (ledgerCloseMeta) + { + ledgerCloseMeta->ledgerHeader() = + appliedLedgerState->getLastClosedLedgerHeader(); + // Copy this before we move it into mNextMetaToEmit below + mLastLedgerCloseMeta = *ledgerCloseMeta; + } +#endif + if (mMetaStream || mMetaDebugStream) { releaseAssert(ledgerCloseMeta); @@ -1790,7 +1816,7 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, // consistent with the ledger header, we must base checkpoints off the new // ledgerVers here and not the initial ledgerVers. auto& hm = mApp.getHistoryManager(); - hm.maybeQueueHistoryCheckpoint(ledgerSeq, maybeNewVersion); + hm.maybeQueueHistoryCheckpoint(appliedLedgerState); JITTER_INJECT_DELAY(); // step 2 @@ -1810,14 +1836,12 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, .header.ledgerVersion, SOROBAN_PROTOCOL_VERSION)) { - // Copy the snapshot directly from `appliedLedgerState`, which holds - // the latest committed state, to avoid relying on - // BucketSnapshotManager. - auto latestSnapshot = - BucketSnapshotManager::copySearchableLiveBucketListSnapshot( - appliedLedgerState->getBucketSnapshot(), mApp.getMetrics()); + // Construct an ApplyLedgerStateSnapshot from `appliedLedgerState`, + // which holds the latest committed state, since the main thread has + // not yet updated the non-apply lcl snapshot + ApplyLedgerStateSnapshot snap(appliedLedgerState, mApp.getMetrics()); mApp.getBucketManager().startBackgroundEvictionScan( - latestSnapshot, appliedLedgerState->getSorobanConfig()); + std::move(snap), appliedLedgerState->getSorobanConfig()); } // At this point, we've committed all changes to the Apply State for this @@ -1827,10 +1851,12 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, mApplyState.markEndOfCommitting(); JITTER_INJECT_DELAY(); - // Step 5: copy the in-memory Soroban state if we should run the snapshot - // invariant for this ledger. At this point, commit has completed and - // in-memory state is immutable. - auto inMemorySnapshotForInvariant = maybeCopySorobanStateForInvariant(); + // Step 5: kick off the snapshot invariant, if the timer has fired. + // Both the apply-state snapshot and the in-memory Soroban state are + // captured here at the same point (after commit), so they are guaranteed + // to be from the same ledger. + maybeRunSnapshotInvariantFromLedgerState( + mApplyState.copyLedgerStateSnapshot()); // Steps 6, 7, 8 are done in `advanceLedgerStateAndPublish` // NB: appliedLedgerState is invalidated after this call. @@ -1838,18 +1864,16 @@ LedgerManagerImpl::applyLedger(LedgerCloseData const& ledgerData, { advanceLedgerStateAndPublish(ledgerSeq, calledViaExternalize, ledgerData, std::move(appliedLedgerState), - upgradeApplied, - inMemorySnapshotForInvariant); + upgradeApplied); } else { auto cb = [this, ledgerSeq, calledViaExternalize, ledgerData, appliedLedgerState = std::move(appliedLedgerState), - upgradeApplied, inMemorySnapshotForInvariant]() mutable { + upgradeApplied]() mutable { advanceLedgerStateAndPublish( ledgerSeq, calledViaExternalize, ledgerData, - std::move(appliedLedgerState), upgradeApplied, - inMemorySnapshotForInvariant); + std::move(appliedLedgerState), upgradeApplied); }; mApp.postOnMainThread(std::move(cb), "advanceLedgerStateAndPublish"); } @@ -1881,8 +1905,8 @@ LedgerManagerImpl::setLastClosedLedger( header.current(), /* appendToCheckpoint */ false); ltx.commit(); - auto output = - advanceBucketListSnapshotAndMakeLedgerState(lastClosed.header, has); + auto output = advanceApplySnapshotAndMakeLedgerState( + lastClosed.header, has, /* sorobanConfig */ std::nullopt); advanceLastClosedLedgerState(output); auto ledgerVersion = lastClosed.header.ledgerVersion; @@ -1895,14 +1919,8 @@ LedgerManagerImpl::setLastClosedLedger( { // This should not be additionally conditionalized on lv >= anything, // since we want to support SOROBAN_TEST_EXTRA_PROTOCOL > lv. - // - // Again, since we are only called during catchup and just got a full - // bucket state, there's no tx-apply state to snapshot, in this one - // case we will prime the tx-apply-state's soroban module cache using - // a snapshot _from_ the LCL state. - auto const& snapshot = mLastClosedLedgerState->getBucketSnapshot(); - mApplyState.compileAllContractsInLedger(snapshot, ledgerVersion); - mApplyState.populateInMemorySorobanState(snapshot, ledgerVersion); + mApplyState.compileAllContractsInLedger(ledgerVersion); + mApplyState.populateInMemorySorobanState(); } mApplyState.markEndOfSetupPhase(); } @@ -1923,8 +1941,9 @@ LedgerManagerImpl::manuallyAdvanceLedgerHeader(LedgerHeader const& header) mApplyState.markStartOfApplying(); mApplyState.markStartOfCommitting(); mApplyState.manuallyAdvanceLedgerHeader(header); - advanceLastClosedLedgerState( - advanceBucketListSnapshotAndMakeLedgerState(header, has)); + advanceLastClosedLedgerState(advanceApplySnapshotAndMakeLedgerState( + header, has, + /* sorobanConfig */ std::nullopt)); mApplyState.markEndOfCommitting(); } @@ -2058,14 +2077,6 @@ LedgerManagerImpl::maybeResetLedgerCloseMetaDebugStream(uint32_t ledgerSeq) } } -SearchableSnapshotConstPtr -LedgerManagerImpl::getLastClosedSnapshot() const -{ - releaseAssert(threadIsMain()); - releaseAssert(mLastClosedLedgerState); - return mLastClosedLedgerState->getBucketSnapshot(); -} - void LedgerManagerImpl::advanceLastClosedLedgerState( CompleteConstLedgerStatePtr newLedgerState) @@ -2073,38 +2084,148 @@ LedgerManagerImpl::advanceLastClosedLedgerState( releaseAssert(threadIsMain()); releaseAssert(newLedgerState); - if (mLastClosedLedgerState) { - CLOG_DEBUG( - Ledger, "Advancing LCL: {} -> {}", - ledgerAbbrev( - mLastClosedLedgerState->getLastClosedLedgerHeader().header), - ledgerAbbrev(newLedgerState->getLastClosedLedgerHeader().header)); + JITTER_INJECT_DELAY(); + SharedLockExclusive lock(mLedgerStateSnapshotMutex); + JITTER_INJECT_DELAY(); + if (mLastClosedLedgerState) + { + CLOG_DEBUG( + Ledger, "Advancing LCL: {} -> {}", + ledgerAbbrev( + mLastClosedLedgerState->getLastClosedLedgerHeader().header), + ledgerAbbrev( + newLedgerState->getLastClosedLedgerHeader().header)); + } + mLastClosedLedgerState = newLedgerState; } - mLastClosedLedgerState = newLedgerState; + + // Push new state to QueryServer (after releasing + // mLedgerStateSnapshotMutex to avoid nested lock acquisition). + mApp.getCommandHandler().addSnapshot(newLedgerState); } CompleteConstLedgerStatePtr -LedgerManagerImpl::advanceBucketListSnapshotAndMakeLedgerState( - LedgerHeader const& header, HistoryArchiveState const& has) +LedgerManagerImpl::buildLedgerState( + LedgerHeader const& header, HistoryArchiveState const& has, + std::optional sorobanConfig) { - auto ledgerHash = xdrSha256(header); + mApplyState.threadInvariant(); + auto& bm = mApp.getBucketManager(); LedgerHeaderHistoryEntry lcl; lcl.header = header; - lcl.hash = ledgerHash; + lcl.hash = xdrSha256(header); - auto& bm = mApp.getBucketManager(); - // Updating BL snapshot is thread-safe - bm.getBucketSnapshotManager().updateCurrentSnapshot( - bm.getLiveBucketList(), bm.getHotArchiveBucketList(), header); + if (sorobanConfig) + { + // Caller already loaded config (e.g. from LTX during ledger close) + return std::make_shared( + bm.getLiveBucketList(), bm.getHotArchiveBucketList(), lcl, has, + std::move(sorobanConfig)); + } + + // Auto-load SorobanNetworkConfig from the BucketList + return CompleteConstLedgerState::createAndMaybeLoadConfig( + bm.getLiveBucketList(), bm.getHotArchiveBucketList(), lcl, has, + mApp.getMetrics()); +} + +CompleteConstLedgerStatePtr +LedgerManagerImpl::advanceApplySnapshotAndMakeLedgerState( + LedgerHeader const& header, HistoryArchiveState const& has, + std::optional sorobanConfig) +{ + auto state = buildLedgerState(header, has, std::move(sorobanConfig)); + mApplyState.setLedgerState(state); + return state; +} + +LedgerStateSnapshot +LedgerManagerImpl::copyLedgerStateSnapshot() const +{ + // Apply thread must use the ApplyState's copyLedgerStateSnapshot. + releaseAssert(!mApp.threadIsType(Application::ThreadType::APPLY)); - return std::make_shared( - bm.getBucketSnapshotManager().copySearchableLiveBucketListSnapshot(), - bm.getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(), - lcl, has); + JITTER_INJECT_DELAY(); + SharedLockShared guard(mLedgerStateSnapshotMutex); + JITTER_INJECT_DELAY(); + releaseAssert(mLastClosedLedgerState); + return LedgerStateSnapshot(mLastClosedLedgerState, mApp.getMetrics()); } + +ApplyLedgerStateSnapshot +LedgerManagerImpl::copyApplyLedgerStateSnapshot() const +{ + // Apply-thread state may be ahead of mLastClosedLedgerState during + // parallel ledger close, so always read from ApplyState. + mApplyState.threadInvariant(); + return mApplyState.copyLedgerStateSnapshot(); +} + +void +LedgerManagerImpl::maybeUpdateLedgerStateSnapshot( + LedgerStateSnapshot& snapshot) const +{ + JITTER_INJECT_DELAY(); + SharedLockShared guard(mLedgerStateSnapshotMutex); + JITTER_INJECT_DELAY(); + + releaseAssert(mLastClosedLedgerState); + if (snapshot.getLedgerSeq() != + mLastClosedLedgerState->getLastClosedLedgerHeader().header.ledgerSeq) + { + snapshot = + LedgerStateSnapshot(mLastClosedLedgerState, mApp.getMetrics()); + } +} + +void +LedgerManagerImpl::ApplyState::setLedgerState(CompleteConstLedgerStatePtr state) +{ + assertWritablePhase(); + mLedgerState = std::move(state); +} + +CompleteConstLedgerStatePtr +LedgerManagerImpl::ApplyState::getLedgerState() const +{ + releaseAssert(mLedgerState); + return mLedgerState; +} + +ApplyLedgerStateSnapshot +LedgerManagerImpl::ApplyState::copyLedgerStateSnapshot() const +{ + releaseAssert(mLedgerState); + return ApplyLedgerStateSnapshot(mLedgerState, mAppConnector.getMetrics()); +} + +#ifdef BUILD_TESTS +void +LedgerManagerImpl::updateCanonicalStateForTesting(LedgerHeader const& header) +{ + releaseAssert(threadIsMain()); + + HistoryArchiveState has; + has.currentLedger = header.ledgerSeq; + + CompleteConstLedgerStatePtr state; + { + JITTER_INJECT_DELAY(); + SharedLockExclusive lock(mLedgerStateSnapshotMutex); + JITTER_INJECT_DELAY(); + + state = buildLedgerState(header, has, /*sorobanConfig=*/std::nullopt); + + mApplyState.setLedgerStateForTesting(state); + + mLastClosedLedgerState = state; + } + + mApp.getCommandHandler().addSnapshot(state); +} +#endif } std::vector @@ -2293,9 +2414,9 @@ LedgerManagerImpl::applyThread( app, *threadState, config, ledgerInfo, txBundle.getResPayload(), getSorobanMetrics(), txSubSeed, txBundle.getEffects()); - if (res.getSuccess()) + if (res) { - threadState->commitChangesFromSuccessfulTx(res, txBundle); + threadState->commitChangesFromSuccessfulTx(*res, txBundle); } else { @@ -2328,8 +2449,6 @@ LedgerManagerImpl::applySorobanStageClustersInParallel( std::vector>> threadFutures; - auto liveSnapshot = app.copySearchableLiveBucketListSnapshot(); - DeactivateScopeGuard globalStateDeactivateGuard(globalState); for (size_t i = 0; i < stage.numClusters(); ++i) @@ -2433,7 +2552,8 @@ LedgerManagerImpl::applySorobanStages(AppConnector& app, AbstractLedgerTxn& ltx, { ZoneScoped; GlobalParallelApplyLedgerState globalParState( - app, ltx, stages, mApplyState.getInMemorySorobanState(), sorobanConfig); + app, mApplyState.copyLedgerStateSnapshot(), ltx, stages, + mApplyState.getInMemorySorobanState(), sorobanConfig); // LedgerTxn is not passed into applySorobanStage, so there's no risk // of the header being updated while we apply the stages. auto const& header = ltx.loadHeader().current(); @@ -2595,11 +2715,6 @@ LedgerManagerImpl::applyTransactions( mApplyState.getMetrics().mStagesPerLedger.set_count(applyStages.size()); } -#ifdef BUILD_TESTS - releaseAssert(ledgerCloseMeta); - mLastLedgerCloseMeta = *ledgerCloseMeta; -#endif - logTxApplyMetrics(ltx, numTxs, numOps); return txResultSet; } @@ -2791,11 +2906,8 @@ LedgerManagerImpl::storePersistentStateAndLedgerHeaderInDB( { ZoneScoped; - Hash hash = xdrSha256(header); - releaseAssert(!isZero(hash)); + releaseAssert(!isZero(xdrSha256(header))); auto& sess = mApp.getLedgerTxnRoot().getSession(); - mApp.getPersistentState().setMainState(PersistentState::kLastClosedLedger, - binToHex(hash), sess); if (mApp.getConfig().ARTIFICIALLY_DELAY_LEDGER_CLOSE_FOR_TESTING.count() > 0) @@ -2825,7 +2937,11 @@ LedgerManagerImpl::storePersistentStateAndLedgerHeaderInDB( mApp.getPersistentState().setMainState( PersistentState::kHistoryArchiveState, has.toString(), sess); - LedgerHeaderUtils::storeInDatabase(mApp.getDatabase(), header, sess); + + std::string headerEncoded = LedgerHeaderUtils::encodeHeader(header); + mApp.getPersistentState().setMainState( + PersistentState::kLastClosedLedgerHeader, headerEncoded, sess); + if (appendToCheckpoint) { mApp.getHistoryManager().appendLedgerHeader(header); @@ -2835,11 +2951,9 @@ LedgerManagerImpl::storePersistentStateAndLedgerHeaderInDB( } // NB: This is a separate method so a testing subclass can override it. -void +std::optional LedgerManagerImpl::finalizeLedgerTxnChanges( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, LedgerHeader lh, uint32_t initialLedgerVers) { @@ -2878,9 +2992,9 @@ LedgerManagerImpl::finalizeLedgerTxnChanges( } mApp.getInvariantManager().checkOnLedgerCommit( - lclSnapshot, lclHotArchiveSnapshot, - evictedState.archivedEntries, evictedState.deletedKeys, - restoredHotArchiveKeyMap, ltx.getRestoredLiveBucketListKeys()); + lclSnapshot, evictedState.archivedEntries, + evictedState.deletedKeys, restoredHotArchiveKeyMap, + ltx.getRestoredLiveBucketListKeys()); bool isP24UpgradeLedger = protocolVersionIsBefore(initialLedgerVers, @@ -2890,7 +3004,7 @@ LedgerManagerImpl::finalizeLedgerTxnChanges( if (isP24UpgradeLedger && gIsProductionNetwork) { p23_hot_archive_bug::addHotArchiveBatchWithP23HotArchiveFix( - ltx, mApp, lh, evictedState.archivedEntries, + ltx, mApp, lclSnapshot, lh, evictedState.archivedEntries, restoredHotArchiveKeys); } else @@ -2904,7 +3018,8 @@ LedgerManagerImpl::finalizeLedgerTxnChanges( { mApp.getProtocol23CorruptionDataVerifier() ->verifyArchivalOfCorruptedEntry( - evictedState, mApp, lh.ledgerSeq, lh.ledgerVersion); + evictedState, lclSnapshot, lh.ledgerSeq, + lh.ledgerVersion); } } } @@ -2942,13 +3057,12 @@ LedgerManagerImpl::finalizeLedgerTxnChanges( deadEntries); mApplyState.updateInMemorySorobanState(initEntries, liveEntries, deadEntries, lh, finalSorobanConfig); + return finalSorobanConfig; } CompleteConstLedgerStatePtr LedgerManagerImpl::sealLedgerTxnAndStoreInBucketsAndDB( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, uint32_t initialLedgerVers) { @@ -2984,23 +3098,24 @@ LedgerManagerImpl::sealLedgerTxnAndStoreInBucketsAndDB( // protocol version prior to the upgrade. Due to this, we must check the // initial protocol version of ledger instead of the ledger version of // the current ltx header, which may have been modified via an upgrade. - finalizeLedgerTxnChanges(lclSnapshot, lclHotArchiveSnapshot, ltx, - ledgerCloseMeta, ledgerHeader, initialLedgerVers); + auto sorobanConfig = finalizeLedgerTxnChanges( + lclSnapshot, ltx, ledgerCloseMeta, ledgerHeader, initialLedgerVers); CompleteConstLedgerStatePtr res; - ltx.unsealHeader([this, &res](LedgerHeader& lh) { + ltx.unsealHeader([this, &res, sorobanConfig = std::move(sorobanConfig)]( + LedgerHeader& lh) mutable { mApp.getBucketManager().snapshotLedger(lh); auto has = storePersistentStateAndLedgerHeaderInDB( lh, /* appendToCheckpoint */ true); - res = advanceBucketListSnapshotAndMakeLedgerState(lh, has); + res = advanceApplySnapshotAndMakeLedgerState(lh, has, + std::move(sorobanConfig)); }); releaseAssert(res); if (protocolVersionStartsFrom( initialLedgerVers, REUSABLE_SOROBAN_MODULE_CACHE_PROTOCOL_VERSION)) { - mApplyState.maybeRebuildModuleCache(res->getBucketSnapshot(), - initialLedgerVers); + mApplyState.maybeRebuildModuleCache(initialLedgerVers); } return res; diff --git a/src/ledger/LedgerManagerImpl.h b/src/ledger/LedgerManagerImpl.h index faa7ba5ffb..c0c938d31b 100644 --- a/src/ledger/LedgerManagerImpl.h +++ b/src/ledger/LedgerManagerImpl.h @@ -4,8 +4,7 @@ #pragma once -#include "util/asio.h" - +#include "bucket/BucketListSnapshot.h" #include "bucket/BucketManager.h" #include "history/HistoryManager.h" #include "ledger/InMemorySorobanState.h" @@ -159,6 +158,9 @@ class LedgerManagerImpl : public LedgerManager AppConnector& mAppConnector; + // Ledger state snapshot that is the base for current ledger apply + CompleteConstLedgerStatePtr mLedgerState; + // The current reusable / inter-ledger soroban module cache. ::rust::Box mModuleCache; @@ -181,11 +183,10 @@ class LedgerManagerImpl : public LedgerManager Phase mPhase{Phase::SETTING_UP_STATE}; // Kicks off (on auxiliary threads) compilation of all contracts in the - // provided snapshot, for ledger protocols starting at minLedgerVersion - // and running through to Config::CURRENT_LEDGER_PROTOCOL_VERSION (to - // enable upgrades). - void startCompilingAllContracts(SearchableSnapshotConstPtr snap, - uint32_t minLedgerVersion); + // apply state snapshot, for ledger protocols starting at + // minLedgerVersion and running through to + // Config::CURRENT_LEDGER_PROTOCOL_VERSION (to enable upgrades). + void startCompilingAllContracts(uint32_t minLedgerVersion); // Checks if ApplyState can currently be modified. For functions that // are only called in ledgerClose, use the stronger @@ -211,6 +212,7 @@ class LedgerManagerImpl : public LedgerManager ::rust::Box const& getModuleCacheForTesting(); uint64_t getSorobanInMemoryStateSizeForTesting() const; + void setLedgerStateForTesting(CompleteConstLedgerStatePtr state); #endif ::rust::Box const& @@ -236,14 +238,12 @@ class LedgerManagerImpl : public LedgerManager // Equivalent to calling `startCompilingAllContracts` followed by // `finishPendingCompilation`. - void compileAllContractsInLedger(SearchableSnapshotConstPtr snap, - uint32_t minLedgerVersion); + void compileAllContractsInLedger(uint32_t minLedgerVersion); // Estimates the size of the arena underlying the module cache's shared // wasmi engine, from metrics, and rebuilds if it has likely built up a // lot of dead space inside of it. - void maybeRebuildModuleCache(SearchableSnapshotConstPtr snap, - uint32_t minLedgerVersion); + void maybeRebuildModuleCache(uint32_t minLedgerVersion); // Evicts a single contract from the module cache, if it is present. // This should be done whenever a contract LE is evicted from the @@ -258,12 +258,17 @@ class LedgerManagerImpl : public LedgerManager // Populates all live Soroban state into the cache from the provided // snapshot. - void populateInMemorySorobanState(SearchableSnapshotConstPtr snap, - uint32_t ledgerVersion); + void populateInMemorySorobanState(); void handleUpgradeAffectingSorobanInMemoryStateSize( AbstractLedgerTxn& upgradeLtx); + // Advance the ledger state to the provided snapshot. + void setLedgerState(CompleteConstLedgerStatePtr state); + + CompleteConstLedgerStatePtr getLedgerState() const; + ApplyLedgerStateSnapshot copyLedgerStateSnapshot() const; + // Throws if current state is not READY_TO_APPLY, advances to APPLYING void markStartOfApplying(); @@ -290,17 +295,24 @@ class LedgerManagerImpl : public LedgerManager // that gets accessed via the AppConnector, from inside transactions. ApplyState mApplyState; - // Cached LCL state output from last apply (or loaded from DB on startup). - CompleteConstLedgerStatePtr mLastClosedLedgerState; + // We maintain two (potentially different) ledger state snapshots, one for + // the apply thread, and one for everyone else, managed by the main thread. + // mLastClosedLedgerState is managed by the main thread and is copyable + // by all threads (except for apply). This is protected by + // mLedgerStateSnapshotMutex. + // When background apply is enabled, the apply thread will advance it's own + // snapshot immediately after applying a ledger, then post the result back + // to main thread. This means the apply snapshot may be ahead of + // mLastClosedLedgerState at any given point. + mutable ANNOTATED_SHARED_MUTEX(mLedgerStateSnapshotMutex); + CompleteConstLedgerStatePtr + mLastClosedLedgerState GUARDED_BY(mLedgerStateSnapshotMutex); VirtualClock::time_point mLastClose; // Use mutex to guard ledger state during apply - mutable RecursiveMutex mLedgerStateMutex -#ifdef THREAD_SAFETY - ACQUIRED_BEFORE(BucketManager::mBucketMutex) -#endif - ; + ANNOTATED_RECURSIVE_MUTEX(mLedgerStateMutex, + ACQUIRED_BEFORE(BucketManager::mBucketMutex)); medida::Timer& mCatchupDuration; @@ -382,9 +394,7 @@ class LedgerManagerImpl : public LedgerManager // On the ledger in which a protocol upgrade from vN to vN + 1 occurs, // initialLedgerVers must be vN. CompleteConstLedgerStatePtr sealLedgerTxnAndStoreInBucketsAndDB( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, uint32_t initialLedgerVers); @@ -392,22 +402,12 @@ class LedgerManagerImpl : public LedgerManager storePersistentStateAndLedgerHeaderInDB(LedgerHeader const& header, bool appendToCheckpoint); - // Copies in-memory Soroban state for snapshot invariant if required for - // this ledger, or returns nullptr otherwise. Should be called in - // READY_TO_APPLY phase when InMemorySorobanState is read only. - // Also clears the snapshot trigger flag to prevent race conditions. - std::shared_ptr - maybeCopySorobanStateForInvariant(); - - // Trigger snapshot invariant on background thread if - // inMemorySnapshotForInvariant is not null. - // If runInParallel is false, runs on the calling thread (this is useful in - // certain scenarios such as startup) + // If the invariant timer has fired, copies the in-memory Soroban state and + // the apply-state snapshot, then kicks off the snapshot invariant check. + // If runInParallel is false, runs on the calling thread (useful at + // startup). void maybeRunSnapshotInvariantFromLedgerState( - CompleteConstLedgerStatePtr const& ledgerState, - std::shared_ptr - inMemorySnapshotForInvariant, - bool runInParallel = true) const; + ApplyLedgerStateSnapshot const& ledgerState, bool runInParallel = true); static void prefetchTransactionData(AbstractLedgerTxnParent& rootLtx, ApplicableTxSetFrame const& txSet, @@ -451,19 +451,24 @@ class LedgerManagerImpl : public LedgerManager // NB: LedgerHeader is a copy here to prevent footguns in case ltx // invalidates any header references - virtual void finalizeLedgerTxnChanges( - SearchableSnapshotConstPtr lclSnapshot, - SearchableHotArchiveSnapshotConstPtr lclHotArchiveSnapshot, - AbstractLedgerTxn& ltx, + virtual std::optional finalizeLedgerTxnChanges( + ApplyLedgerStateSnapshot const& lclSnapshot, AbstractLedgerTxn& ltx, std::unique_ptr const& ledgerCloseMeta, LedgerHeader lh, uint32_t initialLedgerVers); - // Update bucket list snapshot, and construct LedgerState return - // value, which contains all information relevant to ledger state (HAS, - // ledger header, network config, bucketlist snapshot). + // Build a new CompleteConstLedgerState from the current BucketLists, + // copying then updating historical snapshots from prevState. If + // sorobanConfig is not provided, it is loaded from a temporary bucket + // snapshot when the protocol requires it. CompleteConstLedgerStatePtr - advanceBucketListSnapshotAndMakeLedgerState(LedgerHeader const& header, - HistoryArchiveState const& has); + buildLedgerState(LedgerHeader const& header, HistoryArchiveState const& has, + std::optional sorobanConfig); + + // Build a new ledger state and advance ApplyState snapshot to it. This does + // not yet publish or post the new snapshot to the main thread. + CompleteConstLedgerStatePtr advanceApplySnapshotAndMakeLedgerState( + LedgerHeader const& header, HistoryArchiveState const& has, + std::optional sorobanConfig); void logTxApplyMetrics(AbstractLedgerTxn& ltx, size_t numTxs, size_t numOps); @@ -514,7 +519,6 @@ class LedgerManagerImpl : public LedgerManager void storeCurrentLedgerForTest(LedgerHeader const& header) override; std::function mAdvanceLedgerStateAndPublishOverride; InMemorySorobanState const& getInMemorySorobanStateForTesting() override; - CompleteConstLedgerStatePtr getLastClosedLedgerStateForTesting() override; ::rust::Box getModuleCacheForTesting() override; void rebuildInMemorySorobanStateForTesting(uint32_t ledgerVersion) override; @@ -540,17 +544,14 @@ class LedgerManagerImpl : public LedgerManager void applyLedger(LedgerCloseData const& ledgerData, bool calledViaExternalize) override; - void advanceLedgerStateAndPublish( - uint32_t ledgerSeq, bool calledViaExternalize, - LedgerCloseData const& ledgerData, - CompleteConstLedgerStatePtr newLedgerState, bool queueRebuildNeeded, - std::shared_ptr - inMemorySnapshotForInvariant = nullptr) override; + void + advanceLedgerStateAndPublish(uint32_t ledgerSeq, bool calledViaExternalize, + LedgerCloseData const& ledgerData, + CompleteConstLedgerStatePtr newLedgerState, + bool queueRebuildNeeded) override; void ledgerCloseComplete(uint32_t lcl, bool calledViaExternalize, LedgerCloseData const& ledgerData, - bool queueRebuildNeeded, - std::shared_ptr - inMemorySnapshotForInvariant); + bool queueRebuildNeeded); void setLastClosedLedger(LedgerHeaderHistoryEntry const& lastClosed, bool rebuildInMemoryState) override; @@ -560,10 +561,17 @@ class LedgerManagerImpl : public LedgerManager void maybeResetLedgerCloseMetaDebugStream(uint32_t ledgerSeq); SorobanMetrics& getSorobanMetrics() override; - SearchableSnapshotConstPtr getLastClosedSnapshot() const override; + LedgerStateSnapshot copyLedgerStateSnapshot() const override; + ApplyLedgerStateSnapshot copyApplyLedgerStateSnapshot() const override; + void maybeUpdateLedgerStateSnapshot( + LedgerStateSnapshot& snapshot) const override; +#ifdef BUILD_TESTS + void updateCanonicalStateForTesting(LedgerHeader const& header) override; +#endif virtual bool isApplying() const override { + releaseAssert(threadIsMain()); return mCurrentlyApplyingLedger; } void markApplyStateReset() override; diff --git a/src/ledger/LedgerStateSnapshot.cpp b/src/ledger/LedgerStateSnapshot.cpp index c1a78b9ef2..7b7ad97bd4 100644 --- a/src/ledger/LedgerStateSnapshot.cpp +++ b/src/ledger/LedgerStateSnapshot.cpp @@ -4,12 +4,14 @@ #include "ledger/LedgerStateSnapshot.h" #include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" +#include "bucket/HotArchiveBucketList.h" +#include "bucket/LiveBucketList.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "main/Application.h" #include "transactions/TransactionFrame.h" #include "transactions/TransactionUtils.h" +#include "util/ProtocolVersion.h" #include "xdr/Stellar-ledger.h" namespace stellar @@ -71,23 +73,10 @@ LedgerHeaderWrapper::LedgerHeaderWrapper(LedgerTxnHeader&& header) { } -LedgerHeaderWrapper::LedgerHeaderWrapper(std::shared_ptr header) - : mHeader(header) -{ -} - -LedgerHeader& -LedgerHeaderWrapper::currentToModify() +LedgerHeaderWrapper::LedgerHeaderWrapper( + std::shared_ptr header) + : mHeader(std::move(header)) { - switch (mHeader.index()) - { - case 0: - return std::get<0>(mHeader).current(); - case 1: - return *std::get<1>(mHeader); - default: - throw std::runtime_error("Invalid LedgerHeaderWrapper index"); - } } LedgerHeader const& @@ -161,184 +150,314 @@ LedgerTxnReadOnly::load(LedgerKey const& key) const void LedgerTxnReadOnly::executeWithMaybeInnerSnapshot( - std::function f) const + std::function f) const { LedgerTxn inner(mLedgerTxn); - LedgerSnapshot lsg(inner); - return f(lsg); + LedgerReadView lrv(inner); + return f(lrv); } -BucketSnapshotState::BucketSnapshotState(SearchableSnapshotConstPtr snapshot) - : mSnapshot(snapshot) - , mLedgerHeader(LedgerHeaderWrapper( - std::make_shared(mSnapshot->getLedgerHeader()))) +LedgerReadView::LedgerReadView(AbstractLedgerTxn& ltx) + : mGetter(std::make_unique(ltx)) { } -BucketSnapshotState::~BucketSnapshotState() +LedgerReadView::LedgerReadView(Application& app) { + releaseAssert(threadIsMain()); +#ifdef BUILD_TESTS + if (app.getConfig().MODE_USES_IN_MEMORY_LEDGER) + { + // Legacy read-only SQL transaction + mLegacyLedgerTxn = std::make_unique( + app.getLedgerTxnRoot(), /* shouldUpdateLastModified*/ false, + TransactionMode::READ_ONLY_WITHOUT_SQL_TXN); + mGetter = std::make_unique(*mLegacyLedgerTxn); + } + else +#endif + { + mGetter = std::make_unique( + app.getLedgerManager().copyLedgerStateSnapshot()); + } } -LedgerHeaderWrapper -BucketSnapshotState::getLedgerHeader() const +LedgerReadView::LedgerReadView(LedgerStateSnapshot const& snap) + : mGetter(std::make_unique(snap)) { - return LedgerHeaderWrapper(std::get<1>(mLedgerHeader.mHeader)); } -LedgerEntryWrapper -BucketSnapshotState::getAccount(AccountID const& account) const +LedgerHeaderWrapper +LedgerReadView::getLedgerHeader() const { - return LedgerEntryWrapper(mSnapshot->load(accountKey(account))); + return mGetter->getLedgerHeader(); } LedgerEntryWrapper -BucketSnapshotState::getAccount(LedgerHeaderWrapper const& header, - TransactionFrame const& tx) const +LedgerReadView::getAccount(AccountID const& account) const { - return getAccount(tx.getSourceID()); + return mGetter->getAccount(account); } LedgerEntryWrapper -BucketSnapshotState::getAccount(LedgerHeaderWrapper const& header, - TransactionFrame const& tx, - AccountID const& AccountID) const +LedgerReadView::load(LedgerKey const& key) const { - return getAccount(AccountID); + return mGetter->load(key); } -LedgerEntryWrapper -BucketSnapshotState::load(LedgerKey const& key) const +void +LedgerReadView::executeWithMaybeInnerSnapshot( + std::function f) const { - return LedgerEntryWrapper(mSnapshot->load(key)); + return mGetter->executeWithMaybeInnerSnapshot(f); } void -BucketSnapshotState::executeWithMaybeInnerSnapshot( - std::function f) const +CompleteConstLedgerState::checkInvariant() const { - throw std::runtime_error( - "BucketSnapshotState::executeWithMaybeInnerSnapshot is illegal: " - "BucketSnapshotState has no nested snapshots"); + releaseAssert(mLastClosedHistoryArchiveState.currentLedger == + mLastClosedLedgerHeader.header.ledgerSeq); + releaseAssert(mLiveBucketData); + releaseAssert(mHotArchiveBucketData); } -LedgerSnapshot::LedgerSnapshot(AbstractLedgerTxn& ltx) - : mGetter(std::make_unique(ltx)) +CompleteConstLedgerState::CompleteConstLedgerState( + LiveBucketList const& liveBL, HotArchiveBucketList const& hotArchiveBL, + LedgerHeaderHistoryEntry const& lcl, HistoryArchiveState const& has, + std::optional sorobanConfig) + : mLiveBucketData( + std::make_shared>(liveBL)) + , mHotArchiveBucketData( + std::make_shared>( + hotArchiveBL)) + , mSorobanConfig(std::move(sorobanConfig)) + , mLastClosedLedgerHeader(lcl) + , mLastClosedHistoryArchiveState(has) { + checkInvariant(); } -LedgerSnapshot::LedgerSnapshot(Application& app) +SorobanNetworkConfig const& +CompleteConstLedgerState::getSorobanConfig() const +{ + return mSorobanConfig.value(); +} + +bool +CompleteConstLedgerState::hasSorobanConfig() const +{ + return mSorobanConfig.has_value(); +} + +LedgerHeaderHistoryEntry const& +CompleteConstLedgerState::getLastClosedLedgerHeader() const +{ + return mLastClosedLedgerHeader; +} + +HistoryArchiveState const& +CompleteConstLedgerState::getLastClosedHistoryArchiveState() const +{ + return mLastClosedHistoryArchiveState; +} + +CompleteConstLedgerStatePtr +CompleteConstLedgerState::createAndMaybeLoadConfig( + LiveBucketList const& liveBL, HotArchiveBucketList const& hotArchiveBL, + LedgerHeaderHistoryEntry const& lcl, HistoryArchiveState const& has, + MetricsRegistry& metrics) +{ + std::optional sorobanConfig; + if (protocolVersionStartsFrom(lcl.header.ledgerVersion, + SOROBAN_PROTOCOL_VERSION)) + { + // Bootstrap: build a lightweight temporary state just to load config + // from the current live bucket list. + auto tempState = std::make_shared( + liveBL, hotArchiveBL, lcl, has, /*sorobanConfig*/ std::nullopt); + LedgerStateSnapshot tempSnap(tempState, metrics); + sorobanConfig = SorobanNetworkConfig::loadFromLedger(tempSnap); + } + return std::make_shared( + liveBL, hotArchiveBL, lcl, has, std::move(sorobanConfig)); +} + +LedgerStateSnapshot::LedgerStateSnapshot(CompleteConstLedgerStatePtr state, + MetricsRegistry& metrics) + : mState(state) + , mLiveSnapshot(metrics, state->mLiveBucketData) + , mHotArchiveSnapshot(metrics, state->mHotArchiveBucketData) + , mMetrics(metrics) +{ +} + +// LedgerStateSnapshot load functions are not thread safe and should only be +// called by a singled thread. We cached the initial caller PID and assert +// following calls are from the same thread. Note: This only applies to +// functions that load from Buckets, ledger header and other const state queries +// are thread safe. +void +LedgerStateSnapshot::threadInvariant() const { - releaseAssert(threadIsMain()); #ifdef BUILD_TESTS - if (app.getConfig().MODE_USES_IN_MEMORY_LEDGER) + auto current = std::this_thread::get_id(); + if (mThreadId == std::thread::id{}) { - // Legacy read-only SQL transaction - mLegacyLedgerTxn = std::make_unique( - app.getLedgerTxnRoot(), /* shouldUpdateLastModified*/ false, - TransactionMode::READ_ONLY_WITHOUT_SQL_TXN); - mGetter = std::make_unique(*mLegacyLedgerTxn); + mThreadId = current; } else + { + releaseAssert(mThreadId == current); + } #endif - mGetter = std::make_unique( - app.getLedgerManager().getLastClosedSnapshot()); } -LedgerSnapshot::LedgerSnapshot(SearchableSnapshotConstPtr snapshot) - : mGetter(std::make_unique(snapshot)) +CompleteConstLedgerState const& +LedgerStateSnapshot::getState() const { + releaseAssert(mState); + return *mState; } LedgerHeaderWrapper -LedgerSnapshot::getLedgerHeader() const +LedgerStateSnapshot::getLedgerHeader() const { - return mGetter->getLedgerHeader(); + // Avoid copying the header by aliasing the lifetime to mState shared_ptr + return LedgerHeaderWrapper(std::shared_ptr( + mState, &mState->getLastClosedLedgerHeader().header)); +} + +uint32_t +LedgerStateSnapshot::getLedgerSeq() const +{ + return mState->getLastClosedLedgerHeader().header.ledgerSeq; } LedgerEntryWrapper -LedgerSnapshot::getAccount(AccountID const& account) const +LedgerStateSnapshot::getAccount(AccountID const& account) const { - return mGetter->getAccount(account); + threadInvariant(); + return LedgerEntryWrapper(loadLiveEntry(accountKey(account))); } LedgerEntryWrapper -LedgerSnapshot::load(LedgerKey const& key) const +LedgerStateSnapshot::getAccount(LedgerHeaderWrapper const& header, + TransactionFrame const& tx) const { - return mGetter->load(key); + threadInvariant(); + return getAccount(tx.getSourceID()); } -void -LedgerSnapshot::executeWithMaybeInnerSnapshot( - std::function f) const +LedgerEntryWrapper +LedgerStateSnapshot::getAccount(LedgerHeaderWrapper const& header, + TransactionFrame const& tx, + AccountID const& AccountID) const { - return mGetter->executeWithMaybeInnerSnapshot(f); + threadInvariant(); + return getAccount(AccountID); +} + +LedgerEntryWrapper +LedgerStateSnapshot::load(LedgerKey const& key) const +{ + threadInvariant(); + return LedgerEntryWrapper(loadLiveEntry(key)); } void -CompleteConstLedgerState::checkInvariant() const +LedgerStateSnapshot::executeWithMaybeInnerSnapshot( + std::function f) const { - releaseAssert(mLastClosedHistoryArchiveState.currentLedger == - mLastClosedLedgerHeader.header.ledgerSeq); - if (mLastClosedLedgerHeader.header.ledgerSeq > 0) - { - releaseAssert(mBucketSnapshot->getLedgerHeader() == - mLastClosedLedgerHeader.header); - } + throw std::runtime_error( + "LedgerStateSnapshot::executeWithMaybeInnerSnapshot is illegal: " + "LedgerStateSnapshot has no nested snapshots"); } -CompleteConstLedgerState::CompleteConstLedgerState( - SearchableSnapshotConstPtr searchableSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, - LedgerHeaderHistoryEntry const& lastClosedLedgerHeader, - HistoryArchiveState const& lastClosedHistoryArchiveState) - : mBucketSnapshot(searchableSnapshot) - , mHotArchiveSnapshot(hotArchiveSnapshot) - , mSorobanConfig( - protocolVersionStartsFrom(lastClosedLedgerHeader.header.ledgerVersion, - SOROBAN_PROTOCOL_VERSION) - ? std::make_optional( - SorobanNetworkConfig::loadFromLedger(searchableSnapshot)) - : std::nullopt) - , mLastClosedLedgerHeader(lastClosedLedgerHeader) - , mLastClosedHistoryArchiveState(lastClosedHistoryArchiveState) +// === Live BucketList wrapper methods === + +std::shared_ptr +LedgerStateSnapshot::loadLiveEntry(LedgerKey const& k) const { - checkInvariant(); + threadInvariant(); + return mLiveSnapshot.load(k); } -SearchableSnapshotConstPtr -CompleteConstLedgerState::getBucketSnapshot() const +std::vector +LedgerStateSnapshot::loadLiveKeys( + std::set const& inKeys, + std::string const& label) const { - return mBucketSnapshot; + threadInvariant(); + return mLiveSnapshot.loadKeys(inKeys, label); } -SearchableHotArchiveSnapshotConstPtr -CompleteConstLedgerState::getHotArchiveSnapshot() const +std::vector +LedgerStateSnapshot::loadPoolShareTrustLinesByAccountAndAsset( + AccountID const& accountID, Asset const& asset) const { - return mHotArchiveSnapshot; + threadInvariant(); + return mLiveSnapshot.loadPoolShareTrustLinesByAccountAndAsset(accountID, + asset); } -SorobanNetworkConfig const& -CompleteConstLedgerState::getSorobanConfig() const +std::vector +LedgerStateSnapshot::loadInflationWinners(size_t maxWinners, + int64_t minBalance) const { - return mSorobanConfig.value(); + threadInvariant(); + return mLiveSnapshot.loadInflationWinners(maxWinners, minBalance); } -bool -CompleteConstLedgerState::hasSorobanConfig() const +std::unique_ptr +LedgerStateSnapshot::scanForEviction(uint32_t ledgerSeq, + EvictionMetrics& metrics, + EvictionIterator iter, + std::shared_ptr stats, + StateArchivalSettings const& sas, + uint32_t ledgerVers) const { - return mSorobanConfig.has_value(); + threadInvariant(); + return mLiveSnapshot.scanForEviction(ledgerSeq, metrics, std::move(iter), + std::move(stats), sas, ledgerVers); } -LedgerHeaderHistoryEntry const& -CompleteConstLedgerState::getLastClosedLedgerHeader() const +void +LedgerStateSnapshot::scanLiveEntriesOfType( + LedgerEntryType type, + std::function callback) const { - return mLastClosedLedgerHeader; + threadInvariant(); + mLiveSnapshot.scanForEntriesOfType(type, std::move(callback)); } -HistoryArchiveState const& -CompleteConstLedgerState::getLastClosedHistoryArchiveState() const +// === Hot Archive BucketList wrapper methods === + +std::shared_ptr +LedgerStateSnapshot::loadArchiveEntry(LedgerKey const& k) const { - return mLastClosedHistoryArchiveState; + threadInvariant(); + return mHotArchiveSnapshot.load(k); } +std::vector +LedgerStateSnapshot::loadArchiveKeys( + std::set const& inKeys) const +{ + threadInvariant(); + return mHotArchiveSnapshot.loadKeys(inKeys); +} + +void +LedgerStateSnapshot::scanAllArchiveEntries( + std::function callback) const +{ + threadInvariant(); + mHotArchiveSnapshot.scanAllEntries(std::move(callback)); +} + +ApplyLedgerStateSnapshot::ApplyLedgerStateSnapshot( + CompleteConstLedgerStatePtr state, MetricsRegistry& metrics) + : LedgerStateSnapshot(std::move(state), metrics) +{ +} } diff --git a/src/ledger/LedgerStateSnapshot.h b/src/ledger/LedgerStateSnapshot.h index cbbc5fb6ec..fb87fb6367 100644 --- a/src/ledger/LedgerStateSnapshot.h +++ b/src/ledger/LedgerStateSnapshot.h @@ -5,11 +5,12 @@ #pragma once #include "bucket/BucketListSnapshot.h" -#include "bucket/BucketSnapshotManager.h" #include "history/HistoryArchive.h" #include "ledger/LedgerTxn.h" #include "ledger/NetworkConfig.h" #include "util/NonCopyable.h" +#include +#include #include namespace stellar @@ -17,8 +18,16 @@ namespace stellar class Application; class TransactionFrame; -class LedgerSnapshot; +class LedgerReadView; +class ApplyLedgerStateSnapshot; class CompleteConstLedgerState; +class EvictionStatistics; +struct EvictionMetrics; +struct EvictionResultCandidates; +struct InflationWinner; +struct StateArchivalSettings; +class LiveBucketList; +class HotArchiveBucketList; // NB: we can't use unique_ptr here, because this object gets passed to a // lambda, and std::function requires its callable to be copyable (C++23 fixes @@ -52,13 +61,11 @@ class LedgerEntryWrapper // cosmetic for BucketList snapshots, since those are immutable. class LedgerHeaderWrapper { - std::variant> mHeader; - friend class BucketSnapshotState; + std::variant> mHeader; public: explicit LedgerHeaderWrapper(LedgerTxnHeader&& header); - explicit LedgerHeaderWrapper(std::shared_ptr header); - LedgerHeader& currentToModify(); + explicit LedgerHeaderWrapper(std::shared_ptr header); LedgerHeader const& current() const; LedgerTxnHeader const& getLedgerTxnHeader() const @@ -86,7 +93,7 @@ class AbstractLedgerStateSnapshot // to support the replay of old buggy protocols (<8), see // `TransactionFrame::loadSourceAccount` virtual void executeWithMaybeInnerSnapshot( - std::function f) const = 0; + std::function f) const = 0; }; // A concrete implementation of read-only SQL snapshot wrapper @@ -109,23 +116,38 @@ class LedgerTxnReadOnly : public AbstractLedgerStateSnapshot AccountID const& AccountID) const override; LedgerEntryWrapper load(LedgerKey const& key) const override; void executeWithMaybeInnerSnapshot( - std::function f) const override; + std::function f) const override; }; -// A concrete implementation of read-only BucketList snapshot wrapper -class BucketSnapshotState : public AbstractLedgerStateSnapshot +// A copyable value type that provides searchable access to a +// CompleteConstLedgerState. Each instance maintains its own file stream cache +// for bucket I/O. Multiple LedgerStateSnapshot instances can safely wrap the +// same CompleteConstLedgerState. +class LedgerStateSnapshot : public virtual AbstractLedgerStateSnapshot { - SearchableSnapshotConstPtr const mSnapshot; - // Store a copy of the header from mSnapshot. This is needed for - // validation flow where for certain validation scenarios the header needs - // to be modified - LedgerHeaderWrapper mLedgerHeader; + std::shared_ptr mState; + SearchableLiveBucketListSnapshot mLiveSnapshot; + SearchableHotArchiveBucketListSnapshot mHotArchiveSnapshot; + std::reference_wrapper mMetrics; + +#ifdef BUILD_TESTS + mutable std::thread::id mThreadId{}; +#endif + + void threadInvariant() const; + + friend class CompleteConstLedgerState; public: - BucketSnapshotState(SearchableSnapshotConstPtr snapshot); - ~BucketSnapshotState() override; + // Construct from CompleteConstLedgerState + explicit LedgerStateSnapshot(CompleteConstLedgerStatePtr state, + MetricsRegistry& metrics); + CompleteConstLedgerState const& getState() const; LedgerHeaderWrapper getLedgerHeader() const override; + uint32_t getLedgerSeq() const; + + // === AbstractLedgerStateSnapshot overrides === LedgerEntryWrapper getAccount(AccountID const& account) const override; LedgerEntryWrapper getAccount(LedgerHeaderWrapper const& header, TransactionFrame const& tx) const override; @@ -134,25 +156,79 @@ class BucketSnapshotState : public AbstractLedgerStateSnapshot AccountID const& AccountID) const override; LedgerEntryWrapper load(LedgerKey const& key) const override; void executeWithMaybeInnerSnapshot( - std::function f) const override; + std::function f) const override; + + // === Live BucketList methods === + std::shared_ptr loadLiveEntry(LedgerKey const& k) const; + std::vector + loadLiveKeys(std::set const& inKeys, + std::string const& label) const; + std::vector + loadPoolShareTrustLinesByAccountAndAsset(AccountID const& accountID, + Asset const& asset) const; + std::vector loadInflationWinners(size_t maxWinners, + int64_t minBalance) const; + std::unique_ptr scanForEviction( + uint32_t ledgerSeq, EvictionMetrics& metrics, EvictionIterator iter, + std::shared_ptr stats, + StateArchivalSettings const& sas, uint32_t ledgerVers) const; + void scanLiveEntriesOfType( + LedgerEntryType type, + std::function callback) const; + + // === Hot Archive BucketList methods === + std::shared_ptr + loadArchiveEntry(LedgerKey const& k) const; + std::vector + loadArchiveKeys(std::set const& inKeys) const; + void scanAllArchiveEntries( + std::function callback) const; +}; + +// A strong typedef for LedgerStateSnapshot that represents a snapshot used +// during apply time. This is identical to LedgerStateSnapshot in practice, but +// is a distinct type to prevent accidental interchange between apply-time +// snapshots and other snapshots (e.g., from mLastClosedLedgerState). +class ApplyLedgerStateSnapshot : private LedgerStateSnapshot, + public virtual AbstractLedgerStateSnapshot +{ + public: + explicit ApplyLedgerStateSnapshot(CompleteConstLedgerStatePtr state, + MetricsRegistry& metrics); + + using LedgerStateSnapshot::executeWithMaybeInnerSnapshot; + using LedgerStateSnapshot::getAccount; + using LedgerStateSnapshot::getLedgerHeader; + using LedgerStateSnapshot::getLedgerSeq; + using LedgerStateSnapshot::getState; + using LedgerStateSnapshot::load; + using LedgerStateSnapshot::loadArchiveEntry; + using LedgerStateSnapshot::loadArchiveKeys; + using LedgerStateSnapshot::loadInflationWinners; + using LedgerStateSnapshot::loadLiveEntry; + using LedgerStateSnapshot::loadLiveKeys; + using LedgerStateSnapshot::loadPoolShareTrustLinesByAccountAndAsset; + using LedgerStateSnapshot::scanAllArchiveEntries; + using LedgerStateSnapshot::scanForEviction; + using LedgerStateSnapshot::scanLiveEntriesOfType; }; // A helper class to create and query read-only snapshots // Automatically decides whether to create a BucketList (recommended), or SQL // snapshot (deprecated, but currently supported) -// NOTE: LedgerSnapshot is meant to be short-lived, and should not be persisted +// NOTE: LedgerReadView is meant to be short-lived, and should not be persisted // across _different_ ledgers, as the state under the hood might change. Users -// are expected to construct a new LedgerSnapshot each time they want to query +// are expected to construct a new LedgerReadView each time they want to query // ledger state. -class LedgerSnapshot : public NonMovableOrCopyable +class LedgerReadView : public NonMovableOrCopyable { std::unique_ptr mGetter; std::unique_ptr mLegacyLedgerTxn; public: - LedgerSnapshot(AbstractLedgerTxn& ltx); - LedgerSnapshot(Application& app); - explicit LedgerSnapshot(SearchableSnapshotConstPtr snapshot); + LedgerReadView(AbstractLedgerTxn& ltx); + LedgerReadView(Application& app); + explicit LedgerReadView(LedgerStateSnapshot const& snap); LedgerHeaderWrapper getLedgerHeader() const; LedgerEntryWrapper getAccount(AccountID const& account) const; LedgerEntryWrapper @@ -173,7 +249,7 @@ class LedgerSnapshot : public NonMovableOrCopyable // to support the replay of old buggy protocols (<8), see // `TransactionFrame::loadSourceAccount` void executeWithMaybeInnerSnapshot( - std::function f) const; + std::function f) const; }; // Immutable wrapper for a complete ledger state snapshot. @@ -195,23 +271,37 @@ class LedgerSnapshot : public NonMovableOrCopyable class CompleteConstLedgerState : public NonMovableOrCopyable { private: - SearchableSnapshotConstPtr const mBucketSnapshot; - SearchableHotArchiveSnapshotConstPtr const mHotArchiveSnapshot; + // Raw immutable bucket data for the live and hot archive bucket lists + std::shared_ptr const> const + mLiveBucketData; + std::shared_ptr const> const + mHotArchiveBucketData; + std::optional const mSorobanConfig; LedgerHeaderHistoryEntry const mLastClosedLedgerHeader; HistoryArchiveState const mLastClosedHistoryArchiveState; void checkInvariant() const; + friend class LedgerStateSnapshot; + public: - CompleteConstLedgerState( - SearchableSnapshotConstPtr searchableSnapshot, - SearchableHotArchiveSnapshotConstPtr hotArchiveSnapshot, - LedgerHeaderHistoryEntry const& lastClosedLedgerHeader, - HistoryArchiveState const& lastClosedHistoryArchiveState); - - SearchableSnapshotConstPtr getBucketSnapshot() const; - SearchableHotArchiveSnapshotConstPtr getHotArchiveSnapshot() const; + // Construct a new immutable ledger state snapshot. + // sorobanConfig is nullopt for pre-Soroban protocol versions, or when + // building the empty initial state at startup. + CompleteConstLedgerState(LiveBucketList const& liveBL, + HotArchiveBucketList const& hotArchiveBL, + LedgerHeaderHistoryEntry const& lcl, + HistoryArchiveState const& has, + std::optional sorobanConfig); + + // Factory: constructs a CompleteConstLedgerState, auto-loading the + // SorobanNetworkConfig from the bucket list when the protocol requires it. + static CompleteConstLedgerStatePtr createAndMaybeLoadConfig( + LiveBucketList const& liveBL, HotArchiveBucketList const& hotArchiveBL, + LedgerHeaderHistoryEntry const& lcl, HistoryArchiveState const& has, + MetricsRegistry& metrics); + SorobanNetworkConfig const& getSorobanConfig() const; bool hasSorobanConfig() const; LedgerHeaderHistoryEntry const& getLastClosedLedgerHeader() const; diff --git a/src/ledger/LedgerTxn.cpp b/src/ledger/LedgerTxn.cpp index 5523cd2c5d..2e4df90ce4 100644 --- a/src/ledger/LedgerTxn.cpp +++ b/src/ledger/LedgerTxn.cpp @@ -251,11 +251,10 @@ RestoredEntries::addLiveBucketlistRestore(LedgerKey const& key, } void -RestoredEntries::addRestoresFrom(RestoredEntries const& other, - bool allowDuplicates) +RestoredEntries::addRestoresFrom(RestoredEntries const& other) { ZoneScoped; - // This method is called from three different call sites. In 2 of them it is + // This method is called from three different call sites. In all three it is // correct to assert that each restore is new/disjoint from any existing // restore: // @@ -272,19 +271,19 @@ RestoredEntries::addRestoresFrom(RestoredEntries const& other, // entry -- it'd be a concurrency bug if not! -- so there should not be // any other restores of the same entry from other threads. // - // In the third place we're committing from an ltx to its parent, and the - // ltx was actually starting with a copy of the restored-maps from the - // parent, so there are going to be duplicates. We allow duplicates in that - // case. - for (auto kvp : other.hotArchive) + // - In the third call site we're committing from a child ltx to its + // parent. Since child LedgerTxns only track their own restores (they + // do not start with a copy of the parent's restored entries), there + // should be no duplicates. + for (auto const& kvp : other.hotArchive) { auto [_, inserted] = hotArchive.emplace(kvp.first, kvp.second); - releaseAssert(inserted || allowDuplicates); + releaseAssert(inserted); } - for (auto kvp : other.liveBucketList) + for (auto const& kvp : other.liveBucketList) { auto [_, inserted] = liveBucketList.emplace(kvp.first, kvp.second); - releaseAssert(inserted || allowDuplicates); + releaseAssert(inserted); } } @@ -435,15 +434,6 @@ LedgerTxn::Impl::Impl(LedgerTxn& self, AbstractLedgerTxnParent& parent, , mConsistency(LedgerTxnConsistency::EXACT) , mActiveThreadId(std::this_thread::get_id()) { - for (auto const& [key, entry] : mParent.getRestoredHotArchiveKeys()) - { - mRestoredEntries.hotArchive.emplace(key, entry); - } - for (auto const& [key, entry] : mParent.getRestoredLiveBucketListKeys()) - { - mRestoredEntries.liveBucketList.emplace(key, entry); - } - mParent.addChild(self, mode); } @@ -703,10 +693,7 @@ LedgerTxn::Impl::commitChild(EntryIterator iter, printErrorAndAbort("unknown fatal error during commit to LedgerTxn"); } - // The child will have started with a copy of the parents mRestoredEntries, - // so we can see duplicates here, but duplicate restores would've been - // caught during restoration in the restoreFrom* functions. - mRestoredEntries.addRestoresFrom(restoredEntries, /*allowDuplicates=*/true); + mRestoredEntries.addRestoresFrom(restoredEntries); // std::unique_ptr<...>::swap does not throw mHeader.swap(childHeader); @@ -915,6 +902,41 @@ LedgerTxn::Impl::markRestoredFromHotArchive(LedgerEntry const& ledgerEntry, addKey(ttlEntry); } +void +LedgerTxn::markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry) +{ + getImpl()->markRestoredFromLiveBucketList(ledgerEntry, ttlEntry); +} + +void +LedgerTxn::Impl::markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry) +{ + abortIfWrongThread("markRestoredFromLiveBucketList"); + throwIfSealed(); + throwIfChild(); + + if (!isPersistentEntry(ledgerEntry.data)) + { + throw std::runtime_error( + "Key type not supported for live BucketList restore"); + } + + // Mark the keys as restored + auto addKey = [this](LedgerEntry const& entry) { + auto [_, inserted] = mRestoredEntries.liveBucketList.emplace( + LedgerEntryKey(entry), entry); + if (!inserted) + { + throw std::runtime_error( + "Key already restored from Live BucketList"); + } + }; + addKey(ledgerEntry); + addKey(ttlEntry); +} + LedgerTxnEntry LedgerTxn::restoreFromLiveBucketList(LedgerEntry const& entry, uint32_t ttl) { @@ -2734,10 +2756,10 @@ LedgerTxnRoot::Impl::Impl(Application& app, , mEntryCache(entryCacheSize) , mBulkLoadBatchSize(prefetchBatchSize) , mChild(nullptr) + , mThreadInvariant() #ifdef BEST_OFFER_DEBUGGING , mBestOfferDebuggingEnabled(bestOfferDebuggingEnabled) #endif - , mThreadInvariant() { } @@ -2962,8 +2984,8 @@ LedgerTxnRoot::Impl::commitChild(EntryIterator iter, mPrefetchHits = 0; mPrefetchMisses = 0; - // std::shared_ptr<...>::reset does not throw - mSearchableBucketListSnapshot.reset(); + // std::optional<...>::reset does not throw + mLedgerStateSnapshot.reset(); mThreadInvariant.clearActiveThread(); } @@ -3070,8 +3092,8 @@ LedgerTxnRoot::Impl::prefetch(UnorderedSet const& keys) { insertIfNotLoaded(keysToSearch, key); } - auto blLoad = getSearchableLiveBucketListSnapshot().loadKeys(keysToSearch, - "prefetch"); + auto blLoad = + getLedgerStateSnapshot().loadLiveKeys(keysToSearch, "prefetch"); cacheResult(populateLoadedEntries(keysToSearch, blLoad)); return total; @@ -3342,18 +3364,16 @@ LedgerTxnRoot::Impl::areEntriesMissingInCacheForOffer(OfferEntry const& oe) return false; } -SearchableLiveBucketListSnapshot const& -LedgerTxnRoot::Impl::getSearchableLiveBucketListSnapshot() const +ApplyLedgerStateSnapshot const& +LedgerTxnRoot::Impl::getLedgerStateSnapshot() const { - if (!mSearchableBucketListSnapshot) + if (!mLedgerStateSnapshot) { - mSearchableBucketListSnapshot = - mApp.getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + mLedgerStateSnapshot = + mApp.getLedgerManager().copyApplyLedgerStateSnapshot(); } - return *mSearchableBucketListSnapshot; + return *mLedgerStateSnapshot; } std::shared_ptr @@ -3489,8 +3509,8 @@ LedgerTxnRoot::Impl::getPoolShareTrustLinesByAccountAndAsset( try { trustLines = - getSearchableLiveBucketListSnapshot() - .loadPoolShareTrustLinesByAccountAndAsset(account, asset); + getLedgerStateSnapshot().loadPoolShareTrustLinesByAccountAndAsset( + account, asset); } catch (std::exception& e) { @@ -3540,8 +3560,8 @@ LedgerTxnRoot::Impl::getInflationWinners(size_t maxWinners, int64_t minVotes) { try { - return getSearchableLiveBucketListSnapshot().loadInflationWinners( - maxWinners, minVotes); + return getLedgerStateSnapshot().loadInflationWinners(maxWinners, + minVotes); } catch (std::exception& e) { @@ -3626,7 +3646,7 @@ LedgerTxnRoot::Impl::getNewestVersion(InternalLedgerKey const& gkey) const } else { - entry = getSearchableLiveBucketListSnapshot().load(key); + entry = getLedgerStateSnapshot().loadLiveEntry(key); } } catch (std::exception& e) @@ -3695,7 +3715,7 @@ LedgerTxnRoot::Impl::rollbackChild() noexcept mChild = nullptr; mPrefetchHits = 0; mPrefetchMisses = 0; - mSearchableBucketListSnapshot.reset(); + mLedgerStateSnapshot.reset(); mThreadInvariant.clearActiveThread(); } diff --git a/src/ledger/LedgerTxn.h b/src/ledger/LedgerTxn.h index e044edc4ef..b9decf389b 100644 --- a/src/ledger/LedgerTxn.h +++ b/src/ledger/LedgerTxn.h @@ -359,8 +359,7 @@ struct RestoredEntries LedgerEntry const& entry, LedgerKey const& ttlKey, LedgerEntry const& ttlEntry); - void addRestoresFrom(RestoredEntries const& other, - bool allowDuplicates = false); + void addRestoresFrom(RestoredEntries const& other); }; class AbstractLedgerTxn; @@ -617,6 +616,13 @@ class AbstractLedgerTxn : public AbstractLedgerTxnParent // restored. This just adds the information to the map tracking entries // restored from the hot archive. The actual restoration of the entry is // handled separately. + // - markRestoredFromLiveBucketList: + // Indicates that an entry in the live BucketList is being restored. + // Used by the parallel apply path to signal to LedgerTxn that the + // entry and TTL should be treated as if they have been restored. This + // just adds the information to the map tracking entries restored from + // the live BucketList. The actual restoration of the entry is handled + // separately. // All of these functions throw if the AbstractLedgerTxn is sealed or if // the AbstractLedgerTxn has a child. virtual LedgerTxnHeader loadHeader() = 0; @@ -626,6 +632,9 @@ class AbstractLedgerTxn : public AbstractLedgerTxnParent uint32_t ttl) = 0; virtual void markRestoredFromHotArchive(LedgerEntry const& ledgerEntry, LedgerEntry const& ttlEntry) = 0; + virtual void + markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry) = 0; virtual LedgerTxnEntry load(InternalLedgerKey const& key) = 0; virtual ConstLedgerTxnEntry loadWithoutRecord(InternalLedgerKey const& key) = 0; @@ -774,6 +783,8 @@ class LedgerTxn : public AbstractLedgerTxn uint32_t ttl) override; void markRestoredFromHotArchive(LedgerEntry const& ledgerEntry, LedgerEntry const& ttlEntry) override; + void markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry) override; UnorderedMap getAllOffers() override; diff --git a/src/ledger/LedgerTxnImpl.h b/src/ledger/LedgerTxnImpl.h index 7e9c9b1e3d..95f46b042b 100644 --- a/src/ledger/LedgerTxnImpl.h +++ b/src/ledger/LedgerTxnImpl.h @@ -4,12 +4,11 @@ #pragma once -#include "bucket/BucketSnapshotManager.h" #include "database/Database.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "util/RandomEvictionCache.h" #include "util/UnorderedSet.h" -#include #include #ifdef USE_POSTGRES #include @@ -360,9 +359,18 @@ class LedgerTxn::Impl // markRestoredFromHotArchive has the basic exception safety guarantee. If // it throws an exception, then + // - the restored entries map may contain only a partial record (e.g. the + // data entry without its corresponding TTL entry). void markRestoredFromHotArchive(LedgerEntry const& ledgerEntry, LedgerEntry const& ttlEntry); + // markRestoredFromLiveBucketList has the basic exception safety guarantee. + // If it throws an exception, then + // - the restored entries map may contain only a partial record (e.g. the + // data entry without its corresponding TTL entry). + void markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry); + // restoreFromLiveBucketList has the basic exception safety guarantee. If it // throws an exception, then LedgerTxnEntry restoreFromLiveBucketList(LedgerTxn& self, @@ -620,7 +628,7 @@ class LedgerTxnRoot::Impl mutable BestOffers mBestOffers; mutable uint64_t mPrefetchHits{0}; mutable uint64_t mPrefetchMisses{0}; - mutable SearchableSnapshotConstPtr mSearchableBucketListSnapshot; + mutable std::optional mLedgerStateSnapshot; size_t mBulkLoadBatchSize; std::unique_ptr mTransaction; @@ -689,8 +697,7 @@ class LedgerTxnRoot::Impl bool areEntriesMissingInCacheForOffer(OfferEntry const& oe); - SearchableLiveBucketListSnapshot const& - getSearchableLiveBucketListSnapshot() const; + ApplyLedgerStateSnapshot const& getLedgerStateSnapshot() const; public: // Constructor has the strong exception safety guarantee diff --git a/src/ledger/NetworkConfig.cpp b/src/ledger/NetworkConfig.cpp index f127ea2dc2..882fa08a20 100644 --- a/src/ledger/NetworkConfig.cpp +++ b/src/ledger/NetworkConfig.cpp @@ -8,8 +8,10 @@ #include "bucket/test/BucketTestUtils.h" #include "ledger/LedgerStateSnapshot.h" #include "main/Application.h" +#include "util/Logging.h" #include "util/ProtocolVersion.h" #include "util/numeric.h" +#include "util/types.h" #include #ifdef BUILD_TESTS @@ -632,7 +634,6 @@ updateCpuCostParamsEntryForV25(AbstractLedgerTxn& ltxRoot) void updateCpuCostParamsEntryForV26(AbstractLedgerTxn& ltxRoot) { -#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION LedgerTxn ltx(ltxRoot); LedgerKey key(CONFIG_SETTING); @@ -691,7 +692,6 @@ updateCpuCostParamsEntryForV26(AbstractLedgerTxn& ltxRoot) } } ltx.commit(); -#endif } ConfigSettingEntry @@ -1134,7 +1134,6 @@ updateMemCostParamsEntryForV25(AbstractLedgerTxn& ltxRoot) void updateMemCostParamsEntryForV26(AbstractLedgerTxn& ltxRoot) { -#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION LedgerTxn ltx(ltxRoot); LedgerKey key(CONFIG_SETTING); @@ -1188,7 +1187,6 @@ updateMemCostParamsEntryForV26(AbstractLedgerTxn& ltxRoot) } ltx.commit(); -#endif } ConfigSettingEntry @@ -1485,6 +1483,93 @@ SorobanNetworkConfig::isValidConfigSettingEntry(ConfigSettingEntry const& cfg, MaximumSorobanNetworkConfig:: BALLOT_TIMEOUT_INCREMENT_MILLISECONDS; break; + case ConfigSettingID::CONFIG_SETTING_FROZEN_LEDGER_KEYS: + // The frozen keys entry itself is always valid (it's just a list of + // encoded keys). But it cannot be directly upgraded — only the delta + // mechanism is allowed. + valid = protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_26); + break; + case ConfigSettingID::CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA: + { + valid = protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_26); + if (valid) + { + auto const& delta = cfg.frozenLedgerKeysDelta(); + auto validateEncodedKeys = + [](xdr::xvector const& encodedKeys, + char const* keySetName) -> bool { + for (auto const& encodedKey : encodedKeys) + { + try + { + LedgerKey lk; + xdr::xdr_from_opaque(encodedKey, lk); + // Only ACCOUNT, TRUSTLINE, CONTRACT_DATA, + // CONTRACT_CODE are valid + switch (lk.type()) + { + case ACCOUNT: + case CONTRACT_DATA: + case CONTRACT_CODE: + break; + case TRUSTLINE: + // Trustline keys for liquidity pool shares and + // issuer trustlines are not allowed to be frozen. + if (lk.trustLine().asset.type() == + ASSET_TYPE_POOL_SHARE || + isIssuer(lk.trustLine().accountID, + lk.trustLine().asset)) + { + return false; + } + break; + default: + return false; + } + } + catch (xdr::xdr_runtime_error const& e) + { + CLOG_WARNING( + Herder, + "Got bad upgrade: failed to decode {} in " + "CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA: {}", + keySetName, e.what()); + return false; + } + catch (std::exception const& e) + { + CLOG_WARNING( + Herder, + "Got bad upgrade: exception validating {} in " + "CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA: {}", + keySetName, e.what()); + return false; + } + catch (...) + { + CLOG_WARNING(Herder, + "Got bad upgrade: unknown exception " + "validating {} in " + "CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA", + keySetName); + return false; + } + } + return true; + }; + valid = validateEncodedKeys(delta.keysToFreeze, "keysToFreeze") && + validateEncodedKeys(delta.keysToUnfreeze, "keysToUnfreeze"); + } + break; + } + case ConfigSettingID::CONFIG_SETTING_FREEZE_BYPASS_TXS: + // The bypass tx hashes entry itself is always valid. Similar to frozen + // keys, it cannot be directly upgraded — only via delta. + valid = protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_26); + break; + case ConfigSettingID::CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA: + valid = protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_26); + break; default: break; } @@ -1507,7 +1592,9 @@ SorobanNetworkConfig::isNonUpgradeableConfigSettingEntry( // never be changed via upgrade return cfg == ConfigSettingID::CONFIG_SETTING_LIVE_SOROBAN_STATE_SIZE_WINDOW || - cfg == ConfigSettingID::CONFIG_SETTING_EVICTION_ITERATOR; + cfg == ConfigSettingID::CONFIG_SETTING_EVICTION_ITERATOR || + cfg == ConfigSettingID::CONFIG_SETTING_FROZEN_LEDGER_KEYS || + cfg == ConfigSettingID::CONFIG_SETTING_FREEZE_BYPASS_TXS; } void @@ -1659,11 +1746,12 @@ SorobanNetworkConfig::initializeGenesisLedgerForTesting( if (protocolVersionStartsFrom(genesisLedgerProtocol, ProtocolVersion::V_26)) { SorobanNetworkConfig::updateCostTypesForV26(ltx, app); + SorobanNetworkConfig::createLedgerEntriesForV26(ltx, app); } } SorobanNetworkConfig -SorobanNetworkConfig::loadFromLedger(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadFromLedger(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; SorobanNetworkConfig config; @@ -1689,24 +1777,22 @@ SorobanNetworkConfig::loadFromLedger(LedgerSnapshot const& ls) config.loadLedgerCostExtConfig(ls); config.loadSCPTimingConfig(ls); } + if (protocolVersionStartsFrom(protocolVersion, ProtocolVersion::V_26)) + { + config.loadFrozenLedgerKeys(ls); + config.loadFreezeBypassTxs(ls); + } // NB: this should follow loading/updating state size window // size and state archival settings config.computeRentWriteFee(protocolVersion); return config; } -SorobanNetworkConfig -SorobanNetworkConfig::loadFromLedger(SearchableSnapshotConstPtr snapshot) -{ - LedgerSnapshot ls(snapshot); - return SorobanNetworkConfig::loadFromLedger(ls); -} - SorobanNetworkConfig SorobanNetworkConfig::loadFromLedger(AbstractLedgerTxn& ltx) { - LedgerSnapshot ls(ltx); - return SorobanNetworkConfig::loadFromLedger(ls); + LedgerTxnReadOnly snap(ltx); + return SorobanNetworkConfig::loadFromLedger(snap); } #ifdef BUILD_TESTS @@ -1718,7 +1804,7 @@ SorobanNetworkConfig::emptyConfig() #endif void -SorobanNetworkConfig::loadMaxContractSize(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadMaxContractSize(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1732,7 +1818,8 @@ SorobanNetworkConfig::loadMaxContractSize(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadMaxContractDataKeySize(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadMaxContractDataKeySize( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1747,7 +1834,8 @@ SorobanNetworkConfig::loadMaxContractDataKeySize(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadMaxContractDataEntrySize(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadMaxContractDataEntrySize( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1762,7 +1850,7 @@ SorobanNetworkConfig::loadMaxContractDataEntrySize(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadComputeSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadComputeSettings(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1781,7 +1869,8 @@ SorobanNetworkConfig::loadComputeSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadLedgerAccessSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadLedgerAccessSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1828,7 +1917,8 @@ SorobanNetworkConfig::loadLedgerAccessSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadHistoricalSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadHistoricalSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1844,7 +1934,8 @@ SorobanNetworkConfig::loadHistoricalSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadContractEventsSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadContractEventsSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1860,7 +1951,8 @@ SorobanNetworkConfig::loadContractEventsSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadBandwidthSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadBandwidthSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1877,7 +1969,7 @@ SorobanNetworkConfig::loadBandwidthSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadCpuCostParams(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadCpuCostParams(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1891,7 +1983,7 @@ SorobanNetworkConfig::loadCpuCostParams(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadMemCostParams(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadMemCostParams(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1905,7 +1997,8 @@ SorobanNetworkConfig::loadMemCostParams(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadExecutionLanesSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadExecutionLanesSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1921,7 +2014,8 @@ SorobanNetworkConfig::loadExecutionLanesSettings(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadLiveSorobanStateSizeWindow(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadLiveSorobanStateSizeWindow( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1951,7 +2045,8 @@ SorobanNetworkConfig::loadLiveSorobanStateSizeWindow(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadEvictionIterator(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadEvictionIterator( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -1964,7 +2059,8 @@ SorobanNetworkConfig::loadEvictionIterator(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadParallelComputeConfig(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadParallelComputeConfig( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; LedgerKey key(CONFIG_SETTING); @@ -1979,7 +2075,8 @@ SorobanNetworkConfig::loadParallelComputeConfig(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadLedgerCostExtConfig(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadLedgerCostExtConfig( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; LedgerKey key(CONFIG_SETTING); @@ -1994,7 +2091,7 @@ SorobanNetworkConfig::loadLedgerCostExtConfig(LedgerSnapshot const& ls) } void -SorobanNetworkConfig::loadSCPTimingConfig(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadSCPTimingConfig(AbstractLedgerStateSnapshot const& ls) { ZoneScoped; LedgerKey key(CONFIG_SETTING); @@ -2035,7 +2132,8 @@ SorobanNetworkConfig::maxContractDataEntrySizeBytes() const } void -SorobanNetworkConfig::loadStateArchivalSettings(LedgerSnapshot const& ls) +SorobanNetworkConfig::loadStateArchivalSettings( + AbstractLedgerStateSnapshot const& ls) { ZoneScoped; @@ -2424,6 +2522,91 @@ SorobanNetworkConfig::maxLedgerResources() const return Resource(limits); } +bool +SorobanNetworkConfig::hasFrozenKeys() const +{ + return !mFrozenLedgerKeys.empty(); +} + +bool +SorobanNetworkConfig::isKeyFrozen(LedgerKey const& key) const +{ + return mFrozenLedgerKeys.find(key) != mFrozenLedgerKeys.end(); +} + +bool +SorobanNetworkConfig::isFreezeBypassTx(Hash const& txHash) const +{ + return mFreezeBypassTxs.find(txHash) != mFreezeBypassTxs.end(); +} + +void +SorobanNetworkConfig::loadFrozenLedgerKeys( + AbstractLedgerStateSnapshot const& ls) +{ + ZoneScoped; + mFrozenLedgerKeys.clear(); + + LedgerKey key(CONFIG_SETTING); + key.configSetting().configSettingID = CONFIG_SETTING_FROZEN_LEDGER_KEYS; + auto le = ls.load(key); + releaseAssertOrThrow(le); + + auto const& frozenKeys = + le.current().data.configSetting().frozenLedgerKeys().keys; + for (auto const& encodedKey : frozenKeys) + { + LedgerKey lk; + xdr::xdr_from_opaque(encodedKey, lk); + mFrozenLedgerKeys.insert(lk); + } +} + +void +SorobanNetworkConfig::loadFreezeBypassTxs(AbstractLedgerStateSnapshot const& ls) +{ + ZoneScoped; + mFreezeBypassTxs.clear(); + + LedgerKey key(CONFIG_SETTING); + key.configSetting().configSettingID = CONFIG_SETTING_FREEZE_BYPASS_TXS; + auto le = ls.load(key); + releaseAssertOrThrow(le); + + auto const& txHashes = + le.current().data.configSetting().freezeBypassTxs().txHashes; + for (auto const& txHash : txHashes) + { + mFreezeBypassTxs.insert(txHash); + } +} + +void +SorobanNetworkConfig::createLedgerEntriesForV26(AbstractLedgerTxn& ltx, + Application& app) +{ + ZoneScoped; + ConfigSettingEntry frozenKeysEntry; + frozenKeysEntry.configSettingID(CONFIG_SETTING_FROZEN_LEDGER_KEYS); + // Start with an empty frozen keys set + frozenKeysEntry.frozenLedgerKeys().keys.clear(); + + ConfigSettingEntry bypassTxsEntry; + bypassTxsEntry.configSettingID(CONFIG_SETTING_FREEZE_BYPASS_TXS); + // Start with an empty bypass tx hash set + bypassTxsEntry.freezeBypassTxs().txHashes.clear(); + + LedgerEntry e; + e.data.type(CONFIG_SETTING); + e.data.configSetting() = frozenKeysEntry; + LedgerTxn inner(ltx); + inner.create(e); + + e.data.configSetting() = bypassTxsEntry; + inner.create(e); + inner.commit(); +} + #ifdef BUILD_TESTS void SorobanNetworkConfig::updateRecalibratedCostTypesForV20( @@ -2611,7 +2794,21 @@ SorobanNetworkConfig::operator==(SorobanNetworkConfig const& other) const mBallotTimeoutInitialMilliseconds == other.ballotTimeoutInitialMilliseconds() && mBallotTimeoutIncrementMilliseconds == - other.ballotTimeoutIncrementMilliseconds(); + other.ballotTimeoutIncrementMilliseconds() && + mFrozenLedgerKeys == other.frozenLedgerKeys() && + mFreezeBypassTxs == other.freezeBypassTxs(); +} + +UnorderedSet const& +SorobanNetworkConfig::frozenLedgerKeys() const +{ + return mFrozenLedgerKeys; +} + +UnorderedSet const& +SorobanNetworkConfig::freezeBypassTxs() const +{ + return mFreezeBypassTxs; } #endif @@ -2639,17 +2836,10 @@ SorobanNetworkConfig::isValidCostParams(ContractCostParams const& params, { return static_cast(ContractCostType::Bn254FrInv) + 1; } -#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION else { return static_cast(ContractCostType::Bn254G1Msm) + 1; } -#else - else - { - return static_cast(ContractCostType::Bn254FrInv) + 1; - } -#endif }; if (params.size() != getNumCostTypes(ledgerVersion)) diff --git a/src/ledger/NetworkConfig.h b/src/ledger/NetworkConfig.h index 0999d57311..f8581ea7c8 100644 --- a/src/ledger/NetworkConfig.h +++ b/src/ledger/NetworkConfig.h @@ -14,8 +14,8 @@ namespace stellar { +class AbstractLedgerStateSnapshot; class Application; -class LedgerSnapshot; // Defines the minimum values allowed for the network configuration // settings during upgrades. An upgrade that does not follow the minimums @@ -261,9 +261,8 @@ class SorobanNetworkConfig { public: // Static factory function to create a SorobanNetworkConfig from ledger - static SorobanNetworkConfig loadFromLedger(LedgerSnapshot const& ls); static SorobanNetworkConfig - loadFromLedger(SearchableSnapshotConstPtr snapshot); + loadFromLedger(AbstractLedgerStateSnapshot const& snap); static SorobanNetworkConfig loadFromLedger(AbstractLedgerTxn& ltx); #ifdef BUILD_TESTS @@ -297,6 +296,12 @@ class SorobanNetworkConfig // upgrade. static void updateCostTypesForV26(AbstractLedgerTxn& ltx, Application& app); + // Creates the new ledger entries introduced in v26. + // This should happen once during the correspondent protocol version + // upgrade. + static void createLedgerEntriesForV26(AbstractLedgerTxn& ltx, + Application& app); + // Creates the new ledger entries introduced in v23 and updates the existing // entries. // This should happen once during the correspondent protocol version @@ -449,6 +454,11 @@ class SorobanNetworkConfig uint32_t ballotTimeoutInitialMilliseconds() const; uint32_t ballotTimeoutIncrementMilliseconds() const; + // Frozen ledger keys + bool hasFrozenKeys() const; + bool isKeyFrozen(LedgerKey const& key) const; + bool isFreezeBypassTx(Hash const& txHash) const; + #ifdef BUILD_TESTS // Update the protocol 20 cost types to match the real network // configuration. @@ -461,28 +471,33 @@ class SorobanNetworkConfig static void updateRecalibratedCostTypesForV20(AbstractLedgerTxn& ltx); bool operator==(SorobanNetworkConfig const& other) const; + + UnorderedSet const& frozenLedgerKeys() const; + UnorderedSet const& freezeBypassTxs() const; #endif private: SorobanNetworkConfig() = default; - void loadMaxContractSize(LedgerSnapshot const& ls); - void loadMaxContractDataKeySize(LedgerSnapshot const& ls); - void loadMaxContractDataEntrySize(LedgerSnapshot const& ls); - void loadComputeSettings(LedgerSnapshot const& ls); - void loadLedgerAccessSettings(LedgerSnapshot const& ls); - void loadHistoricalSettings(LedgerSnapshot const& ls); - void loadContractEventsSettings(LedgerSnapshot const& ls); - void loadBandwidthSettings(LedgerSnapshot const& ls); - void loadCpuCostParams(LedgerSnapshot const& ls); - void loadMemCostParams(LedgerSnapshot const& ls); - void loadStateArchivalSettings(LedgerSnapshot const& ls); - void loadExecutionLanesSettings(LedgerSnapshot const& ls); - void loadLiveSorobanStateSizeWindow(LedgerSnapshot const& ls); - void loadEvictionIterator(LedgerSnapshot const& ls); - void loadParallelComputeConfig(LedgerSnapshot const& ls); - void loadLedgerCostExtConfig(LedgerSnapshot const& ls); - void loadSCPTimingConfig(LedgerSnapshot const& ls); + void loadMaxContractSize(AbstractLedgerStateSnapshot const& ls); + void loadMaxContractDataKeySize(AbstractLedgerStateSnapshot const& ls); + void loadMaxContractDataEntrySize(AbstractLedgerStateSnapshot const& ls); + void loadComputeSettings(AbstractLedgerStateSnapshot const& ls); + void loadLedgerAccessSettings(AbstractLedgerStateSnapshot const& ls); + void loadHistoricalSettings(AbstractLedgerStateSnapshot const& ls); + void loadContractEventsSettings(AbstractLedgerStateSnapshot const& ls); + void loadBandwidthSettings(AbstractLedgerStateSnapshot const& ls); + void loadCpuCostParams(AbstractLedgerStateSnapshot const& ls); + void loadMemCostParams(AbstractLedgerStateSnapshot const& ls); + void loadStateArchivalSettings(AbstractLedgerStateSnapshot const& ls); + void loadExecutionLanesSettings(AbstractLedgerStateSnapshot const& ls); + void loadLiveSorobanStateSizeWindow(AbstractLedgerStateSnapshot const& ls); + void loadEvictionIterator(AbstractLedgerStateSnapshot const& ls); + void loadParallelComputeConfig(AbstractLedgerStateSnapshot const& ls); + void loadLedgerCostExtConfig(AbstractLedgerStateSnapshot const& ls); + void loadSCPTimingConfig(AbstractLedgerStateSnapshot const& ls); + void loadFrozenLedgerKeys(AbstractLedgerStateSnapshot const& ls); + void loadFreezeBypassTxs(AbstractLedgerStateSnapshot const& ls); void computeRentWriteFee(uint32_t protocolVersion); #ifdef BUILD_TESTS @@ -561,6 +576,10 @@ class SorobanNetworkConfig uint32_t mNominationTimeoutIncrementMilliseconds{}; uint32_t mBallotTimeoutInitialMilliseconds{}; uint32_t mBallotTimeoutIncrementMilliseconds{}; + + // Frozen ledger keys + UnorderedSet mFrozenLedgerKeys; + UnorderedSet mFreezeBypassTxs; }; #ifdef BUILD_TESTS diff --git a/src/ledger/P23HotArchiveBug.cpp b/src/ledger/P23HotArchiveBug.cpp index 6a6d66f09a..09e871bb45 100644 --- a/src/ledger/P23HotArchiveBug.cpp +++ b/src/ledger/P23HotArchiveBug.cpp @@ -7,13 +7,11 @@ #include #include -#include "bucket/BucketListSnapshot.h" #include "bucket/BucketManager.h" #include "bucket/BucketUtils.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnImpl.h" -#include "ledger/LedgerTypeUtils.h" -#include "main/AppConnector.h" #include "main/Application.h" #include @@ -36,7 +34,8 @@ using namespace internal; void addHotArchiveBatchWithP23HotArchiveFix( - AbstractLedgerTxn& ltx, Application& app, LedgerHeader header, + AbstractLedgerTxn& ltx, Application& app, + ApplyLedgerStateSnapshot const& snapshot, LedgerHeader header, std::vector const& archivedEntries, std::vector const& restoredEntries) { @@ -49,8 +48,6 @@ addHotArchiveBatchWithP23HotArchiveFix( auto updatedArchivedEntries = archivedEntries; updatedArchivedEntries.reserve(updatedArchivedEntries.size() + P23_CORRUPTED_HOT_ARCHIVE_ENTRIES_COUNT); - auto const& hotArchiveSnapshot = - app.getAppConnector().copySearchableHotArchiveBucketListSnapshot(); for (size_t i = 0; i < P23_CORRUPTED_HOT_ARCHIVE_ENTRIES_COUNT; ++i) { LedgerEntry corruptedEntry = @@ -68,7 +65,7 @@ addHotArchiveBatchWithP23HotArchiveFix( // Hot Archive that match our expectations for the corrupted entries. // Ensure that the entry exists in Hot Archive. - auto hotArchiveEntry = hotArchiveSnapshot->load(corruptedEntryKey); + auto hotArchiveEntry = snapshot.loadArchiveEntry(corruptedEntryKey); if (!hotArchiveEntry) { CLOG_WARNING( @@ -337,8 +334,9 @@ Protocol23CorruptionDataVerifier::verifyRestorationOfCorruptedEntry( void Protocol23CorruptionDataVerifier::verifyArchivalOfCorruptedEntry( - EvictedStateVectors const& evictedState, Application& app, - uint32_t ledgerSeq, uint32_t protocolVersion) + EvictedStateVectors const& evictedState, + ApplyLedgerStateSnapshot const& snapshot, uint32_t ledgerSeq, + uint32_t protocolVersion) { if (!protocolVersionEquals(protocolVersion, ProtocolVersion::V_23)) { @@ -348,13 +346,6 @@ Protocol23CorruptionDataVerifier::verifyArchivalOfCorruptedEntry( // p23 we haven't increased the number of threads. std::lock_guard lock(mMutex); - // This database can load the actual, correct version of a - // given ledger key. This tells us the value that should - // have been evicted. - auto liveDatabase = app.getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - // This is the set of all keys incorrectly evicted for this // ledger auto evictedKeysIter = mEvictedSeqToKeys.find(ledgerSeq); @@ -368,7 +359,7 @@ Protocol23CorruptionDataVerifier::verifyArchivalOfCorruptedEntry( { // Load the correct value from the live database. auto evictedLedgerKey = LedgerEntryKey(evictedEntry); - auto databaseEntry = liveDatabase->load(evictedLedgerKey); + auto databaseEntry = snapshot.loadLiveEntry(evictedLedgerKey); releaseAssert(databaseEntry != nullptr); // If there was a corruption diff --git a/src/ledger/P23HotArchiveBug.h b/src/ledger/P23HotArchiveBug.h index 690620217c..565df5f2d2 100644 --- a/src/ledger/P23HotArchiveBug.h +++ b/src/ledger/P23HotArchiveBug.h @@ -18,6 +18,7 @@ namespace stellar { class Application; class AbstractLedgerTxn; +class ApplyLedgerStateSnapshot; class Config; struct EvictedStateVectors; @@ -86,9 +87,11 @@ class Protocol23CorruptionDataVerifier // This should be called for every eviction that occurs during catchup, // non-corrupted evictions are ignored. // This is thread-safe. - void verifyArchivalOfCorruptedEntry(EvictedStateVectors const& evictedState, - Application& app, uint32_t ledgerSeq, - uint32_t protocolVersion); + void + verifyArchivalOfCorruptedEntry(EvictedStateVectors const& evictedState, + ApplyLedgerStateSnapshot const& snapshot, + uint32_t ledgerSeq, + uint32_t protocolVersion); // Verifies that the batch of Hot Archive fixes on protocol 24 upgrade // corresponds to the expected data (i.e. only entries that were never // restored have been fixed, and that the fix comes back to the correct @@ -171,7 +174,8 @@ class Protocol23CorruptionEventReconciler }; void addHotArchiveBatchWithP23HotArchiveFix( - AbstractLedgerTxn& ltx, Application& app, LedgerHeader header, + AbstractLedgerTxn& ltx, Application& app, + ApplyLedgerStateSnapshot const& snapshot, LedgerHeader header, std::vector const& archivedEntries, std::vector const& restoredEntries); diff --git a/src/ledger/SharedModuleCacheCompiler.cpp b/src/ledger/SharedModuleCacheCompiler.cpp index 3158c31459..e80120400f 100644 --- a/src/ledger/SharedModuleCacheCompiler.cpp +++ b/src/ledger/SharedModuleCacheCompiler.cpp @@ -3,7 +3,6 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "ledger/SharedModuleCacheCompiler.h" -#include "bucket/BucketListSnapshot.h" #include "crypto/Hex.h" #include "crypto/SHA.h" #include "rust/RustBridge.h" @@ -19,14 +18,13 @@ namespace stellar size_t const SharedModuleCacheCompiler::BUFFERED_WASM_CAPACITY = 100 * 1024 * 1024; -// The snapshot is copied here to ensure the background loading thread has its -// own instance since snapshots themselves aren't thread safe. +// The snapshot is passed by copy here to ensure the background loading thread +// has its own instance since snapshots themselves aren't thread safe. SharedModuleCacheCompiler::SharedModuleCacheCompiler( - SearchableSnapshotConstPtr snap, MetricsRegistry& metrics, - size_t numThreads, std::vector const& ledgerVersions) + ApplyLedgerStateSnapshot snap, size_t numThreads, + std::vector const& ledgerVersions) : mModuleCache(rust_bridge::new_module_cache()) - , mSnap(BucketSnapshotManager::copySearchableLiveBucketListSnapshot( - snap, metrics)) + , mSnap(std::move(snap)) , mNumThreads(numThreads) , mLedgerVersions(ledgerVersions) , mStarted(std::chrono::steady_clock::now()) @@ -150,7 +148,7 @@ SharedModuleCacheCompiler::start() std::unordered_set seenContracts; size_t liveContracts{0}; // Note: this access is safe since we only have a single loading thread. - this->mSnap->scanForEntriesOfType( + this->mSnap.scanLiveEntriesOfType( CONTRACT_CODE, [&](BucketEntry const& entry) { Hash h; switch (entry.type()) diff --git a/src/ledger/SharedModuleCacheCompiler.h b/src/ledger/SharedModuleCacheCompiler.h index 40e7d71804..26bc76bd50 100644 --- a/src/ledger/SharedModuleCacheCompiler.h +++ b/src/ledger/SharedModuleCacheCompiler.h @@ -4,7 +4,7 @@ #pragma once -#include "bucket/BucketSnapshotManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "rust/RustBridge.h" #include "util/NonCopyable.h" #include "xdrpp/types.h" @@ -25,7 +25,7 @@ namespace stellar class SharedModuleCacheCompiler : NonMovableOrCopyable { ::rust::Box mModuleCache; - stellar::SearchableSnapshotConstPtr mSnap; + ApplyLedgerStateSnapshot mSnap; std::deque> mWasms; size_t const mNumThreads; @@ -55,8 +55,7 @@ class SharedModuleCacheCompiler : NonMovableOrCopyable bool popAndCompileWasm(size_t thread, std::unique_lock& lock); public: - SharedModuleCacheCompiler(SearchableSnapshotConstPtr snap, - MetricsRegistry& metrics, size_t numThreads, + SharedModuleCacheCompiler(ApplyLedgerStateSnapshot snap, size_t numThreads, std::vector const& ledgerVersions); ~SharedModuleCacheCompiler(); void start(); diff --git a/src/ledger/test/InMemoryLedgerTxn.cpp b/src/ledger/test/InMemoryLedgerTxn.cpp index 8bd3314889..d95e7733f4 100644 --- a/src/ledger/test/InMemoryLedgerTxn.cpp +++ b/src/ledger/test/InMemoryLedgerTxn.cpp @@ -282,6 +282,14 @@ InMemoryLedgerTxn::restoreFromLiveBucketList(LedgerEntry const& entry, "called restoreFromLiveBucketList on InMemoryLedgerTxn"); } +void +InMemoryLedgerTxn::markRestoredFromLiveBucketList( + LedgerEntry const& ledgerEntry, LedgerEntry const& ttlEntry) +{ + throw std::runtime_error( + "called markRestoredFromLiveBucketList on InMemoryLedgerTxn"); +} + LedgerTxnEntry InMemoryLedgerTxn::load(InternalLedgerKey const& key) { diff --git a/src/ledger/test/InMemoryLedgerTxn.h b/src/ledger/test/InMemoryLedgerTxn.h index 8437111d81..ab0c501f89 100644 --- a/src/ledger/test/InMemoryLedgerTxn.h +++ b/src/ledger/test/InMemoryLedgerTxn.h @@ -114,6 +114,8 @@ class InMemoryLedgerTxn : public LedgerTxn void erase(InternalLedgerKey const& key) override; LedgerTxnEntry restoreFromLiveBucketList(LedgerEntry const& entry, uint32_t ttl) override; + void markRestoredFromLiveBucketList(LedgerEntry const& ledgerEntry, + LedgerEntry const& ttlEntry) override; LedgerTxnEntry load(InternalLedgerKey const& key) override; ConstLedgerTxnEntry loadWithoutRecord(InternalLedgerKey const& key) override; diff --git a/src/ledger/test/LedgerCloseMetaStreamTests.cpp b/src/ledger/test/LedgerCloseMetaStreamTests.cpp index a44374fcac..9f009341ae 100644 --- a/src/ledger/test/LedgerCloseMetaStreamTests.cpp +++ b/src/ledger/test/LedgerCloseMetaStreamTests.cpp @@ -357,7 +357,8 @@ TEST_CASE_VERSIONS("meta stream contains reasonable meta", "[ledgerclosemeta]") // Close ledgers until out contract expires. These ledgers won't // emit meta for (uint32_t i = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); + test.getApp().getLedgerManager().getLastClosedLedgerNum() + + 1; i <= liveUntilLedger + 1; ++i) { closeLedgerOn(test.getApp(), i, 2, 1, 2016); diff --git a/src/ledger/test/LedgerStateSnapshotTests.cpp b/src/ledger/test/LedgerStateSnapshotTests.cpp new file mode 100644 index 0000000000..77ad4f3eba --- /dev/null +++ b/src/ledger/test/LedgerStateSnapshotTests.cpp @@ -0,0 +1,1138 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +// Randomized testing for LedgerStateSnapshot, designed to +// stress-test the snapshot interface under concurrent access with timing +// variations to expose race conditions, stale reads, and data inconsistencies. + +#include "test/Catch2.h" + +#include "bucket/BucketBase.h" +#include "bucket/LedgerCmp.h" +#include "bucket/test/BucketTestUtils.h" +#include "ledger/LedgerStateSnapshot.h" +#include "ledger/test/LedgerTestUtils.h" +#include "main/Application.h" +#include "main/CommandHandler.h" +#include "main/QueryServer.h" +#include "test/TestUtils.h" +#include "test/test.h" +#include "util/Logging.h" +#include "util/Math.h" +#include "util/ThreadAnnotations.h" +#include "util/UnorderedMap.h" +#include "util/UnorderedSet.h" +#include "xdr/Stellar-ledger.h" + +#include +#include +#include +#include + +using namespace stellar; +using namespace stellar::BucketTestUtils; + +namespace +{ + +// Types excluded from entry generation (Soroban types need special handling). +std::unordered_set const SOROBAN_TYPES{ + CONFIG_SETTING, CONTRACT_DATA, CONTRACT_CODE, TTL}; + +int const ENTRIES_PER_LEDGER = 20; + +// Pick a random entry from an UnorderedMap by advancing an iterator. +template +std::pair const& +randMapEntry(UnorderedMap const& m, stellar_default_random_engine& rng) +{ + auto it = m.begin(); + std::advance(it, rand_uniform(0, m.size() - 1, rng)); + return *it; +} + +LedgerHeader +makeHeader(uint32_t seq, uint32_t protocolVersion) +{ + LedgerHeader h; + h.ledgerSeq = seq; + h.ledgerVersion = protocolVersion; + return h; +} + +// --------------------------------------------------------------------------- +// All test data is generated up-front before any threads start, so that the +// concurrent phase is purely exercising the snapshot interface — not the RNG +// or entry-generation code. +// +// For N ledger closes starting at startSeq+1: +// entriesPerLedger – the raw entries added at each ledger (fed to +// addBatch by the main thread). +// stateAtLedger – the cumulative expected BucketList state at each +// sequence. stateAtLedger[S] is the union of +// all entries added at ledgers startSeq+1 … S. +// Worker threads sample random entries from this +// to validate both current and historical reads. +// --------------------------------------------------------------------------- +struct PregenData +{ + // Each element is the set of new entries to write to the live BucketList + // for a given ledger, in order. Index 0 = first ledger closed. + std::vector> liveEntriesToWrite; + // Updates to existing live entries for each ledger. + std::vector> liveUpdatesToWrite; + // Same for the hot archive BucketList. + std::vector> archiveEntriesToWrite; + + // Cumulative expected state at each seq (for validating reads). i.e. + // ledgerSeq == 5 will contain a map of all entries added from [0, 5]. + UnorderedMap> stateAtLedger; + UnorderedMap> + hotArchiveStateAtLedger; + + uint32_t startSeq{0}; + uint32_t lastSeq{0}; +}; + +PregenData +pregenEntries(uint32_t startSeq, int numLedgers, int entriesPerLedger) +{ + PregenData data; + data.startSeq = startSeq; + + UnorderedSet seenKeys; + UnorderedSet archiveSeenKeys; + UnorderedMap runningLiveState; + UnorderedMap runningArchiveState; + + for (uint32_t i = 0; i < numLedgers; i++) + { + auto seq = startSeq + 1 + i; + + // --- Live entries --- + // Generate new unique entries for this ledger. + auto entries = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, entriesPerLedger, seenKeys); + for (auto& e : entries) + { + e.lastModifiedLedgerSeq = seq; + runningLiveState[LedgerEntryKey(e)] = e; + } + + // Modify some existing entries so that adjacent ledgers have + // distinguishable data for the same keys. This ensures that loading + // from the wrong snapshot is detected by the data comparison. + std::vector updates; + if (i > 0) + { + int updated = 0; + for (auto& [key, entry] : runningLiveState) + { + if (entry.lastModifiedLedgerSeq < seq) + { + entry.lastModifiedLedgerSeq = seq; + updates.push_back(entry); + if (++updated >= entriesPerLedger / 2) + { + break; + } + } + } + } + + data.stateAtLedger[seq] = runningLiveState; + data.liveEntriesToWrite.push_back(std::move(entries)); + data.liveUpdatesToWrite.push_back(std::move(updates)); + + auto archiveEntries = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithTypes( + {CONTRACT_CODE}, entriesPerLedger / 2, archiveSeenKeys); + for (auto& e : archiveEntries) + { + e.lastModifiedLedgerSeq = seq; + runningArchiveState[LedgerEntryKey(e)] = e; + } + data.hotArchiveStateAtLedger[seq] = runningArchiveState; + data.archiveEntriesToWrite.push_back(std::move(archiveEntries)); + + data.lastSeq = seq; + } + return data; +} + +// --------------------------------------------------------------------------- +// ThreadGroup: creates threads, registers them with the Application, and +// gates them behind a start signal so all threads begin work simultaneously. +// --------------------------------------------------------------------------- +struct ThreadGroup +{ + std::atomic go{false}; + std::vector threads; + + template + void + launch(int n, F body) + { + for (int i = 0; i < n; i++) + { + threads.emplace_back([this, body]() { + Application::setTestThreadType(Application::ThreadType::WORKER); + while (!go.load(std::memory_order_acquire)) + { + std::this_thread::yield(); + } + body(); + }); + } + } + + void + start() + { + go.store(true, std::memory_order_release); + } + + void + join() + { + for (auto& t : threads) + { + t.join(); + } + } +}; + +// --------------------------------------------------------------------------- +// SnapshotThread: holds a LedgerStateSnapshot together with the ledger +// sequence the owning thread expects that snapshot to be at. The expected +// seq is private and only updated by explicit mutation operations, so any +// unsynchronized drift is immediately detectable. +// --------------------------------------------------------------------------- +class SnapshotThread +{ + mutable ANNOTATED_SHARED_MUTEX(mMutex); + LedgerStateSnapshot mSnapshot GUARDED_BY(mMutex); + // Updated only by mutation methods; a mismatch with + // mSnapshot.getLedgerSeq() indicates a race or corruption. + uint32_t mExpectedSeq; + + public: + explicit SnapshotThread(LedgerStateSnapshot snap) + : mSnapshot(std::move(snap)), mExpectedSeq(mSnapshot.getLedgerSeq()) + { + } + + uint32_t + expectedSeq() const + { + return mExpectedSeq; + } + + // Read-only access. Only the owning thread reads without a lock; + // other threads use copySnapshot() which takes a shared lock. + LedgerStateSnapshot const& + snapshot() const NO_THREAD_SAFETY_ANALYSIS + { + return mSnapshot; + } + + bool + seqMatchesExpected() const NO_THREAD_SAFETY_ANALYSIS + { + return mSnapshot.getLedgerSeq() == mExpectedSeq; + } + + bool + headerMatchesExpected() const NO_THREAD_SAFETY_ANALYSIS + { + return mSnapshot.getLedgerHeader().current().ledgerSeq == mExpectedSeq; + } + + // --- Mutation operations (take exclusive lock, update mExpectedSeq) --- + + // Refresh via maybeUpdate. Returns false if seq went backward. + bool + maybeUpdate(LedgerManager const& lm) + { + SharedLockExclusive lock(mMutex); + lm.maybeUpdateLedgerStateSnapshot(mSnapshot); + auto newSeq = mSnapshot.getLedgerSeq(); + bool ok = newSeq >= mExpectedSeq; + mExpectedSeq = newSeq; + return ok; + } + + // Replace with a fresh copy. Returns false if seq went backward. + bool + freshCopy(LedgerManager const& lm) + { + SharedLockExclusive lock(mMutex); + mSnapshot = lm.copyLedgerStateSnapshot(); + auto newSeq = mSnapshot.getLedgerSeq(); + bool ok = newSeq >= mExpectedSeq; + mExpectedSeq = newSeq; + return ok; + } + + // Copy the snapshot under a shared lock (peer-copy source). + LedgerStateSnapshot + copySnapshot() const + { + SharedLockShared lock(mMutex); + return mSnapshot; + } + + // Replace with a snapshot copied from a peer. The peer may be + // behind, so no monotonicity check. + void + replaceWith(LedgerStateSnapshot snap) + { + SharedLockExclusive lock(mMutex); + mSnapshot = std::move(snap); + mExpectedSeq = mSnapshot.getLedgerSeq(); + } +}; + +// --------------------------------------------------------------------------- +// SnapshotStressTest: orchestrates concurrent snapshot operations against +// a main thread that is continuously closing ledgers. +// +// Each worker thread owns a SnapshotThread that tracks both the snapshot +// and the expected ledger sequence. On every iteration the worker randomly +// picks one of seven operations: +// READ_LIVE – point-lookup live entries, verify against expected +// READ_ARCHIVE – point-lookup archive entries +// READ_HISTORICAL – historical live query, verify data or nullopt +// READ_HISTORICAL_ARCHIVE – historical archive query +// MAYBE_UPDATE – refresh snapshot via maybeUpdate (exclusive lock) +// FRESH_COPY – replace from LedgerManager (exclusive lock) +// PEER_COPY – copy another thread's snapshot +// +// The shared_mutex per SnapshotThread means: +// - Reads need no lock (only the owner reads its own snapshot). +// - Mutations take the exclusive lock on the owning SnapshotThread. +// - Peer copies take a shared lock on the source, so multiple threads +// can copy from the same peer simultaneously. +// +// --------------------------------------------------------------------------- +class SnapshotStressTest +{ + public: + SnapshotStressTest(int numThreads, unsigned seed, Application& app, + PregenData const& pregen, QueryServer& queryServer); + ~SnapshotStressTest() = default; + + void run(); + + private: + enum class Op + { + READ_LIVE, + READ_ARCHIVE, + READ_HISTORICAL, + READ_HISTORICAL_ARCHIVE, + MAYBE_UPDATE, + FRESH_COPY, + PEER_COPY + }; + + static constexpr Op ALL_OPS[] = { + Op::READ_LIVE, Op::READ_ARCHIVE, + Op::READ_HISTORICAL, Op::READ_HISTORICAL_ARCHIVE, + Op::MAYBE_UPDATE, Op::FRESH_COPY, + Op::PEER_COPY}; + + // --- Configuration --- + int const mNumThreads; + unsigned const mSeed; + Application& mApp; + QueryServer& mQueryServer; + uint32_t const mProtocolVersion; + uint32_t const mNumHistorical; + PregenData const& mPregen; + + // --- Shared state --- + std::atomic mDone{false}; + std::atomic mError{false}; + std::atomic mHistoricalVerifications{0}; + std::vector> mThreads; + + bool + shouldStop() const + { + return mDone.load(std::memory_order_acquire) || + mError.load(std::memory_order_acquire); + } + + void + fail(std::string const& msg) + { + CLOG_ERROR(Ledger, "SnapshotStressTest FAILED: {}", msg); + mError.store(true, std::memory_order_release); + } + + void workerLoop(int threadIdx); + void closeLedgers(); + + // Returns true if histSeq should be retained in the historical snapshot + // at currentSeq, based on the rotation policy. + bool shouldHistoricalExist(uint32_t currentSeq, uint32_t histSeq) const; + + // --- Per-operation methods (called from worker threads) --- + // Read ops access the snapshot without a lock because only the owning + // thread reads; peers take a shared lock via copySnapshot(). + void + readCurrent(SnapshotThread& sthread, bool archive, + stellar_default_random_engine& rng) NO_THREAD_SAFETY_ANALYSIS; + void readHistoricalQuery(SnapshotThread& sthread, bool archive, + stellar_default_random_engine& rng) + NO_THREAD_SAFETY_ANALYSIS; + void doPeerCopy(SnapshotThread& self, int threadIdx, + stellar_default_random_engine& rng); + void checkSelfConsistency(SnapshotThread const& sthread) + NO_THREAD_SAFETY_ANALYSIS; +}; + +SnapshotStressTest::SnapshotStressTest(int numThreads, unsigned seed, + Application& app, + PregenData const& pregen, + QueryServer& queryServer) + : mNumThreads(numThreads) + , mSeed(seed) + , mApp(app) + , mQueryServer(queryServer) + , mProtocolVersion(getAppLedgerVersion(app)) + , mNumHistorical(app.getConfig().QUERY_SNAPSHOT_LEDGERS) + , mPregen(pregen) +{ + mThreads.reserve(mNumThreads); + for (int i = 0; i < mNumThreads; i++) + { + mThreads.push_back(std::make_unique( + mApp.getLedgerManager().copyLedgerStateSnapshot())); + } +} + +// Launch worker threads, close all pre-generated ledgers on the main thread, +// then wait briefly for workers to exercise the final state before signaling +// them to stop. Asserts no invariant violation was observed. +void +SnapshotStressTest::run() +{ + std::atomic numRegistered{0}; + + ThreadGroup tg; + for (int t = 0; t < mNumThreads; ++t) + { + tg.launch(1, [this, t, &numRegistered]() { + mQueryServer.registerThread(); + ++numRegistered; + + // Wait until all threads are registered before proceeding. + while (numRegistered.load(std::memory_order_acquire) < mNumThreads) + { + std::this_thread::yield(); + } + workerLoop(t); + }); + } + tg.start(); + closeLedgers(); + + // Give workers a brief window to exercise the final state. + std::this_thread::sleep_for(std::chrono::milliseconds{100}); + mDone.store(true, std::memory_order_release); + tg.join(); + + REQUIRE(!mError.load()); + + // Ensure historical queries were actually exercised and verified + if (mNumHistorical > 0) + { + REQUIRE(mHistoricalVerifications.load() > 0); + } + + // Liveness check: after all ledgers are closed, a fresh snapshot must + // reflect the final ledger sequence. + auto finalSnapshot = mApp.getLedgerManager().copyLedgerStateSnapshot(); + REQUIRE(finalSnapshot.getLedgerSeq() == mPregen.lastSeq); +} + +// Each worker randomly picks an operation, executes it, then checks the +// self-consistency invariant. Runs until mDone or mError is set. +// The expected ledger seq lives inside the SnapshotThread; reads verify +// it hasn't drifted, and mutations update it atomically. +void +SnapshotStressTest::workerLoop(int threadIdx) +{ + stellar_default_random_engine rng(mSeed + threadIdx); + auto& sthread = *mThreads[threadIdx]; + + while (!shouldStop()) + { + auto op = ALL_OPS[rand_uniform(0, std::size(ALL_OPS) - 1, rng)]; + + try + { + if (!sthread.seqMatchesExpected()) + { + fail(fmt::format("seq drifted {}->{} seed={}", + sthread.expectedSeq(), + sthread.snapshot().getLedgerSeq(), mSeed)); + break; + } + + switch (op) + { + case Op::READ_LIVE: + readCurrent(sthread, false, rng); + break; + case Op::READ_ARCHIVE: + readCurrent(sthread, true, rng); + break; + case Op::READ_HISTORICAL: + readHistoricalQuery(sthread, false, rng); + break; + case Op::READ_HISTORICAL_ARCHIVE: + readHistoricalQuery(sthread, true, rng); + break; + case Op::MAYBE_UPDATE: + if (!sthread.maybeUpdate(mApp.getLedgerManager())) + { + fail(fmt::format("MAYBE_UPDATE backward seed={}", mSeed)); + } + break; + case Op::FRESH_COPY: + if (!sthread.freshCopy(mApp.getLedgerManager())) + { + fail(fmt::format("FRESH_COPY backward seed={}", mSeed)); + } + break; + case Op::PEER_COPY: + doPeerCopy(sthread, threadIdx, rng); + break; + } + checkSelfConsistency(sthread); + } + catch (std::exception const& e) + { + fail(fmt::format("Exception: {}", e.what())); + } + } +} + +// Determine whether a query for `histSeq` should +// succeed when the snapshot is at `currentSeq`. +// +// The snapshot always supports querying its own current ledger. +// If QUERY_SNAPSHOT_LEDGERS > 0, it also retains up to that many +// historical snapshots for past ledgers. The retained window is +// [currentSeq - numHistorical, currentSeq), except during the first +// few ledgers when fewer have been accumulated. +bool +SnapshotStressTest::shouldHistoricalExist(uint32_t currentSeq, + uint32_t histSeq) const +{ + // The current ledger is always queryable. + if (histSeq == currentSeq) + { + return true; + } + + // No historical snapshots configured. + if (mNumHistorical == 0) + { + return false; + } + + // Historical snapshots only cover ledgers *before* currentSeq. + if (histSeq >= currentSeq) + { + return false; + } + + // The first ledger we generated data for is startSeq + 1; earlier + // ledgers exist in the rotation but have no pregen entries. + uint32_t firstPregenSeq = mPregen.startSeq + 1; + uint32_t ledgersSinceStart = currentSeq - mPregen.startSeq; + + // Early in the test we haven't accumulated a full window yet. + uint32_t oldestRetained = (ledgersSinceStart <= mNumHistorical) + ? firstPregenSeq + : currentSeq - mNumHistorical; + + return histSeq >= oldestRetained; +} + +// --- Per-operation implementations --- + +// Point-lookup random entries from the current snapshot. Verifies positive +// matches and negative lookups of future keys. +void +SnapshotStressTest::readCurrent(SnapshotThread& sthread, bool archive, + stellar_default_random_engine& rng) +{ + char const* opName = archive ? "READ_ARCHIVE" : "READ_LIVE"; + auto seq = sthread.expectedSeq(); + auto const& stateMap = + archive ? mPregen.hotArchiveStateAtLedger : mPregen.stateAtLedger; + auto stateIt = stateMap.find(seq); + if (stateIt == stateMap.end()) + { + return; + } + auto const& state = stateIt->second; + + // Positive lookups. + for (int c = 0; c < 10; c++) + { + auto const& [key, expected] = randMapEntry(state, rng); + if (archive) + { + auto loaded = sthread.snapshot().loadArchiveEntry(key); + if (!loaded || loaded->type() != HOT_ARCHIVE_ARCHIVED || + loaded->archivedEntry() != expected) + { + fail(fmt::format("{} mismatch seq={} seed={}", opName, seq, + mSeed)); + return; + } + } + else + { + auto loaded = sthread.snapshot().loadLiveEntry(key); + if (!loaded || *loaded != expected) + { + fail(fmt::format("{} mismatch seq={} seed={}", opName, seq, + mSeed)); + return; + } + } + } + + // Negative lookups: pick a key that only exists at a future ledger + // and verify the current snapshot does not return it. + if (seq < mPregen.lastSeq) + { + auto futureSeq = rand_uniform(seq + 1, mPregen.lastSeq, rng); + auto const& futureStateMap = + archive ? mPregen.hotArchiveStateAtLedger : mPregen.stateAtLedger; + auto futureIt = futureStateMap.find(futureSeq); + if (futureIt != futureStateMap.end()) + { + auto const& [futureKey, _] = randMapEntry(futureIt->second, rng); + if (state.find(futureKey) == state.end()) + { + if (archive) + { + auto loaded = + sthread.snapshot().loadArchiveEntry(futureKey); + if (loaded && loaded->type() == HOT_ARCHIVE_ARCHIVED) + { + fail(fmt::format("{} false positive: found future key " + "from seq={} in snapshot at seq={} " + "seed={}", + opName, futureSeq, seq, mSeed)); + } + } + else + { + if (sthread.snapshot().loadLiveEntry(futureKey)) + { + fail(fmt::format("{} false positive: found future key " + "from seq={} in snapshot at seq={} " + "seed={}", + opName, futureSeq, seq, mSeed)); + } + } + } + } + } +} + +// Bulk-load via loadKeysFromLedger on a random past ledger. Queries a mix +// of positive keys (should exist at histSeq) and negative keys (exist only +// at a later ledger). +void +SnapshotStressTest::readHistoricalQuery(SnapshotThread& sthread, bool archive, + stellar_default_random_engine& rng) +{ + char const* opName = archive ? "READ_HIST_ARCHIVE" : "READ_HIST"; + auto currentSeq = sthread.expectedSeq(); + if (currentSeq <= mPregen.startSeq) + { + return; + } + + auto const& stateMap = + archive ? mPregen.hotArchiveStateAtLedger : mPregen.stateAtLedger; + + auto histSeq = + rand_uniform(mPregen.startSeq + 1, currentSeq, rng); + auto histStateIt = stateMap.find(histSeq); + if (histStateIt == stateMap.end()) + { + return; + } + auto const& histState = histStateIt->second; + + // Build query: positive keys (exist at histSeq) + negative keys + // (exist at a later ledger but not at histSeq). We only need to track + // negativeKeys separately; any queried key not in negativeKeys is + // positive. + std::set queryKeys; + for (int c = 0; c < 5; c++) + { + auto const& [key, _] = randMapEntry(histState, rng); + queryKeys.insert(key); + } + + std::set negativeKeys; + + // Add negative keys from nearby ledgers (histSeq+1, histSeq+2, etc.) + // to catch off-by-one bugs in snapshot selection. + for (uint32_t futureSeq = histSeq + 1; + futureSeq <= std::min(histSeq + 3, currentSeq); ++futureSeq) + { + auto futureStateIt = stateMap.find(futureSeq); + if (futureStateIt != stateMap.end()) + { + for (auto const& [key, _] : futureStateIt->second) + { + if (histState.find(key) == histState.end()) + { + queryKeys.insert(key); + negativeKeys.insert(key); + } + } + } + } + + // Look up the historical snapshot from the QueryServer. Use the QS's + // latest seq to determine the expected window: there is a brief window + // where the LedgerManager has advanced to seq N but addSnapshot(N) hasn't + // been called yet, so the worker's currentSeq may be ahead of the QS. + auto* latestSnapshot = + mQueryServer.getSnapshotForLedgerForTesting(std::nullopt); + releaseAssert(latestSnapshot); + auto qsCurrentSeq = latestSnapshot->getLedgerSeq(); + + bool retained = shouldHistoricalExist(qsCurrentSeq, histSeq); + auto* histSnapshot = mQueryServer.getSnapshotForLedgerForTesting(histSeq); + + // We use lazy GC for the per-thread cache, so it's possible we retain + // something outside the window. + if (!retained && !histSnapshot) + { + return; + } + if (!histSnapshot) + { + fail(fmt::format("{} unexpected nullptr histSeq={} " + "currentSeq={} seed={}", + opName, histSeq, currentSeq, mSeed)); + return; + } + + // Load from the historical snapshot and extract LedgerEntries + // into a uniform map for verification. + UnorderedMap resultMap; + + if (archive) + { + auto result = histSnapshot->loadArchiveKeys(queryKeys); + for (auto const& habe : result) + { + if (habe.type() != HOT_ARCHIVE_ARCHIVED) + { + fail(fmt::format("{} unexpected type histSeq={} seed={}", + opName, histSeq, mSeed)); + return; + } + resultMap[LedgerEntryKey(habe.archivedEntry())] = + habe.archivedEntry(); + } + } + else + { + auto result = histSnapshot->loadLiveKeys(queryKeys, "hist-query"); + for (auto const& entry : result) + { + resultMap[LedgerEntryKey(entry)] = entry; + } + } + + // Verify each queried key: positive keys must be present and match, + // negative keys must be absent. + for (auto const& key : queryKeys) + { + bool isNegative = negativeKeys.count(key) > 0; + auto rIt = resultMap.find(key); + + if (isNegative) + { + if (rIt != resultMap.end()) + { + fail(fmt::format("{} false positive for future key " + "histSeq={} seed={}", + opName, histSeq, mSeed)); + return; + } + } + else + { + if (rIt == resultMap.end()) + { + fail(fmt::format("{} missing positive key histSeq={} " + "seed={}", + opName, histSeq, mSeed)); + return; + } + if (rIt->second != histState.at(key)) + { + fail(fmt::format("{} wrong data histSeq={} seed={}", opName, + histSeq, mSeed)); + return; + } + } + } + + ++mHistoricalVerifications; +} + +// Copy a snapshot from a random peer thread. The peer's copySnapshot() +// takes a shared lock (so multiple threads can copy simultaneously), then +// replaceWith() takes an exclusive lock on self to swap in. The peer may +// be behind, so no monotonicity check — SnapshotThread::replaceWith +// updates expectedSeq to whatever the peer had. +void +SnapshotStressTest::doPeerCopy(SnapshotThread& self, int threadIdx, + stellar_default_random_engine& rng) +{ + int peer; + do + { + peer = rand_uniform(0, mNumThreads - 1, rng); + } while (peer == threadIdx); + + auto copied = mThreads[peer]->copySnapshot(); + self.replaceWith(std::move(copied)); +} + +// Verify getLedgerSeq() matches both the header and the SnapshotThread's +// expected seq. A mismatch indicates a torn/corrupt snapshot or an +// unexpected mutation. +void +SnapshotStressTest::checkSelfConsistency(SnapshotThread const& sthread) +{ + if (!sthread.seqMatchesExpected()) + { + fail(fmt::format("consistency: expected seq {} != snapshot seq {} " + "seed={}", + sthread.expectedSeq(), + sthread.snapshot().getLedgerSeq(), mSeed)); + return; + } + if (!sthread.headerMatchesExpected()) + { + fail(fmt::format( + "header/seq mismatch {}/{} seed={}", + sthread.snapshot().getLedgerHeader().current().ledgerSeq, + sthread.expectedSeq(), mSeed)); + } +} + +// Main-thread driver: close all pre-generated ledgers as fast as possible, +// exercising the exclusive lock in advanceLastClosedLedgerState while worker +// threads are concurrently reading and copying snapshots. +void +SnapshotStressTest::closeLedgers() +{ + auto& bm = mApp.getBucketManager(); + auto& lm = mApp.getLedgerManager(); + + for (uint32_t i = 0; i < mPregen.liveEntriesToWrite.size(); i++) + { + uint32_t seq = mPregen.startSeq + 1 + i; + auto header = makeHeader(seq, mProtocolVersion); + + // Add both live and archive batches to their bucket lists, then + // update the canonical state once so the snapshot atomically + // includes both. + bm.getLiveBucketList().addBatch( + mApp, header.ledgerSeq, header.ledgerVersion, + mPregen.liveEntriesToWrite[i], mPregen.liveUpdatesToWrite[i], {}); + if (i < mPregen.archiveEntriesToWrite.size()) + { + bm.getHotArchiveBucketList().addBatch( + mApp, header.ledgerSeq, header.ledgerVersion, + mPregen.archiveEntriesToWrite[i], {}); + } + lm.updateCanonicalStateForTesting(header); + } +} + +// --------------------------------------------------------------------------- +// Unit-test helper: verify that every entry in `entries` is found in `snap` +// with matching data. +// --------------------------------------------------------------------------- +void +requireEntries(LedgerStateSnapshot& snap, + std::vector const& entries) +{ + for (auto const& entry : entries) + { + auto loaded = snap.loadLiveEntry(LedgerEntryKey(entry)); + REQUIRE(loaded); + CHECK(*loaded == entry); + } +} + +} // anonymous namespace + +// =========================================================================== +// TEST CASES +// =========================================================================== + +TEST_CASE("basic snapshot copy semantics and isolation", "[snapshot]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto& lm = app->getLedgerManager(); + auto protocolVersion = getAppLedgerVersion(*app); + auto startSeq = lm.getLastClosedLedgerNum(); + + UnorderedSet seenKeys; + auto entries1 = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, 30, seenKeys); + auto entries2 = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, 30, seenKeys); + + uint32_t seq1 = startSeq + 1; + uint32_t seq2 = startSeq + 2; + + for (auto& e : entries1) + { + e.lastModifiedLedgerSeq = seq1; + } + for (auto& e : entries2) + { + e.lastModifiedLedgerSeq = seq2; + } + + // Add first batch, take snapshot S1. + addLiveBatchAndUpdateSnapshot(*app, makeHeader(seq1, protocolVersion), + entries1, {}, {}); + auto s1 = lm.copyLedgerStateSnapshot(); + REQUIRE(s1.getLedgerSeq() == seq1); + + // Advance to seq2 with new entries. + addLiveBatchAndUpdateSnapshot(*app, makeHeader(seq2, protocolVersion), + entries2, {}, {}); + + // Copy-construct S2 from S1 (after state advanced — tests isolation). + auto s2 = s1; + REQUIRE(s2.getLedgerSeq() == seq1); + + // S1 and S2 return identical data for entries1. + requireEntries(s1, entries1); + requireEntries(s2, entries1); + + // S1 and S2 must not see entries from seq2. + for (auto const& entry : entries2) + { + CHECK(s1.loadLiveEntry(LedgerEntryKey(entry)) == nullptr); + CHECK(s2.loadLiveEntry(LedgerEntryKey(entry)) == nullptr); + } + + // maybeUpdate S1: should refresh it to seq2 (jump +1). + lm.maybeUpdateLedgerStateSnapshot(s1); + REQUIRE(s1.getLedgerSeq() == seq2); + requireEntries(s1, entries1); + requireEntries(s1, entries2); + + // maybeUpdate again with no new ledger close: no-op. + lm.maybeUpdateLedgerStateSnapshot(s1); + REQUIRE(s1.getLedgerSeq() == seq2); + + // Advance to seq3. + uint32_t seq3 = startSeq + 3; + auto entries3 = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, 30, seenKeys); + for (auto& e : entries3) + { + e.lastModifiedLedgerSeq = seq3; + } + addLiveBatchAndUpdateSnapshot(*app, makeHeader(seq3, protocolVersion), + entries3, {}, {}); + + // maybeUpdate S2: still at seq1, jumps +2 (seq1 -> seq3). + REQUIRE(s2.getLedgerSeq() == seq1); + lm.maybeUpdateLedgerStateSnapshot(s2); + REQUIRE(s2.getLedgerSeq() == seq3); + requireEntries(s2, entries1); + requireEntries(s2, entries2); + requireEntries(s2, entries3); + + // maybeUpdate S1: at seq2, jumps +1 (seq2 -> seq3). + REQUIRE(s1.getLedgerSeq() == seq2); + lm.maybeUpdateLedgerStateSnapshot(s1); + REQUIRE(s1.getLedgerSeq() == seq3); + requireEntries(s1, entries3); +} + +// --------------------------------------------------------------------------- +// Parallel snapshot stress test. The main thread continuously closes +// ledgers while worker threads randomly and simultaneously perform snapshot +// operations with no artificial synchronization — all interleavings are +// possible. Seeded from Catch::rngSeed() +// --------------------------------------------------------------------------- +TEST_CASE("snapshot concurrent stress test", "[snapshot][acceptance]") +{ + int const NUM_THREADS = 6; + int const NUM_LEDGERS = 100; + + auto seed = Catch::rngSeed(); + CAPTURE(seed); + + uint32_t numHistorical = GENERATE(0, 5); + CAPTURE(numHistorical); + + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.QUERY_SNAPSHOT_LEDGERS = numHistorical; + cfg.QUERY_SERVER_FOR_TESTING = true; + auto app = createTestApplication(clock, cfg); + auto startSeq = app->getLedgerManager().getLastClosedLedgerNum(); + auto pregen = pregenEntries(startSeq, NUM_LEDGERS, ENTRIES_PER_LEDGER); + + auto& qServer = app->getCommandHandler().getQueryServer(); + + SnapshotStressTest test(NUM_THREADS, seed, *app, pregen, qServer); + test.run(); +} + +// --------------------------------------------------------------------------- +// Verify that a snapshot remains valid for long-running scans (like the +// BucketListStateConsistency invariant) even after the underlying ledger +// state has advanced well past the snapshot's sequence. +// --------------------------------------------------------------------------- +TEST_CASE("invariant check concurrent with state advance", "[snapshot]") +{ + auto seed = Catch::rngSeed(); + CAPTURE(seed); + + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto protocolVersion = getAppLedgerVersion(*app); + auto startSeq = app->getLedgerManager().getLastClosedLedgerNum(); + + UnorderedSet seenKeys; + auto initialEntries = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, 100, seenKeys); + uint32_t seq1 = startSeq + 1; + for (auto& e : initialEntries) + { + e.lastModifiedLedgerSeq = seq1; + } + addLiveBatchAndUpdateSnapshot(*app, makeHeader(seq1, protocolVersion), + initialEntries, {}, {}); + + auto snapshot = app->getLedgerManager().copyLedgerStateSnapshot(); + REQUIRE(snapshot.getLedgerSeq() == seq1); + + // Build expected state map for the snapshot at seq1. + UnorderedMap expectedAtSeq1; + for (auto const& e : initialEntries) + { + expectedAtSeq1[LedgerEntryKey(e)] = e; + } + + // Collect all keys added at future ledgers so we can detect + // snapshot corruption that leaks newer entries into an old scan. + UnorderedSet futureKeys; + + std::atomic scanError{false}; + // Track which expected keys were found during the scan. + UnorderedSet matchedKeys; + bool unexpectedEntry{false}; + + ThreadGroup tg; + tg.launch(1, [&]() { + try + { + // Scan all classic entry types. For each entry, verify + // it belongs to the snapshot at seq1 with correct data, + // and flag any entry from a future ledger. + for (auto type : {ACCOUNT, TRUSTLINE, OFFER, DATA, + CLAIMABLE_BALANCE, LIQUIDITY_POOL}) + { + snapshot.scanLiveEntriesOfType( + type, [&](BucketEntry const& be) -> Loop { + if (be.type() == LIVEENTRY || be.type() == INITENTRY) + { + auto const& le = be.liveEntry(); + auto key = LedgerEntryKey(le); + auto eIt = expectedAtSeq1.find(key); + if (eIt != expectedAtSeq1.end()) + { + if (le != eIt->second) + { + CLOG_ERROR(Ledger, + "Scan data mismatch for entry"); + scanError.store(true); + return Loop::COMPLETE; + } + matchedKeys.insert(key); + } + else if (futureKeys.count(key) > 0) + { + CLOG_ERROR(Ledger, + "Scan found future entry that " + "should not be in snapshot"); + unexpectedEntry = true; + scanError.store(true); + return Loop::COMPLETE; + } + } + return Loop::INCOMPLETE; + }); + } + } + catch (std::exception const& e) + { + CLOG_ERROR(Ledger, "Exception in scanner: {}", e.what()); + scanError.store(true); + } + }); + tg.start(); + + for (int i = 2; i <= 11; i++) + { + uint32_t seq = startSeq + static_cast(i); + auto entries = + LedgerTestUtils::generateValidUniqueLedgerEntriesWithExclusions( + SOROBAN_TYPES, ENTRIES_PER_LEDGER, seenKeys); + for (auto& e : entries) + { + e.lastModifiedLedgerSeq = seq; + futureKeys.insert(LedgerEntryKey(e)); + } + addLiveBatchAndUpdateSnapshot(*app, makeHeader(seq, protocolVersion), + entries, {}, {}); + } + + tg.join(); + REQUIRE(!scanError.load()); + REQUIRE(!unexpectedEntry); + // Every expected entry must have been found in the scan. + CHECK(matchedKeys.size() == expectedAtSeq1.size()); +} diff --git a/src/ledger/test/LedgerTxnTests.cpp b/src/ledger/test/LedgerTxnTests.cpp index e88fc8dd43..f35031d608 100644 --- a/src/ledger/test/LedgerTxnTests.cpp +++ b/src/ledger/test/LedgerTxnTests.cpp @@ -261,18 +261,17 @@ TEST_CASE("LedgerTxn commit into LedgerTxn", "[ledgertxn]") SECTION("commited to parent") { + auto getTTLEntry = [](LedgerEntry const& entry, + uint32_t liveUntilLedgerSeq) -> LedgerEntry { + LedgerEntry ttl; + ttl.data.type(TTL); + ttl.data.ttl().liveUntilLedgerSeq = liveUntilLedgerSeq; + ttl.data.ttl().keyHash = getTTLKey(entry).ttl().keyHash; + return ttl; + }; + SECTION("hot archive") { - auto getTTLEntry = - [](LedgerEntry const& entry, - uint32_t liveUntilLedgerSeq) -> LedgerEntry { - LedgerEntry ttl; - ttl.data.type(TTL); - ttl.data.ttl().liveUntilLedgerSeq = liveUntilLedgerSeq; - ttl.data.ttl().keyHash = getTTLKey(entry).ttl().keyHash; - return ttl; - }; - ltx1.markRestoredFromHotArchive( randomEntries[0], getTTLEntry(randomEntries[0], 42)); @@ -313,9 +312,51 @@ TEST_CASE("LedgerTxn commit into LedgerTxn", "[ledgertxn]") } } + SECTION("mark live BL") + { + ltx1.markRestoredFromLiveBucketList( + randomEntries[0], getTTLEntry(randomEntries[0], 42)); + + SECTION("rollback") + { + { + LedgerTxn ltx2(ltx1); + ltx2.markRestoredFromLiveBucketList( + randomEntries[1], + getTTLEntry(randomEntries[1], 42)); + } + + REQUIRE(ltx1.getRestoredHotArchiveKeys().empty()); + auto keys = ltx1.getRestoredLiveBucketListKeys(); + + // Data key + TTL + REQUIRE(keys.size() == 2); + checkKey(keys, randomKeys[0]); + } + + SECTION("commit") + { + { + LedgerTxn ltx2(ltx1); + ltx2.markRestoredFromLiveBucketList( + randomEntries[1], + getTTLEntry(randomEntries[1], 42)); + ltx2.commit(); + } + + REQUIRE(ltx1.getRestoredHotArchiveKeys().empty()); + auto keys = ltx1.getRestoredLiveBucketListKeys(); + + // (data key + TTL) * 2 + REQUIRE(keys.size() == 4); + checkKey(keys, randomKeys[0]); + checkKey(keys, randomKeys[1]); + } + } + SECTION("live BL") { - auto getTTLEntry = [](LedgerKey const& key) { + auto getTTLEntryFromKey = [](LedgerKey const& key) { LedgerEntry ttl; ttl.data.type(TTL); ttl.data.ttl().liveUntilLedgerSeq = 42; @@ -325,7 +366,7 @@ TEST_CASE("LedgerTxn commit into LedgerTxn", "[ledgertxn]") // Populate live BL with key, then restore it ltx1.create(randomEntries[0]); - ltx1.create(getTTLEntry(randomKeys[0])); + ltx1.create(getTTLEntryFromKey(randomKeys[0])); ltx1.restoreFromLiveBucketList(randomEntries[0], 42); SECTION("rollback") @@ -333,7 +374,7 @@ TEST_CASE("LedgerTxn commit into LedgerTxn", "[ledgertxn]") { LedgerTxn ltx2(ltx1); ltx2.create(randomEntries[1]); - ltx2.create(getTTLEntry(randomKeys[1])); + ltx2.create(getTTLEntryFromKey(randomKeys[1])); ltx2.restoreFromLiveBucketList(randomEntries[1], 42); } @@ -350,7 +391,7 @@ TEST_CASE("LedgerTxn commit into LedgerTxn", "[ledgertxn]") { LedgerTxn ltx2(ltx1); ltx2.create(randomEntries[1]); - ltx2.create(getTTLEntry(randomKeys[1])); + ltx2.create(getTTLEntryFromKey(randomKeys[1])); ltx2.restoreFromLiveBucketList(randomEntries[1], 42); ltx2.commit(); } diff --git a/src/main/AppConnector.cpp b/src/main/AppConnector.cpp index 249277e85f..a42e5c43a9 100644 --- a/src/main/AppConnector.cpp +++ b/src/main/AppConnector.cpp @@ -169,50 +169,25 @@ AppConnector::threadIsType(Application::ThreadType type) const return mApp.threadIsType(type); } -SearchableHotArchiveSnapshotConstPtr -AppConnector::copySearchableHotArchiveBucketListSnapshot() +LedgerStateSnapshot +AppConnector::copyLedgerStateSnapshot() { - return mApp.getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + return mApp.getLedgerManager().copyLedgerStateSnapshot(); } -SearchableSnapshotConstPtr -AppConnector::copySearchableLiveBucketListSnapshot() +ApplyLedgerStateSnapshot +AppConnector::copyApplyLedgerStateSnapshot() { - return mApp.getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + return mApp.getLedgerManager().copyApplyLedgerStateSnapshot(); } void -AppConnector::maybeCopySearchableBucketListSnapshot( - SearchableSnapshotConstPtr& snapshot) +AppConnector::maybeUpdateLedgerStateSnapshot(LedgerStateSnapshot& snapshot) { - mApp.getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableBucketListSnapshot(snapshot); + mApp.getLedgerManager().maybeUpdateLedgerStateSnapshot(snapshot); } -void -AppConnector::maybeCopyLiveAndHotArchiveSnapshots( - SearchableSnapshotConstPtr& liveSnapshot, - SearchableHotArchiveSnapshotConstPtr& hotArchiveSnapshot) -{ - mApp.getBucketManager() - .getBucketSnapshotManager() - .maybeCopyLiveAndHotArchiveSnapshots(liveSnapshot, hotArchiveSnapshot); -} - -std::pair -AppConnector::copySearchableBucketListSnapshots() -{ - return mApp.getBucketManager() - .getBucketSnapshotManager() - .copySearchableBucketListSnapshots(); -} - -SearchableSnapshotConstPtr& +LedgerStateSnapshot& AppConnector::getOverlayThreadSnapshot() { return mApp.getOverlayManager().getOverlayThreadSnapshot(); diff --git a/src/main/AppConnector.h b/src/main/AppConnector.h index 7f90a13daf..12b774c8c6 100644 --- a/src/main/AppConnector.h +++ b/src/main/AppConnector.h @@ -5,6 +5,7 @@ #pragma once #include "bucket/BucketUtils.h" +#include "ledger/LedgerStateSnapshot.h" #include "main/Application.h" #include "main/Config.h" #include "rust/RustBridge.h" @@ -72,25 +73,13 @@ class AppConnector bool isStopping() const; - SearchableHotArchiveSnapshotConstPtr - copySearchableHotArchiveBucketListSnapshot(); - - SearchableSnapshotConstPtr copySearchableLiveBucketListSnapshot(); - - // Refreshes `snapshot` if a newer snapshot is available. No-op otherwise. - void - maybeCopySearchableBucketListSnapshot(SearchableSnapshotConstPtr& snapshot); - - void maybeCopyLiveAndHotArchiveSnapshots( - SearchableSnapshotConstPtr& liveSnapshot, - SearchableHotArchiveSnapshotConstPtr& hotArchiveSnapshot); - - std::pair - copySearchableBucketListSnapshots(); + LedgerStateSnapshot copyLedgerStateSnapshot(); + ApplyLedgerStateSnapshot copyApplyLedgerStateSnapshot(); + void maybeUpdateLedgerStateSnapshot(LedgerStateSnapshot& snapshot); // Get a snapshot of ledger state for use by the overlay thread only. Must // only be called from the overlay thread. - SearchableSnapshotConstPtr& getOverlayThreadSnapshot(); + LedgerStateSnapshot& getOverlayThreadSnapshot(); // Protocol 23 data corruption bug data verifier. This typically is null, // unless a path to a CSV file containing the corruption data was provided diff --git a/src/main/Application.h b/src/main/Application.h index bb123d09e3..4cdcd5dd42 100644 --- a/src/main/Application.h +++ b/src/main/Application.h @@ -25,7 +25,6 @@ class BucketManager; class LedgerApplyManager; class HistoryArchiveManager; class HistoryManager; -class Maintainer; class ProcessManager; class Herder; class HerderPersistence; @@ -36,6 +35,7 @@ class PersistentState; class CommandHandler; class WorkScheduler; class BanManager; +class BannedAccountsPersistor; class StatusManager; class AbstractLedgerTxnParent; class BasicWork; @@ -223,7 +223,6 @@ class Application virtual LedgerApplyManager& getLedgerApplyManager() = 0; virtual HistoryArchiveManager& getHistoryArchiveManager() = 0; virtual HistoryManager& getHistoryManager() = 0; - virtual Maintainer& getMaintainer() = 0; virtual ProcessManager& getProcessManager() = 0; virtual Herder& getHerder() = 0; virtual HerderPersistence& getHerderPersistence() = 0; @@ -234,6 +233,7 @@ class Application virtual CommandHandler& getCommandHandler() = 0; virtual WorkScheduler& getWorkScheduler() = 0; virtual BanManager& getBanManager() = 0; + virtual BannedAccountsPersistor& getBannedAccountsPersistor() = 0; virtual StatusManager& getStatusManager() = 0; // Protocol 23 data corruption bug data verifier. This typically is null, @@ -308,6 +308,12 @@ class Application // Access the runtime overlay-only mode flag for testing virtual bool getRunInOverlayOnlyMode() const = 0; virtual void setRunInOverlayOnlyMode(bool mode) = 0; + + // Register the calling thread's type so threadIsType() works for + // ad-hoc test threads created after app initialization. Uses a + // thread-local rather than mThreadTypes, since the production map + // must not be written after construction. + static void setTestThreadType(ThreadType type); #endif // Execute any administrative commands written in the Config.COMMANDS diff --git a/src/main/ApplicationImpl.cpp b/src/main/ApplicationImpl.cpp index fb2add70ef..d323d15550 100644 --- a/src/main/ApplicationImpl.cpp +++ b/src/main/ApplicationImpl.cpp @@ -42,7 +42,6 @@ #include "main/AppConnector.h" #include "main/ApplicationUtils.h" #include "main/CommandHandler.h" -#include "main/Maintainer.h" #include "main/StellarCoreVersion.h" #include "medida/counter.h" #include "medida/meter.h" @@ -263,7 +262,6 @@ ApplicationImpl::initialize(bool createNewDB, bool forceRebuild) mHistoryArchiveManager = std::make_unique(*this); mHistoryManager = HistoryManager::create(*this); mInvariantManager = createInvariantManager(); - mMaintainer = std::make_unique(*this); mWorkScheduler = WorkScheduler::create(*this); mBanManager = BanManager::create(*this); mStatusManager = std::make_unique(); @@ -324,6 +322,12 @@ ApplicationImpl::initialize(bool createNewDB, bool forceRebuild) enableInvariantsFromConfig(); + // Create CommandHandler before newDB/ledger loading so that + // advanceLastClosedLedgerState can push snapshots to the QueryServer. + // This is safe because endpoints are blocked until we call setReady() after + // ledger loading is complete. + mCommandHandler = std::make_unique(*this); + if (initNewDB) { newDB(); @@ -338,8 +342,9 @@ ApplicationImpl::initialize(bool createNewDB, bool forceRebuild) // constructor mProcessManager = ProcessManager::create(*this); - // After everything is initialized, start accepting HTTP commands - mCommandHandler = std::make_unique(*this); + // Initialize banned accounts persistence and migrate any deprecated + // FILTERED_G_ADDRESSES config entries into the persistent table. + mBannedAccountsPersistor = std::make_unique(*this); LOG_DEBUG(DEFAULT_LOG, "Application constructed"); } @@ -763,7 +768,6 @@ ApplicationImpl::startServices() // restores Herder's state before starting overlay mHerder->start(); - mMaintainer->start(); if (mConfig.MODE_AUTO_STARTS_OVERLAY) { mOverlayManager->start(); @@ -805,6 +809,17 @@ ApplicationImpl::start() CLOG_INFO(Ledger, "Starting up application"); mStarted = true; +#ifdef BUILD_TESTS + // In tests, newDB() and loadLastKnownLedger() both run in the same + // process, causing advanceLastClosedLedgerState to push the same LCL + // seq to the QueryServer twice. Clear the QS state so + // loadLastKnownLedger starts fresh. + if (getConfig().QUERY_SERVER_FOR_TESTING) + { + mCommandHandler->getQueryServer().resetForTesting(); + } +#endif + mLedgerManager->loadLastKnownLedger(); // LCL is now loaded; unblock HTTP endpoints that were gated during boot. @@ -1199,6 +1214,7 @@ ApplicationImpl::setRunInOverlayOnlyMode(bool mode) { mRunInOverlayOnlyMode = mode; } + #endif void @@ -1208,6 +1224,20 @@ ApplicationImpl::applyCfgCommands() { mCommandHandler->manualCmd(cmd); } + + // Warn if COMMANDS contains banaccounts entries (after persisting + // those accounts) + for (auto const& cmd : mConfig.COMMANDS) + { + if (cmd.find("banaccounts") != std::string::npos) + { + CLOG_WARNING(Herder, + "COMMANDS entry '{}' is no longer needed: banned " + "accounts are now persisted across restarts. " + "Consider removing this entry.", + cmd); + } + } } Config const& @@ -1282,9 +1312,30 @@ ApplicationImpl::getMetrics() return *mMetrics; } +#ifdef BUILD_TESTS +// Some tests spin up ad-hoc threads after app initialization and need those +// threads to pass threadIsType() checks. The production mThreadTypes map +// must not be written after construction (concurrent unsynchronized reads), +// so test threads register themselves via this thread-local instead. +// threadIsType() checks it before the instance map. +static thread_local std::optional gTestThreadType; + +void +Application::setTestThreadType(ThreadType type) +{ + gTestThreadType = type; +} +#endif + bool ApplicationImpl::threadIsType(ThreadType type) const { +#ifdef BUILD_TESTS + if (gTestThreadType.has_value()) + { + return *gTestThreadType == type; + } +#endif auto it = mThreadTypes.find(std::this_thread::get_id()); releaseAssert(it != mThreadTypes.end()); return it->second == type; @@ -1394,12 +1445,6 @@ ApplicationImpl::getHistoryManager() return *mHistoryManager; } -Maintainer& -ApplicationImpl::getMaintainer() -{ - return *mMaintainer; -} - ProcessManager& ApplicationImpl::getProcessManager() { @@ -1460,6 +1505,12 @@ ApplicationImpl::getBanManager() return *mBanManager; } +BannedAccountsPersistor& +ApplicationImpl::getBannedAccountsPersistor() +{ + return *mBannedAccountsPersistor; +} + StatusManager& ApplicationImpl::getStatusManager() { diff --git a/src/main/ApplicationImpl.h b/src/main/ApplicationImpl.h index 9d7e36163e..e7257b3c1c 100644 --- a/src/main/ApplicationImpl.h +++ b/src/main/ApplicationImpl.h @@ -5,6 +5,7 @@ #pragma once #include "Application.h" +#include "main/BannedAccountsPersistor.h" #include "main/Config.h" #include "main/PersistentState.h" #include "medida/timer_context.h" @@ -65,7 +66,6 @@ class ApplicationImpl : public Application virtual LedgerApplyManager& getLedgerApplyManager() override; virtual HistoryArchiveManager& getHistoryArchiveManager() override; virtual HistoryManager& getHistoryManager() override; - virtual Maintainer& getMaintainer() override; virtual ProcessManager& getProcessManager() override; virtual Herder& getHerder() override; virtual HerderPersistence& getHerderPersistence() override; @@ -76,6 +76,7 @@ class ApplicationImpl : public Application virtual CommandHandler& getCommandHandler() override; virtual WorkScheduler& getWorkScheduler() override; virtual BanManager& getBanManager() override; + virtual BannedAccountsPersistor& getBannedAccountsPersistor() override; virtual StatusManager& getStatusManager() override; virtual AppConnector& getAppConnector() override; std::unique_ptr& @@ -187,11 +188,11 @@ class ApplicationImpl : public Application std::unique_ptr mHistoryArchiveManager; std::unique_ptr mHistoryManager; std::unique_ptr mInvariantManager; - std::unique_ptr mMaintainer; std::shared_ptr mProcessManager; std::shared_ptr mWorkScheduler; std::unique_ptr mPersistentState; std::unique_ptr mBanManager; + std::unique_ptr mBannedAccountsPersistor; std::unique_ptr mStatusManager; std::unique_ptr mLedgerTxnRoot; std::unique_ptr mAppConnector; diff --git a/src/main/ApplicationUtils.cpp b/src/main/ApplicationUtils.cpp index 3d737b766c..cc6a2cc4c4 100644 --- a/src/main/ApplicationUtils.cpp +++ b/src/main/ApplicationUtils.cpp @@ -22,11 +22,9 @@ #include "ledger/LedgerManagerImpl.h" #include "ledger/LedgerTypeUtils.h" #include "main/ErrorMessages.h" -#include "main/Maintainer.h" #include "main/PersistentState.h" #include "main/StellarCoreVersion.h" #include "overlay/OverlayManager.h" -#include "scp/LocalNode.h" #include "util/GlobalChecks.h" #include "util/Logging.h" #include "util/XDRCereal.h" @@ -37,7 +35,6 @@ #include #include -#include #include #include #include @@ -150,15 +147,16 @@ applyBucketsForLCL(Application& app) HistoryArchiveState has; has.fromString(app.getPersistentState().getState( PersistentState::kHistoryArchiveState, app.getDatabase().getSession())); - auto lclHash = app.getPersistentState().getState( - PersistentState::kLastClosedLedger, app.getDatabase().getSession()); auto maxProtocolVersion = app.getConfig().LEDGER_PROTOCOL_VERSION; - auto currentLedger = - LedgerHeaderUtils::loadByHash(app.getDatabase(), hexToBin256(lclHash)); - if (currentLedger) + std::string headerEncoded = app.getPersistentState().getState( + PersistentState::kLastClosedLedgerHeader, + app.getDatabase().getSession()); + if (!headerEncoded.empty()) { - maxProtocolVersion = currentLedger->ledgerVersion; + LedgerHeader currentLedger = + LedgerHeaderUtils::decodeFromData(headerEncoded); + maxProtocolVersion = currentLedger.ledgerVersion; } std::map> buckets; @@ -462,8 +460,6 @@ getHotArchiveListBalanceForAsset(Application& app, AssetContractInfo const& assetContractInfo, int64_t& runningBalance) { - auto& bm = app.getBucketManager(); - std::map archived = app.getBucketManager().loadCompleteHotArchiveState(has); for (auto const& [_, entry] : archived) @@ -734,8 +730,7 @@ dumpLedger(Config cfg, std::string const& outputFile, auto& lm = app->getLedgerManager(); lm.partiallyLoadLastKnownLedgerForUtils(); - auto liveSnapshot = - app->getAppConnector().copySearchableLiveBucketListSnapshot(); + auto liveSnapshot = app->getAppConnector().copyLedgerStateSnapshot(); auto ttlGetter = [&liveSnapshot, includeAllStates, dumpHotArchive](LedgerKey const& key) -> uint32_t { if (includeAllStates || dumpHotArchive) @@ -744,7 +739,7 @@ dumpLedger(Config cfg, std::string const& outputFile, "TTL is undefined when `--include-all-states` or " "`--hot-archive` flag is set."); } - auto entry = liveSnapshot->load(key); + auto entry = liveSnapshot.loadLiveEntry(key); if (!entry) { throw std::runtime_error("No TTL entry found for key: " + @@ -874,12 +869,10 @@ dumpWasmBlob(Config cfg, std::string const& hash, std::string const& dir) LOG_INFO(DEFAULT_LOG, "Wrote {} bytes to {}", entry.code.size(), filename); }; - auto snap = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto snap = app->getLedgerManager().copyLedgerStateSnapshot(); if (hash == "ALL") { - snap->scanForEntriesOfType( + snap.scanLiveEntriesOfType( CONTRACT_CODE, [&](BucketEntry const& entry) { if (entry.type() == INITENTRY || entry.type() == LIVEENTRY) { @@ -895,7 +888,7 @@ dumpWasmBlob(Config cfg, std::string const& hash, std::string const& dir) LedgerKey key; key.type(LedgerEntryType::CONTRACT_CODE); key.contractCode().hash = hexToBin256(hash); - auto entry = snap->load(key); + auto entry = snap.loadLiveEntry(key); if (entry && entry->data.type() == LedgerEntryType::CONTRACT_CODE) { auto const& codeEntry = entry->data.contractCode(); diff --git a/src/main/BannedAccountsPersistor.cpp b/src/main/BannedAccountsPersistor.cpp new file mode 100644 index 0000000000..c7f903447b --- /dev/null +++ b/src/main/BannedAccountsPersistor.cpp @@ -0,0 +1,151 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#include "main/BannedAccountsPersistor.h" + +#include "database/Database.h" +#include "main/Application.h" +#include "util/GlobalChecks.h" +#include "util/Logging.h" + +namespace stellar +{ + +BannedAccountsPersistor::BannedAccountsPersistor(Application& app) : mApp(app) +{ + releaseAssert(threadIsMain()); +} + +void +BannedAccountsPersistor::maybeDropAndCreateNew(soci::session& sess) +{ + sess << "DROP TABLE IF EXISTS bannedaccounts;"; + sess << "CREATE TABLE bannedaccounts (accountid VARCHAR(56) PRIMARY KEY);"; +} + +std::set +BannedAccountsPersistor::getBannedAccounts() const +{ + releaseAssert(threadIsMain()); + + std::set result; + + auto& db = mApp.getDatabase(); + std::string accountid; + auto prep = db.getPreparedStatement("SELECT accountid FROM bannedaccounts;", + db.getMiscSession()); + auto& st = prep.statement(); + st.exchange(soci::into(accountid)); + st.define_and_bind(); + st.execute(true); + + while (st.got_data()) + { + try + { + result.emplace(KeyUtils::fromStrKey(accountid)); + } + catch (std::exception const& e) + { + CLOG_WARNING(Herder, + "Ignoring invalid banned account in database: {}", + accountid); + } + st.fetch(); + } + + CLOG_INFO(Herder, "Loaded {} banned account(s) from database", + result.size()); + return result; +} + +size_t +BannedAccountsPersistor::getBannedAccountsCount() const +{ + releaseAssert(threadIsMain()); + + int count = 0; + auto& db = mApp.getDatabase(); + auto prep = db.getPreparedStatement("SELECT COUNT(*) FROM bannedaccounts;", + db.getMiscSession()); + auto& st = prep.statement(); + st.exchange(soci::into(count)); + st.define_and_bind(); + st.execute(true); + return static_cast(count); +} + +void +BannedAccountsPersistor::addBannedAccounts( + std::vector const& addresses) +{ + releaseAssert(threadIsMain()); + + auto& db = mApp.getDatabase(); + soci::transaction tx(db.getRawMiscSession()); + + for (auto const& addr : addresses) + { + auto key = KeyUtils::fromStrKey(addr); + auto prep = db.getPreparedStatement( + "INSERT INTO bannedaccounts (accountid) VALUES (:id) " + "ON CONFLICT (accountid) DO NOTHING;", + db.getMiscSession()); + auto& st = prep.statement(); + st.exchange(soci::use(addr)); + st.define_and_bind(); + st.execute(true); + } + + tx.commit(); +} + +void +BannedAccountsPersistor::removeBannedAccounts( + std::vector const& addresses) +{ + releaseAssert(threadIsMain()); + + auto& db = mApp.getDatabase(); + soci::transaction tx(db.getRawMiscSession()); + + for (auto const& addr : addresses) + { + auto key = KeyUtils::fromStrKey(addr); + + auto prep = db.getPreparedStatement( + "DELETE FROM bannedaccounts WHERE accountid = :id;", + db.getMiscSession()); + auto& st = prep.statement(); + st.exchange(soci::use(addr)); + st.define_and_bind(); + st.execute(true); + } + + tx.commit(); +} + +void +BannedAccountsPersistor::clearBannedAccounts() +{ + releaseAssert(threadIsMain()); + + auto& db = mApp.getDatabase(); + db.getRawMiscSession() << "DELETE FROM bannedaccounts;"; +} + +std::vector +BannedAccountsPersistor::getBannedAccountStrKeys() const +{ + releaseAssert(threadIsMain()); + + auto result = getBannedAccounts(); + std::vector keys; + for (auto const& account : result) + { + keys.push_back(KeyUtils::toStrKey(account)); + } + return keys; +} +} diff --git a/src/main/BannedAccountsPersistor.h b/src/main/BannedAccountsPersistor.h new file mode 100644 index 0000000000..ce0b60e1d7 --- /dev/null +++ b/src/main/BannedAccountsPersistor.h @@ -0,0 +1,49 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#pragma once + +#include "crypto/KeyUtils.h" +#include "overlay/StellarXDR.h" +#include +#include +#include +#include + +namespace stellar +{ +class Application; + +// Manages a persistent set of banned (filtered) accounts. All write operations +// must be called from the main thread. +class BannedAccountsPersistor +{ + public: + explicit BannedAccountsPersistor(Application& app); + + // Drop and recreate the bannedaccounts table (for new-db initialization). + static void maybeDropAndCreateNew(soci::session& sess); + + // Add accounts to the ban list (additive, does not remove existing bans). + void addBannedAccounts(std::vector const& addresses); + + // Remove specific accounts from the ban list. + void removeBannedAccounts(std::vector const& addresses); + + // Clear all banned accounts. + void clearBannedAccounts(); + + // Get the set of banned accounts. + std::set getBannedAccounts() const; + + // Get the number of banned accounts. + size_t getBannedAccountsCount() const; + + // Get the banned accounts as a sorted list of StrKey strings. + std::vector getBannedAccountStrKeys() const; + + private: + Application& mApp; +}; +} diff --git a/src/main/CommandHandler.cpp b/src/main/CommandHandler.cpp index 14d2e4ee56..122138de9e 100644 --- a/src/main/CommandHandler.cpp +++ b/src/main/CommandHandler.cpp @@ -3,8 +3,6 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "main/CommandHandler.h" -#include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" #include "crypto/KeyUtils.h" #include "herder/Herder.h" #include "history/HistoryArchiveManager.h" @@ -14,8 +12,8 @@ #include "lib/http/server.hpp" #include "lib/json/json.h" #include "main/Application.h" +#include "main/BannedAccountsPersistor.h" #include "main/Config.h" -#include "main/Maintainer.h" #include "main/QueryServer.h" #include "overlay/BanManager.h" #include "overlay/OverlayManager.h" @@ -43,6 +41,7 @@ #include "test/TxTests.h" #endif #include +#include using std::placeholders::_1; using std::placeholders::_2; @@ -81,6 +80,14 @@ CommandHandler::CommandHandler(Application& app) : mApp(app) mApp.getConfig().QUERY_THREAD_POOL_SIZE, mApp.getAppConnector()); } +#ifdef BUILD_TESTS + else if (mApp.getConfig().QUERY_SERVER_FOR_TESTING) + { + mQueryServer = std::make_unique( + "127.0.0.1", 0, 1, 1, mApp.getAppConnector(), true); + mQueryServer->setReady(); + } +#endif } if (!mApp.getConfig().HTTP_PORT) @@ -90,10 +97,6 @@ CommandHandler::CommandHandler(Application& app) : mApp(app) } mServer->add404(std::bind(&CommandHandler::fileNotFound, this, _1, _2)); - if (mApp.getConfig().MODE_STORES_HISTORY_MISC) - { - addRoute("maintenance", &CommandHandler::maintenance); - } if (!mApp.getConfig().RUN_STANDALONE) { @@ -123,6 +126,8 @@ CommandHandler::CommandHandler(Application& app) : mApp(app) addRoute("metrics", &CommandHandler::metrics); addRoute("tx", &CommandHandler::tx); addRoute("upgrades", &CommandHandler::upgrades); + addRoute("banaccounts", &CommandHandler::banaccounts); + addRoute("unbanaccounts", &CommandHandler::unbanaccounts); addRoute("dumpproposedsettings", &CommandHandler::dumpProposedSettings); addRoute("self-check", &CommandHandler::selfCheck); addRoute("sorobaninfo", &CommandHandler::sorobanInfo); @@ -163,6 +168,15 @@ CommandHandler::setReady() } } +void +CommandHandler::addSnapshot(CompleteConstLedgerStatePtr state) +{ + if (mQueryServer) + { + mQueryServer->addSnapshot(std::move(state)); + } +} + void CommandHandler::addRoute(std::string const& name, HandlerRoute route) { @@ -644,9 +658,9 @@ CommandHandler::upgrades(std::string const& params, std::string& retStr) decoder::decode_b64(configXdrIter->second, buffer); ConfigUpgradeSetKey key; xdr::xdr_from_opaque(buffer, key); - auto ls = LedgerSnapshot(mApp); + auto lrv = LedgerReadView(mApp); - auto ptr = ConfigUpgradeSetFrame::makeFromKey(ls, key); + auto ptr = ConfigUpgradeSetFrame::makeFromKey(lrv, key); if (!ptr || ptr->isValidForApply() != Upgrades::UpgradeValidity::VALID) @@ -682,6 +696,121 @@ CommandHandler::upgrades(std::string const& params, std::string& retStr) } } +void +CommandHandler::banaccounts(std::string const& params, std::string& retStr) +{ + ZoneScoped; + std::map retMap; + http::server::server::parseParams(params, retMap); + + auto& persistor = mApp.getBannedAccountsPersistor(); + + auto it = retMap.find("accountids"); + if (it == retMap.end()) + { + // No accountids param at all: list current banned accounts. + // parseParams drops empty values, so also check the raw params to + // distinguish "not specified" from "empty value". + if (params.find("accountids") != std::string::npos) + { + retStr = + R"({"error": "accountids must not be empty; use 'unbanaccounts' to remove bans"})"; + return; + } + + auto accounts = persistor.getBannedAccountStrKeys(); + Json::Value root; + root["bannedAccounts"] = Json::arrayValue; + for (auto const& addr : accounts) + { + root["bannedAccounts"].append(addr); + } + retStr = root.toStyledString(); + return; + } + + std::vector addresses; + if (!parseAccountIds(it->second, addresses, retStr)) + { + return; + } + + auto beforeCount = persistor.getBannedAccountsCount(); + persistor.addBannedAccounts(addresses); + auto updated = persistor.getBannedAccounts(); + mApp.getHerder().setFilteredAccounts(updated); + auto actuallyAdded = updated.size() - beforeCount; + retStr = fmt::format( + FMT_STRING( + R"({{"status": "banned accounts updated", "added": {}, "total": {}}})"), + actuallyAdded, updated.size()); +} + +bool +CommandHandler::parseAccountIds(std::string const& value, + std::vector& addresses, + std::string& retStr) +{ + std::istringstream iss(value); + std::string addr; + while (std::getline(iss, addr, ',')) + { + if (addr.empty()) + { + continue; + } + try + { + KeyUtils::fromStrKey(addr); + } + catch (std::exception const&) + { + retStr = fmt::format( + FMT_STRING(R"({{"error": "invalid address: '{}'"}})"), addr); + return false; + } + addresses.push_back(addr); + } + return true; +} + +void +CommandHandler::unbanaccounts(std::string const& params, std::string& retStr) +{ + ZoneScoped; + std::map retMap; + http::server::server::parseParams(params, retMap); + + auto& persistor = mApp.getBannedAccountsPersistor(); + + auto it = retMap.find("accountids"); + if (it == retMap.end()) + { + // No accountids param: clear all bans. + // parseParams drops empty values, so also check the raw params. + persistor.clearBannedAccounts(); + mApp.getHerder().setFilteredAccounts({}); + retStr = R"({"status": "banned accounts cleared"})"; + return; + } + + std::vector addresses; + if (!parseAccountIds(it->second, addresses, retStr)) + { + return; + } + + auto beforeCount = persistor.getBannedAccountsCount(); + persistor.removeBannedAccounts(addresses); + auto updated = persistor.getBannedAccounts(); + mApp.getHerder().setFilteredAccounts(updated); + auto actuallyRemoved = beforeCount - updated.size(); + retStr = fmt::format( + FMT_STRING( + R"({{"status": "banned accounts updated", "removed": {}, "total": {}}})"), + actuallyRemoved, updated.size()); +} + void CommandHandler::dumpProposedSettings(std::string const& params, std::string& retStr) @@ -698,9 +827,9 @@ CommandHandler::dumpProposedSettings(std::string const& params, decoder::decode_b64(blob, buffer); ConfigUpgradeSetKey key; xdr::xdr_from_opaque(buffer, key); - auto ls = LedgerSnapshot(mApp); + auto lrv = LedgerReadView(mApp); - auto ptr = ConfigUpgradeSetFrame::makeFromKey(ls, key); + auto ptr = ConfigUpgradeSetFrame::makeFromKey(lrv, key); if (!ptr || ptr->isValidForApply() != Upgrades::UpgradeValidity::VALID) { @@ -929,12 +1058,12 @@ CommandHandler::sorobanInfo(std::string const& params, std::string& retStr) } else if (format == "detailed") { - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); xdr::xvector entries; for (auto c : xdr::xdr_traits::enum_values()) { auto entry = - lsg.load(configSettingKey(static_cast(c))); + lrv.load(configSettingKey(static_cast(c))); if (!entry) { continue; @@ -946,7 +1075,7 @@ CommandHandler::sorobanInfo(std::string const& params, std::string& retStr) } else if (format == "upgrade_xdr") { - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); ConfigUpgradeSet upgradeSet; for (auto c : xdr::xdr_traits::enum_values()) @@ -957,7 +1086,7 @@ CommandHandler::sorobanInfo(std::string const& params, std::string& retStr) { continue; } - auto entry = lsg.load(configSettingKey(configSettingID)); + auto entry = lrv.load(configSettingKey(configSettingID)); if (!entry) { continue; @@ -1026,6 +1155,7 @@ CommandHandler::tx(std::string const& params, std::string& retStr) std::map paramMap; http::server::server::parseParams(params, paramMap); std::string blob = paramMap["blob"]; + bool force = paramMap["force"] == "true"; if (!blob.empty()) { @@ -1049,7 +1179,7 @@ CommandHandler::tx(std::string const& params, std::string& retStr) { // Add it to our current set and make sure it is valid. auto addResult = - mApp.getHerder().recvTransaction(transaction, true); + mApp.getHerder().recvTransaction(transaction, true, force); root["status"] = TX_STATUS_STRING[static_cast(addResult.code)]; if (addResult.code == @@ -1085,26 +1215,6 @@ CommandHandler::tx(std::string const& params, std::string& retStr) retStr = Json::FastWriter().write(root); } -void -CommandHandler::maintenance(std::string const& params, std::string& retStr) -{ - ZoneScoped; - std::map map; - http::server::server::parseParams(params, map); - if (map["queue"] == "true") - { - uint32_t count = - parseOptionalParamOrDefault(map, "count", 50000); - - mApp.getMaintainer().performMaintenance(count); - retStr = "Done"; - } - else - { - retStr = "No work performed"; - } -} - void CommandHandler::clearMetrics(std::string const& params, std::string& retStr) { @@ -1420,15 +1530,15 @@ CommandHandler::testAcc(std::string const& params, std::string& retStr) key = getAccount(accName->second.c_str()); } - LedgerSnapshot lsg(mApp); - auto acc = lsg.load(accountKey(key.getPublicKey())); + LedgerReadView lrv(mApp); + auto acc = lrv.load(accountKey(key.getPublicKey())); if (acc) { auto const& ae = acc.current().data.account(); root["name"] = accName->second; root["id"] = KeyUtils::toStrKey(ae.accountID); - root["balance"] = (Json::Int64)ae.balance; - root["seqnum"] = (Json::UInt64)ae.seqNum; + root["balance"] = static_cast(ae.balance); + root["seqnum"] = static_cast(ae.seqNum); } } retStr = root.toStyledString(); @@ -1471,7 +1581,7 @@ CommandHandler::testTx(std::string const& params, std::string& retStr) root["to_name"] = to->second; root["from_id"] = KeyUtils::toStrKey(fromAccount.getPublicKey()); root["to_id"] = KeyUtils::toStrKey(toAccount.getPublicKey()); - root["amount"] = (Json::UInt64)paymentAmount; + root["amount"] = static_cast(paymentAmount); TransactionTestFramePtr txFrame; if (create != retMap.end() && create->second == "true") diff --git a/src/main/CommandHandler.h b/src/main/CommandHandler.h index 9011d10275..eaef9c6c48 100644 --- a/src/main/CommandHandler.h +++ b/src/main/CommandHandler.h @@ -4,6 +4,7 @@ #pragma once +#include "ledger/LedgerStateSnapshot.h" #include "lib/http/server.hpp" #include "main/QueryServer.h" #include "util/ProtocolVersion.h" @@ -52,6 +53,10 @@ class CommandHandler // "core is booting" response for every request. void setReady(); + // Forward new ledger state to QueryServer (no-op if query server is + // not enabled). + void addSnapshot(CompleteConstLedgerStatePtr state); + std::string manualCmd(std::string const& cmd); void fileNotFound(std::string const& params, std::string& retStr); @@ -62,7 +67,6 @@ class CommandHandler void info(std::string const& params, std::string& retStr); void ll(std::string const& params, std::string& retStr); void logRotate(std::string const& params, std::string& retStr); - void maintenance(std::string const& params, std::string& retStr); void manualClose(std::string const& params, std::string& retStr); void metrics(std::string const& params, std::string& retStr); void clearMetrics(std::string const& params, std::string& retStr); @@ -73,6 +77,16 @@ class CommandHandler void tx(std::string const& params, std::string& retStr); void unban(std::string const& params, std::string& retStr); void upgrades(std::string const& params, std::string& retStr); + void banaccounts(std::string const& params, std::string& retStr); + void unbanaccounts(std::string const& params, std::string& retStr); + + // Parse a comma-separated list of accountids from the given value, + // validating each as a valid StrKey. On error, sets retStr and returns + // false. + bool parseAccountIds(std::string const& value, + std::vector& addresses, + std::string& retStr); + void dumpProposedSettings(std::string const& params, std::string& retStr); void surveyTopology(std::string const&, std::string& retStr); void stopSurvey(std::string const&, std::string& retStr); @@ -88,6 +102,13 @@ class CommandHandler void testAcc(std::string const& params, std::string& retStr); void testTx(std::string const& params, std::string& retStr); void toggleOverlayOnlyMode(std::string const& params, std::string& retStr); + + QueryServer& + getQueryServer() + { + releaseAssert(mQueryServer); + return *mQueryServer; + } #endif }; } diff --git a/src/main/CommandLine.cpp b/src/main/CommandLine.cpp index c58ab00d65..2c870bed8c 100644 --- a/src/main/CommandLine.cpp +++ b/src/main/CommandLine.cpp @@ -61,8 +61,6 @@ namespace stellar { -static uint32_t const MAINTENANCE_LEDGER_COUNT = 1000000; - void writeWithTextFlow(std::ostream& os, std::string const& text) { @@ -826,17 +824,6 @@ runCatchup(CommandLineArgs const& args) config.MANUAL_CLOSE = true; config.DISABLE_BUCKET_GC = disableBucketGC; - if (config.AUTOMATIC_MAINTENANCE_PERIOD.count() > 0 && - config.AUTOMATIC_MAINTENANCE_COUNT > 0) - { - // If the user did not _disable_ maintenance, turn the dial up - // to be much more aggressive about running maintenance during a - // bulk catchup, otherwise the DB is likely to overflow with - // unwanted history. - config.AUTOMATIC_MAINTENANCE_PERIOD = std::chrono::seconds{30}; - config.AUTOMATIC_MAINTENANCE_COUNT = MAINTENANCE_LEDGER_COUNT; - } - maybeSetMetadataOutputStream(config, stream); VirtualClock clock(VirtualClock::REAL_TIME); @@ -1384,7 +1371,7 @@ runCheckQuorumIntersection(CommandLineArgs const& args) std::optional cfg = std::nullopt; std::string jsonPath; std::string resultJson; - bool analyzeCriticalGroups; + bool analyzeCriticalGroups = false; uint64_t timeLimitMs = 5000; // Default: 5 seconds size_t memoryLimitBytes = 100 * 1024 * 1024; // Default: 100 MiB bool v2 = true; @@ -1620,20 +1607,6 @@ run(CommandLineArgs const& args) if (cfg.RUN_STANDALONE) { clockMode = VirtualClock::VIRTUAL_TIME; - if (cfg.AUTOMATIC_MAINTENANCE_COUNT != 0 || - cfg.AUTOMATIC_MAINTENANCE_PERIOD.count() != 0) - { - LOG_WARNING(DEFAULT_LOG, - "Using MANUAL_CLOSE and RUN_STANDALONE " - "together induces virtual time, which " - "requires automatic maintenance to be " - "disabled. AUTOMATIC_MAINTENANCE_COUNT " - "and AUTOMATIC_MAINTENANCE_PERIOD are " - "being overridden to 0."); - cfg.AUTOMATIC_MAINTENANCE_COUNT = 0; - cfg.AUTOMATIC_MAINTENANCE_PERIOD = - std::chrono::seconds{0}; - } } } @@ -1699,46 +1672,51 @@ runSignTransaction(CommandLineArgs const& args) int runVersion(CommandLineArgs const&) +{ + writeVersionInfo(std::cout); + return 0; +} + +void +writeVersionInfo(std::ostream& os) { rust::Vec rustVersions = rust_bridge::get_soroban_version_info( Config::CURRENT_LEDGER_PROTOCOL_VERSION); - std::cout << STELLAR_CORE_VERSION << std::endl; - std::cout << "ledger protocol version: " - << Config::CURRENT_LEDGER_PROTOCOL_VERSION << std::endl; - std::cout << "rust version: " << rust_bridge::get_rustc_version().c_str() - << std::endl; + os << STELLAR_CORE_VERSION << std::endl; + os << "ledger protocol version: " << Config::CURRENT_LEDGER_PROTOCOL_VERSION + << std::endl; + os << "rust version: " << rust_bridge::get_rustc_version().c_str() + << std::endl; - std::cout << "soroban-env-host versions: " << std::endl; + os << "soroban-env-host versions: " << std::endl; size_t i = 0; for (auto& host : rustVersions) { - std::cout << " host[" << i << "]:" << std::endl; - std::cout << " package version: " << host.env_pkg_ver.c_str() - << std::endl; + os << " host[" << i << "]:" << std::endl; + os << " package version: " << host.env_pkg_ver.c_str() + << std::endl; - std::cout << " git version: " << host.env_git_rev.c_str() - << std::endl; + os << " git version: " << host.env_git_rev.c_str() << std::endl; - std::cout << " ledger protocol version: " << host.env_max_proto - << std::endl; + os << " ledger protocol version: " << host.env_max_proto + << std::endl; - std::cout << " pre-release version: " << host.env_pre_release_ver - << std::endl; + os << " pre-release version: " << host.env_pre_release_ver + << std::endl; - std::cout << " rs-stellar-xdr:" << std::endl; + os << " rs-stellar-xdr:" << std::endl; - std::cout << " package version: " << host.xdr_pkg_ver.c_str() - << std::endl; - std::cout << " git version: " << host.xdr_git_rev.c_str() - << std::endl; - std::cout << " base XDR git version: " - << host.xdr_base_git_rev.c_str() << std::endl; + os << " package version: " << host.xdr_pkg_ver.c_str() + << std::endl; + os << " git version: " << host.xdr_git_rev.c_str() + << std::endl; + os << " base XDR git version: " + << host.xdr_base_git_rev.c_str() << std::endl; ++i; } - return 0; } #ifdef BUILD_TESTS @@ -1850,158 +1828,110 @@ runGenFuzz(CommandLineArgs const& args) }); } -ParserWithValidation -applyLoadModeParser(std::string& modeArg, ApplyLoadMode& mode) -{ - auto validateMode = [&] { - if (iequals(modeArg, "ledger-limits")) - { - mode = ApplyLoadMode::LIMIT_BASED; - return ""; - } - if (iequals(modeArg, "max-sac-tps")) - { - mode = ApplyLoadMode::MAX_SAC_TPS; - return ""; - } - if (iequals(modeArg, "limits-for-model-tx")) - { - mode = ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX; - return ""; - } - return "Unrecognized apply-load mode. Please select 'ledger-limits' " - "or 'max-sac-tps'."; - }; - - return {clara::Opt{modeArg, "MODE"}["--mode"]( - "set the apply-load mode. Expected modes: ledger-limits, " - "max-sac-tps. Defaults to ledger-limits."), - validateMode}; -} - int runApplyLoad(CommandLineArgs const& args) { CommandLine::ConfigOption configOption; - ApplyLoadMode mode{ApplyLoadMode::LIMIT_BASED}; - std::string modeArg = "ledger-limits"; - return runWithHelp( - args, - {configurationParser(configOption), applyLoadModeParser(modeArg, mode)}, - [&] { - auto config = configOption.getConfig(); - config.RUN_STANDALONE = true; - config.MANUAL_CLOSE = true; - config.USE_CONFIG_FOR_GENESIS = true; - config.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; - config.LEDGER_PROTOCOL_VERSION = - Config::CURRENT_LEDGER_PROTOCOL_VERSION; - if (config.APPLY_LOAD_NUM_LEDGERS == 0) - { - throw std::runtime_error( - "APPLY_LOAD_NUM_LEDGERS must be greater than 0"); - } - if (mode == ApplyLoadMode::MAX_SAC_TPS) - { - if (config.APPLY_LOAD_MAX_SAC_TPS_MIN_TPS >= - config.APPLY_LOAD_MAX_SAC_TPS_MAX_TPS) - { - throw std::runtime_error( - "APPLY_LOAD_MAX_SAC_TPS_MIN_TPS must be less than " - "APPLY_LOAD_MAX_SAC_TPS_MAX_TPS for max_sac_tps mode"); - } - - // For now, metrics are expensive at high, parallel load. We - // disable them so they don't bottleneck the test, but this - // should be addressed in the future. - config.DISABLE_SOROBAN_METRICS_FOR_TESTING = true; - config.METADATA_OUTPUT_STREAM = ""; - config.METADATA_DEBUG_LEDGERS = 0; - - // Apply Load may exceed TX_SET byte size limits, so ignore them - config.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; - - // Always use background ledger close for max-sac-tps - config.PARALLEL_LEDGER_APPLY = true; - } + return runWithHelp(args, {configurationParser(configOption)}, [&] { + auto config = configOption.getConfig(); + auto mode = config.APPLY_LOAD_MODE; + // Common boilerplate configuration for apply load benchmarking. + // The goal of this config is to set up all the common parameters + // that don't affect benchmarking at once. + // Parameters that affect benchmarking should be set explicitly + // in the benchmarking config for the sake of reproducibility and + // clarity. + config.RUN_STANDALONE = true; + config.MANUAL_CLOSE = true; + config.NODE_IS_VALIDATOR = true; + config.USE_CONFIG_FOR_GENESIS = true; + config.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; + config.LEDGER_PROTOCOL_VERSION = + Config::CURRENT_LEDGER_PROTOCOL_VERSION; + config.NETWORK_PASSPHRASE = "Apply Load"; + config.PARALLEL_LEDGER_APPLY = true; + + // All modes besides limit-based don't need to worry about message + // limits. + if (mode != ApplyLoadMode::LIMIT_BASED) + { + config.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; + } - VirtualClock clock(VirtualClock::REAL_TIME); - auto appPtr = Application::create(clock, config); + VirtualClock clock(VirtualClock::REAL_TIME); + auto appPtr = Application::create(clock, config); - auto& app = *appPtr; + auto& app = *appPtr; + { + app.start(); + + // Constructs and sets up the apply load benchmarking harness. + // The setup may take some time as it involves injecting the + // test entries into bucket list across multiple ledgers ( + // depending on the configuration). + ApplyLoad al(app); + + // In the limit-based mode, we may want publish the history + // checkpoint just before performing the benchmark. This way + // the 'checkpointed' bucket list could be used downstream in + // order to setup the test environment for meta ingestion + // benchmarking. Note, that the apply load test setup avoids + // using transactions in order to make it faster, so the + // injected test entries are only observable in the bucket + // list and not in the meta or transaction history. + if (mode == ApplyLoadMode::LIMIT_BASED && + app.getHistoryArchiveManager().publishEnabled()) { - app.start(); - - // Constructs and sets up the apply load benchmarking harness. - // The setup may take some time as it involves injecting the - // test entries into bucket list across multiple ledgers ( - // depending on the configuration). - ApplyLoad al(app, mode); - - // In the limit-based mode, we may want publish the history - // checkpoint just before performing the benchmark. This way - // the 'checkpointed' bucket list could be used downstream in - // order to setup the test environment for meta ingestion - // benchmarking. Note, that the apply load test setup avoids - // using transactions in order to make it faster, so the - // injected test entries are only observable in the bucket - // list and not in the meta or transaction history. - if (mode == ApplyLoadMode::LIMIT_BASED && - app.getHistoryArchiveManager().publishEnabled()) + app.getHistoryManager().waitForCheckpointPublish(); + CLOG_INFO(Perf, "Closing ledgers until next checkpoint for " + "history archive publication"); + while (!HistoryManagerImpl::publishCheckpointOnLedgerClose( + app.getLedgerManager().getLastClosedLedgerNum(), + app.getConfig())) { - app.getHistoryManager().waitForCheckpointPublish(); - CLOG_INFO(Perf, "Closing ledgers until next checkpoint for " - "history archive publication"); - while (!HistoryManagerImpl::publishCheckpointOnLedgerClose( - app.getLedgerManager().getLastClosedLedgerNum(), - app.getConfig())) - { - al.closeLedger({}); - } - app.getHistoryManager().waitForCheckpointPublish(); - CLOG_INFO( - Perf, - "Published final checkpoint before benchmark: " - "ledger {} ({})", - app.getLedgerManager().getLastClosedLedgerNum(), - fmt::format( - FMT_STRING("{:08x}"), - app.getLedgerManager().getLastClosedLedgerNum())); + al.closeLedger({}); } + app.getHistoryManager().waitForCheckpointPublish(); + CLOG_INFO(Perf, + "Published final checkpoint before benchmark: " + "ledger {} ({})", + app.getLedgerManager().getLastClosedLedgerNum(), + fmt::format( + FMT_STRING("{:08x}"), + app.getLedgerManager().getLastClosedLedgerNum())); + } - auto& ledgerClose = - app.getMetrics().NewTimer({"ledger", "ledger", "close"}); - ledgerClose.Clear(); + auto& ledgerClose = + app.getMetrics().NewTimer({"ledger", "ledger", "close"}); + ledgerClose.Clear(); - auto& cpuInsRatio = app.getMetrics().NewHistogram( - {"soroban", "host-fn-op", - "invoke-time-fsecs-cpu-insn-ratio"}); - cpuInsRatio.Clear(); + auto& cpuInsRatio = app.getMetrics().NewHistogram( + {"soroban", "host-fn-op", "invoke-time-fsecs-cpu-insn-ratio"}); + cpuInsRatio.Clear(); - auto& cpuInsRatioExclVm = app.getMetrics().NewHistogram( - {"soroban", "host-fn-op", - "invoke-time-fsecs-cpu-insn-ratio-excl-vm"}); - cpuInsRatioExclVm.Clear(); + auto& cpuInsRatioExclVm = app.getMetrics().NewHistogram( + {"soroban", "host-fn-op", + "invoke-time-fsecs-cpu-insn-ratio-excl-vm"}); + cpuInsRatioExclVm.Clear(); - auto& ledgerCpuInsRatio = app.getMetrics().NewHistogram( - {"soroban", "host-fn-op", "ledger-cpu-insns-ratio"}); - ledgerCpuInsRatio.Clear(); + auto& ledgerCpuInsRatio = app.getMetrics().NewHistogram( + {"soroban", "host-fn-op", "ledger-cpu-insns-ratio"}); + ledgerCpuInsRatio.Clear(); - auto& ledgerCpuInsRatioExclVm = app.getMetrics().NewHistogram( - {"soroban", "host-fn-op", - "ledger-cpu-insns-ratio-excl-vm"}); - ledgerCpuInsRatioExclVm.Clear(); + auto& ledgerCpuInsRatioExclVm = app.getMetrics().NewHistogram( + {"soroban", "host-fn-op", "ledger-cpu-insns-ratio-excl-vm"}); + ledgerCpuInsRatioExclVm.Clear(); - auto& totalTxApplyTime = app.getMetrics().NewTimer( - {"ledger", "transaction", "total-apply"}); - totalTxApplyTime.Clear(); + auto& totalTxApplyTime = app.getMetrics().NewTimer( + {"ledger", "transaction", "total-apply"}); + totalTxApplyTime.Clear(); - al.execute(); - } + al.execute(); + } - return 0; - }); + return 0; + }); } int diff --git a/src/main/CommandLine.h b/src/main/CommandLine.h index f1f235598c..d90be7911d 100644 --- a/src/main/CommandLine.h +++ b/src/main/CommandLine.h @@ -6,6 +6,7 @@ #include "util/Logging.h" +#include #include #include @@ -22,6 +23,7 @@ struct CommandLineArgs int handleCommandLine(int argc, char* const* argv); int runVersion(CommandLineArgs const&); +void writeVersionInfo(std::ostream& os); void writeWithTextFlow(std::ostream& os, std::string const& text); } diff --git a/src/main/Config.cpp b/src/main/Config.cpp index 464999c9f8..13abb8a517 100644 --- a/src/main/Config.cpp +++ b/src/main/Config.cpp @@ -16,10 +16,8 @@ #include "util/Fs.h" #include "util/GlobalChecks.h" #include "util/Logging.h" +#include "util/SecretManager.h" #include "util/UnorderedSet.h" -#ifdef BUILD_TESTS -#include "simulation/ApplyLoad.h" -#endif #include #include @@ -33,7 +31,7 @@ namespace stellar { -uint32 const Config::CURRENT_LEDGER_PROTOCOL_VERSION = 25 +uint32 const Config::CURRENT_LEDGER_PROTOCOL_VERSION = 26 #ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION + 1 #endif @@ -162,7 +160,7 @@ Config::Config() : NODE_SEED(SecretKey::random()) LEDGER_PROTOCOL_MIN_VERSION_INTERNAL_ERROR_REPORT = 18; OVERLAY_PROTOCOL_MIN_VERSION = 38; - OVERLAY_PROTOCOL_VERSION = 39; + OVERLAY_PROTOCOL_VERSION = 40; VERSION_STR = STELLAR_CORE_VERSION; @@ -180,16 +178,6 @@ Config::Config() : NODE_SEED(SecretKey::random()) BUCKETLIST_DB_MEMORY_FOR_CACHING = 0; BUCKETLIST_DB_PERSIST_INDEX = true; PUBLISH_TO_ARCHIVE_DELAY = std::chrono::seconds{0}; - // automatic maintenance settings: - // short and prime with 1 hour which will cause automatic maintenance to - // rarely conflict with any other scheduled tasks on a machine (that tend to - // run on a fixed schedule) - AUTOMATIC_MAINTENANCE_PERIOD = std::chrono::seconds{359}; - // count picked as to catchup with 1 month worth of ledgers - // in about 1 week. - // (30*24*3600/5) / (400 - 359/5 ) // number of periods needed to catchup - // * (359) / (24*3600) = 6.56 days - AUTOMATIC_MAINTENANCE_COUNT = 400; // automatic self-check happens once every 3 hours AUTOMATIC_SELF_CHECK_PERIOD = std::chrono::seconds{3 * 60 * 60}; ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING = false; @@ -351,6 +339,8 @@ Config::Config() : NODE_SEED(SecretKey::random()) BACKFILL_STELLAR_ASSET_EVENTS = false; BACKFILL_RESTORE_META = false; + FILTERED_G_ADDRESSES = {}; + OP_APPLY_SLEEP_TIME_DURATION_FOR_TESTING = {}; OP_APPLY_SLEEP_TIME_WEIGHT_FOR_TESTING = {}; LOADGEN_BYTE_COUNT_FOR_TESTING = {}; @@ -411,6 +401,54 @@ readString(ConfigItem const& item) return item.second->as()->get(); } +#ifdef BUILD_TESTS +ApplyLoadMode +parseApplyLoadMode(ConfigItem const& item) +{ + auto mode = readString(item); + if (mode == "ledger-limits") + { + return ApplyLoadMode::LIMIT_BASED; + } + if (mode == "max-sac-tps") + { + return ApplyLoadMode::MAX_SAC_TPS; + } + if (mode == "limits-for-model-tx") + { + return ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX; + } + if (mode == "benchmark") + { + return ApplyLoadMode::BENCHMARK_MODEL_TX; + } + throw std::invalid_argument( + "invalid 'APPLY_LOAD_MODE', expected one of: ledger-limits, " + "max-sac-tps, limits-for-model-tx, benchmark"); +} + +ApplyLoadModelTx +parseApplyLoadModelTx(ConfigItem const& item) +{ + auto modelTx = readString(item); + if (modelTx == "sac") + { + return ApplyLoadModelTx::SAC; + } + if (modelTx == "custom_token") + { + return ApplyLoadModelTx::CUSTOM_TOKEN; + } + if (modelTx == "soroswap") + { + return ApplyLoadModelTx::SOROSWAP; + } + throw std::invalid_argument( + "invalid 'APPLY_LOAD_MODEL_TX', expected one of: sac, custom_token, " + "soroswap"); +} +#endif + template std::vector readArray(ConfigItem const& item) @@ -873,7 +911,21 @@ Config::load(std::istream& in) cpptoml::parser p(in); t = p.parse(); processConfig(t); + +#ifdef BUILD_TESTS + std::ostringstream configToml; + configToml << *t; + mLoadedConfigToml = configToml.str(); +#endif +} + +#ifdef BUILD_TESTS +std::string const& +Config::getLoadedConfigToml() const +{ + return mLoadedConfigToml; } +#endif void Config::addSelfToValidators( @@ -1037,6 +1089,7 @@ Config::processConfig(std::shared_ptr t) } std::vector validators; UnorderedMap domainQualityMap; + bool usedExternalSecrets = false; // cpptoml returns the items in non-deterministic order // so we need to process items that are potential dependencies first @@ -1238,12 +1291,15 @@ Config::processConfig(std::shared_ptr t) }}, {"AUTOMATIC_MAINTENANCE_PERIOD", [&]() { - AUTOMATIC_MAINTENANCE_PERIOD = - std::chrono::seconds{readInt(item)}; + LOG_WARNING(DEFAULT_LOG, + "AUTOMATIC_MAINTENANCE_PERIOD is deprecated " + "and ignored. Please remove this from config"); }}, {"AUTOMATIC_MAINTENANCE_COUNT", [&]() { - AUTOMATIC_MAINTENANCE_COUNT = readInt(item); + LOG_WARNING(DEFAULT_LOG, + "AUTOMATIC_MAINTENANCE_COUNT is deprecated " + "and ignored. Please remove this from config"); }}, {"AUTOMATIC_SELF_CHECK_PERIOD", [&]() { @@ -1278,7 +1334,11 @@ Config::processConfig(std::shared_ptr t) {"NODE_SEED", [&]() { PublicKey nodeID; - parseNodeID(readString(item), nodeID, NODE_SEED, true); + auto raw = readString(item); + usedExternalSecrets = usedExternalSecrets || + secretmanager::isExternalSecret(raw); + parseNodeID(secretmanager::resolve(raw), nodeID, NODE_SEED, + true); }}, {"NODE_IS_VALIDATOR", [&]() { NODE_IS_VALIDATOR = readBool(item); }}, @@ -1512,6 +1572,20 @@ Config::processConfig(std::shared_ptr t) EXCLUDE_TRANSACTIONS_CONTAINING_OPERATION_TYPE = readXdrEnumArray(item); }}, + {"FILTERED_G_ADDRESSES", + [&]() { + FILTERED_G_ADDRESSES = readArray(item); + for (auto const& addr : FILTERED_G_ADDRESSES) + { + KeyUtils::fromStrKey(addr); + } + CLOG_WARNING( + Overlay, + "FILTERED_G_ADDRESSES is deprecated. It will be " + "removed in a future release. Please use " + "`banaccounts` HTTP endpoint instead to ban accounts " + "from submitting transactions to this node."); + }}, {"OP_APPLY_SLEEP_TIME_DURATION_FOR_TESTING", [&]() { // Since it doesn't make sense to sleep for a negative @@ -1592,6 +1666,10 @@ Config::processConfig(std::shared_ptr t) readIntArray(item); }}, #ifdef BUILD_TESTS + {"APPLY_LOAD_MODE", + [&]() { APPLY_LOAD_MODE = parseApplyLoadMode(item); }}, + {"APPLY_LOAD_MODEL_TX", + [&]() { APPLY_LOAD_MODEL_TX = parseApplyLoadModelTx(item); }}, {"APPLY_LOAD_DATA_ENTRY_SIZE", [&]() { APPLY_LOAD_DATA_ENTRY_SIZE = readInt(item); @@ -1752,15 +1830,6 @@ Config::processConfig(std::shared_ptr t) [&]() { APPLY_LOAD_TARGET_CLOSE_TIME_MS = readInt(item, 1); - if (APPLY_LOAD_TARGET_CLOSE_TIME_MS % - ApplyLoad::TARGET_CLOSE_TIME_STEP_MS != - 0) - { - throw std::invalid_argument(fmt::format( - FMT_STRING("APPLY_LOAD_TARGET_CLOSE_TIME_MS " - "must be a multiple of {}."), - ApplyLoad::TARGET_CLOSE_TIME_STEP_MS)); - } }}, {"APPLY_LOAD_MAX_SAC_TPS_MIN_TPS", [&]() { @@ -2023,6 +2092,13 @@ Config::processConfig(std::shared_ptr t) gIsProductionNetwork = NETWORK_PASSPHRASE == "Public Global Stellar Network ; September 2015"; + if (gIsProductionNetwork && usedExternalSecrets) + { + throw std::invalid_argument( + "External secret references ($FILE:) are not supported on " + "the public network"); + } + // Validators default to starting the network from local state FORCE_SCP = NODE_IS_VALIDATOR; diff --git a/src/main/Config.h b/src/main/Config.h index c583d63477..0235d1a690 100644 --- a/src/main/Config.h +++ b/src/main/Config.h @@ -69,9 +69,25 @@ struct ValidatorWeightConfig UnorderedMap mQualityWeights; }; -class Config : public std::enable_shared_from_this +#ifdef BUILD_TESTS +enum class ApplyLoadMode +{ + LIMIT_BASED, + FIND_LIMITS_FOR_MODEL_TX, + MAX_SAC_TPS, + BENCHMARK_MODEL_TX +}; + +enum class ApplyLoadModelTx { + SAC, + CUSTOM_TOKEN, + SOROSWAP +}; +#endif +class Config : public std::enable_shared_from_this +{ void validateConfig(ValidationThresholdLevels thresholdLevel); void loadQset(std::shared_ptr group, SCPQuorumSet& qset, uint32 level); @@ -206,13 +222,6 @@ class Config : public std::enable_shared_from_this bool CATCHUP_SKIP_KNOWN_RESULTS_FOR_TESTING; #endif // BUILD_TESTS - // Interval between automatic maintenance executions - std::chrono::seconds AUTOMATIC_MAINTENANCE_PERIOD; - - // Number of unneeded rows in each table that will be removed during one - // maintenance run - uint32_t AUTOMATIC_MAINTENANCE_COUNT; - // Interval between automatic invocations of self-check. std::chrono::seconds AUTOMATIC_SELF_CHECK_PERIOD; @@ -335,7 +344,11 @@ class Config : public std::enable_shared_from_this std::vector LOADGEN_INSTRUCTIONS_FOR_TESTING; std::vector LOADGEN_INSTRUCTIONS_DISTRIBUTION_FOR_TESTING; +#ifdef BUILD_TESTS // apply-load-specific configuration parameters: + ApplyLoadMode APPLY_LOAD_MODE = ApplyLoadMode::LIMIT_BASED; + ApplyLoadModelTx APPLY_LOAD_MODEL_TX = ApplyLoadModelTx::SAC; + // Size of the synthetic contract data entries used in apply-load. // Currently we generate entries of the equal size for more precise // control over the modelled instructions. @@ -433,6 +446,7 @@ class Config : public std::enable_shared_from_this // If set to true, database writes will count towards TPS calculation. // Otherwise, BucketList writes will not be counted. bool APPLY_LOAD_TIME_WRITES = true; +#endif // BUILD_TESTS // Waits for merges to complete before applying transactions during catchup bool CATCHUP_WAIT_MERGES_TX_APPLY_FOR_TESTING; @@ -744,6 +758,14 @@ class Config : public std::enable_shared_from_this // Number of ledger snapshots to maintain for querying uint32_t QUERY_SNAPSHOT_LEDGERS; +#ifdef BUILD_TESTS + // When true, CommandHandler creates a QueryServer using the main thread + // for snapshot lookups (no network I/O). This allows tests to call + // QueryServer functions directly and ensures it has + // all snapshots from startup. + bool QUERY_SERVER_FOR_TESTING{false}; +#endif + // process-management config size_t MAX_CONCURRENT_SUBPROCESSES; @@ -926,10 +948,21 @@ class Config : public std::enable_shared_from_this // contains an operation in this list. std::vector EXCLUDE_TRANSACTIONS_CONTAINING_OPERATION_TYPE; + // Any transaction that reaches the TransactionQueue will be rejected if + // its source account, any operation source account, or (for Soroban txs) + // any ACCOUNT-type write footprint entry matches an address in this list. + std::vector FILTERED_G_ADDRESSES; + Config(); void load(std::string const& filename); void load(std::istream& in); +#ifdef BUILD_TESTS + // Returns the content of the loaded config file as a string. + // This exposes the node seed in the config, so make sure to only use in + // test workloads (such as apply-load). + std::string const& getLoadedConfigToml() const; +#endif // fixes values of connection-relates settings void adjust(); @@ -962,5 +995,10 @@ class Config : public std::enable_shared_from_this void processOpApplySleepTimeForTestingConfigs(); std::chrono::seconds HISTOGRAM_WINDOW_SIZE; + + private: +#ifdef BUILD_TESTS + std::string mLoadedConfigToml; +#endif }; } diff --git a/src/main/Maintainer.cpp b/src/main/Maintainer.cpp deleted file mode 100644 index 1029d24379..0000000000 --- a/src/main/Maintainer.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2018 Stellar Development Foundation and contributors. Licensed -// under the Apache License, Version 2.0. See the COPYING file at the root -// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 - -#include "main/Maintainer.h" -#include "herder/HerderPersistence.h" -#include "ledger/LedgerHeaderUtils.h" -#include "ledger/LedgerManager.h" -#include "main/Application.h" -#include "main/Config.h" -#include "util/GlobalChecks.h" -#include "util/LogSlowExecution.h" -#include "util/Logging.h" -#include "util/numeric.h" - -#include -#include - -namespace stellar -{ - -Maintainer::Maintainer(Application& app) : mApp{app}, mTimer{mApp} -{ -} - -void -Maintainer::start() -{ - ZoneScoped; - releaseAssert(threadIsMain()); - auto& c = mApp.getConfig(); - if (c.AUTOMATIC_MAINTENANCE_PERIOD.count() > 0 && - c.AUTOMATIC_MAINTENANCE_COUNT > 0) - { - // compare number of ledgers deleted per maintenance cycle with actual - // number - int64 ledgersPerMaintenancePeriod = bigDivideOrThrow( - c.AUTOMATIC_MAINTENANCE_PERIOD.count(), 1, - std::chrono::duration_cast( - mApp.getLedgerManager().getExpectedLedgerCloseTime()) - .count(), - Rounding::ROUND_UP); - if (c.AUTOMATIC_MAINTENANCE_COUNT <= ledgersPerMaintenancePeriod) - { - LOG_WARNING( - DEFAULT_LOG, "{}", - fmt::format( - FMT_STRING("Maintenance may not be able to keep up: " - "AUTOMATIC_MAINTENANCE_COUNT={:d} <= {:d}"), - c.AUTOMATIC_MAINTENANCE_COUNT, - ledgersPerMaintenancePeriod)); - } - scheduleMaintenance(); - } -} - -void -Maintainer::scheduleMaintenance() -{ - releaseAssert(threadIsMain()); - mTimer.expires_from_now(mApp.getConfig().AUTOMATIC_MAINTENANCE_PERIOD); - mTimer.async_wait([this]() { tick(); }, VirtualTimer::onFailureNoop); -} - -void -Maintainer::tick() -{ - ZoneScoped; - releaseAssert(threadIsMain()); - performMaintenance(mApp.getConfig().AUTOMATIC_MAINTENANCE_COUNT); - scheduleMaintenance(); -} - -void -Maintainer::performMaintenance(uint32_t count) -{ - ZoneScoped; - releaseAssert(threadIsMain()); - - LOG_INFO(DEFAULT_LOG, "Performing maintenance"); - auto logSlow = LogSlowExecution( - "Performing maintenance", LogSlowExecution::Mode::AUTOMATIC_RAII, - "performance issue: check database or perform a large manual " - "maintenance followed by database maintenance. Maintenance took", - std::chrono::seconds{2}); - - // Calculate the minimum of the LCL and/or any queued checkpoint. - uint32_t lcl = mApp.getLedgerManager().getLastClosedLedgerNum(); - uint32_t ql = HistoryManager::getMinLedgerQueuedToPublish(mApp.getConfig()); - uint32_t qmin = ql == 0 ? lcl : std::min(ql, lcl); - - // Next calculate, given qmin, the first ledger it'd be _safe to - // delete_ while still keeping everything required to publish. - // So if qmin is (for example) 0x7f = 127, then we want to keep 64 - // ledgers before that, and therefore can erase 0x3f = 63 and less. - uint32_t freq = HistoryManager::getCheckpointFrequency(mApp.getConfig()); - uint32_t lmin = qmin >= freq ? qmin - freq : 0; - - CLOG_INFO(History, "Trimming history <= ledger {}", lmin); - - // Cleanup SCP history, always from main - HerderPersistence::deleteOldEntries(mApp.getDatabase().getRawMiscSession(), - lmin, count); - - if (mApp.getConfig().parallelLedgerClose()) - { - // Cleanup headers from background, to avoid conflicts with closing - // ledgers - mApp.postOnLedgerCloseThread( - [&db = mApp.getDatabase(), lmin, count]() { - auto session = std::make_unique(db.getPool()); - LedgerHeaderUtils::deleteOldEntries(*session, lmin, count); - }, - "maintenance: deleteOldEntries"); - } - else - { - LedgerHeaderUtils::deleteOldEntries(mApp.getDatabase().getRawSession(), - lmin, count); - } -} -} diff --git a/src/main/Maintainer.h b/src/main/Maintainer.h deleted file mode 100644 index fca5c5ddfa..0000000000 --- a/src/main/Maintainer.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2018 Stellar Development Foundation and contributors. Licensed -// under the Apache License, Version 2.0. See the COPYING file at the root -// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 - -#pragma once - -#include "util/Timer.h" - -#include - -namespace stellar -{ - -class Application; - -class Maintainer -{ - public: - explicit Maintainer(Application& app); - - // start automatic maintenance according to app.getConfig() - void start(); - - // removes maximum count entries from tables like scphistory - void performMaintenance(uint32_t count); - - private: - Application& mApp; - VirtualTimer mTimer; - - void scheduleMaintenance(); - void tick(); -}; -} diff --git a/src/main/PersistentState.cpp b/src/main/PersistentState.cpp index 5986251738..02d24c5be7 100644 --- a/src/main/PersistentState.cpp +++ b/src/main/PersistentState.cpp @@ -19,7 +19,7 @@ namespace stellar using namespace std; std::string PersistentState::mainMapping[kLastEntryMain] = { - "lastclosedledger", "historyarchivestate", "databaseschema", + "lastclosedledgerheader", "historyarchivestate", "databaseschema", "networkpassphrase", "rebuildledger"}; std::string PersistentState::miscMapping[kLastEntry] = { diff --git a/src/main/PersistentState.h b/src/main/PersistentState.h index 63afc5f321..b87909c555 100644 --- a/src/main/PersistentState.h +++ b/src/main/PersistentState.h @@ -24,7 +24,7 @@ class PersistentState enum Entry { // LCL-related entries - kLastClosedLedger = 0, + kLastClosedLedgerHeader = 0, kHistoryArchiveState, kDatabaseSchema, kNetworkPassphrase, diff --git a/src/main/QueryServer.cpp b/src/main/QueryServer.cpp index ae5f3fee87..f66de31a8c 100644 --- a/src/main/QueryServer.cpp +++ b/src/main/QueryServer.cpp @@ -67,6 +67,8 @@ QueryServer::QueryServer(std::string const& address, unsigned short port, ) : mServer(address, port, maxClient, threadPoolSize) , mAppConnector(appConnector) + // Always keep the LCL snapshot plus any additional historical snapshots. + , mMaxSnapshots(appConnector.getConfig().QUERY_SNAPSHOT_LEDGERS + 1) { LOG_INFO(DEFAULT_LOG, "Listening on {}:{} for Query requests", address, port); @@ -78,11 +80,8 @@ QueryServer::QueryServer(std::string const& address, unsigned short port, #ifdef BUILD_TESTS if (useMainThreadForTesting) { - auto [live, hotArchive] = - mAppConnector.copySearchableBucketListSnapshots(); - mBucketListSnapshots[std::this_thread::get_id()] = std::move(live); - mHotArchiveBucketListSnapshots[std::this_thread::get_id()] = - std::move(hotArchive); + // Register the main thread for per-thread snapshot cache + mPerThreadSnapshots[std::this_thread::get_id()]; } else #endif @@ -90,10 +89,7 @@ QueryServer::QueryServer(std::string const& address, unsigned short port, auto workerPids = mServer.start(); for (auto pid : workerPids) { - auto [live, hotArchive] = - mAppConnector.copySearchableBucketListSnapshots(); - mBucketListSnapshots[pid] = std::move(live); - mHotArchiveBucketListSnapshots[pid] = std::move(hotArchive); + mPerThreadSnapshots[pid]; } } } @@ -110,6 +106,96 @@ QueryServer::setReady() mIsReady = true; } +void +QueryServer::addSnapshot(CompleteConstLedgerStatePtr state) +{ + releaseAssert(state); + if (mMaxSnapshots == 0) + { + return; + } + + SharedLockExclusive guard(mMutex); + auto seq = state->getLastClosedLedgerHeader().header.ledgerSeq; + + // Make sure we don't have gaps in our snapshots. + if (!mStates.empty()) + { + releaseAssert(mStates.rbegin()->first == seq - 1); + } + + mStates.emplace(seq, std::move(state)); + + // Clean up outdated snapshots + while (mStates.size() > mMaxSnapshots) + { + mStates.erase(mStates.begin()); + } +} + +LedgerStateSnapshot* +QueryServer::getSnapshotForLedger(std::optional ledgerSeq) +{ + auto it = mPerThreadSnapshots.find(std::this_thread::get_id()); + releaseAssert(it != mPerThreadSnapshots.end()); + auto& cache = it->second; + + // If a specific ledger was requested, check thread-local cache first + if (ledgerSeq) + { + auto cacheIt = cache.find(*ledgerSeq); + if (cacheIt != cache.end()) + { + return &cacheIt->second; + } + } + + // Look up in the main snapshot map under read lock. If no ledgerSeq + // was specified, resolve to the latest available. + CompleteConstLedgerStatePtr state; + uint32_t oldestValid = 0; + { + SharedLockShared guard(mMutex); + if (mStates.empty()) + { + return nullptr; + } + + if (ledgerSeq) + { + auto it = mStates.find(*ledgerSeq); + if (it == mStates.end()) + { + return nullptr; + } + state = it->second; + } + else + { + // Check cache for latest snapshot and return it if found + auto latestLedgerSeq = mStates.rbegin()->first; + auto cacheIt = cache.find(latestLedgerSeq); + if (cacheIt != cache.end()) + { + return &cacheIt->second; + } + + state = mStates.rbegin()->second; + } + + oldestValid = mStates.begin()->first; + } + + // GC outdated snapshots from the local thread cache. + cache.erase(cache.begin(), cache.lower_bound(oldestValid)); + + // Create a thread local snapshot. + auto seq = state->getLastClosedLedgerHeader().header.ledgerSeq; + auto [inserted, _] = cache.emplace( + seq, LedgerStateSnapshot(state, mAppConnector.getMetrics())); + return &inserted->second; +} + bool QueryServer::notFound(std::string const& params, std::string const& body, std::string& retStr) @@ -167,10 +253,6 @@ QueryServer::getLedgerEntryRaw(std::string const& params, std::string const& body, std::string& retStr) { ZoneScoped; - - auto& snapshotPtr = mBucketListSnapshots.at(std::this_thread::get_id()); - mAppConnector.maybeCopySearchableBucketListSnapshot(snapshotPtr); - Json::Value root; std::map> paramMap; @@ -181,7 +263,13 @@ QueryServer::getLedgerEntryRaw(std::string const& params, if (!keys.empty()) { - auto& bl = *snapshotPtr; + auto* snapshotPtr = getSnapshotForLedger(snapshotLedger); + if (!snapshotPtr) + { + retStr = "Ledger not found\n"; + return false; + } + root["ledgerSeq"] = snapshotPtr->getLedgerSeq(); LedgerKeySet orderedKeys; for (auto const& key : keys) @@ -191,31 +279,7 @@ QueryServer::getLedgerEntryRaw(std::string const& params, orderedKeys.emplace(k); } - std::vector loadedKeys; - - // If a snapshot ledger is specified, use it to get the ledger entry - if (snapshotLedger) - { - root["ledgerSeq"] = *snapshotLedger; - - auto loadedKeysOp = - bl.loadKeysFromLedger(orderedKeys, *snapshotLedger); - - // Return 404 if ledgerSeq not found - if (!loadedKeysOp) - { - retStr = "Ledger not found\n"; - return false; - } - - loadedKeys = std::move(*loadedKeysOp); - } - // Otherwise default to current ledger - else - { - loadedKeys = bl.loadKeys(orderedKeys, "query"); - root["ledgerSeq"] = bl.getLedgerSeq(); - } + auto loadedKeys = snapshotPtr->loadLiveKeys(orderedKeys, "query"); for (auto const& le : loadedKeys) { @@ -247,13 +311,6 @@ QueryServer::getLedgerEntry(std::string const& params, std::string const& body, std::string& retStr) { ZoneScoped; - - auto& liveBl = mBucketListSnapshots.at(std::this_thread::get_id()); - auto& hotArchiveBl = - mHotArchiveBucketListSnapshots.at(std::this_thread::get_id()); - - mAppConnector.maybeCopyLiveAndHotArchiveSnapshots(liveBl, hotArchiveBl); - Json::Value root; std::map> paramMap; @@ -294,22 +351,19 @@ QueryServer::getLedgerEntry(std::string const& params, std::string const& body, inputOrderedKeys.push_back(k); } - std::vector liveEntries; - std::vector archivedEntries; - uint32_t ledgerSeq = - snapshotLedger ? *snapshotLedger : liveBl->getLedgerSeq(); - root["ledgerSeq"] = ledgerSeq; - - auto liveEntriesOp = liveBl->loadKeysFromLedger(keysToSearch, ledgerSeq); - - // Return 404 if ledgerSeq not found - if (!liveEntriesOp) + auto* snapshotPtr = getSnapshotForLedger(snapshotLedger); + if (!snapshotPtr) { retStr = "Ledger not found\n"; return false; } + uint32_t ledgerSeq = snapshotPtr->getLedgerSeq(); + root["ledgerSeq"] = ledgerSeq; + + std::vector liveEntries; + std::vector archivedEntries; - liveEntries = std::move(*liveEntriesOp); + liveEntries = snapshotPtr->loadLiveKeys(keysToSearch, "query"); // Remove keys found in live bucketList from subsequent searches for (auto const& le : liveEntries) @@ -329,14 +383,7 @@ QueryServer::getLedgerEntry(std::string const& params, std::string const& body, // Only query archive for soroban keys we didn't find in the live bucketList if (!hotArchiveKeysToSearch.empty()) { - auto archivedEntriesOp = - hotArchiveBl->loadKeysFromLedger(hotArchiveKeysToSearch, ledgerSeq); - if (!archivedEntriesOp) - { - retStr = "Ledger not found\n"; - return false; - } - archivedEntries = std::move(*archivedEntriesOp); + archivedEntries = snapshotPtr->loadArchiveKeys(hotArchiveKeysToSearch); } // Collect TTL keys for Soroban entries in the live BucketList @@ -352,10 +399,7 @@ QueryServer::getLedgerEntry(std::string const& params, std::string const& body, std::vector ttlEntries; if (!ttlKeys.empty()) { - // We haven't updated the live snapshot so we know the have a snapshot - // available for ledgerSeq - ttlEntries = - std::move(liveBl->loadKeysFromLedger(ttlKeys, ledgerSeq).value()); + ttlEntries = snapshotPtr->loadLiveKeys(ttlKeys, "query"); } std::unordered_map ttlMap; diff --git a/src/main/QueryServer.h b/src/main/QueryServer.h index e00ca7ba68..50cafe3dcc 100644 --- a/src/main/QueryServer.h +++ b/src/main/QueryServer.h @@ -6,9 +6,12 @@ #include "lib/httpthreaded/server.hpp" -#include "bucket/BucketSnapshotManager.h" +#include "ledger/LedgerStateSnapshot.h" +#include "util/ThreadAnnotations.h" #include #include +#include +#include #include #include #include @@ -26,16 +29,32 @@ class QueryServer httpThreaded::server::server mServer; - std::unordered_map - mBucketListSnapshots; - - std::unordered_map - mHotArchiveBucketListSnapshots; + // Per-thread cache of LedgerStateSnapshot objects. Each thread owns its + // cache exclusively, so no synchronization is needed for access. Entries + // are created lazily from mStates and garbage-collected when no longer + // present in the shared map. + std::unordered_map> + mPerThreadSnapshots; AppConnector& mAppConnector; std::atomic mIsReady{false}; + // Ledger states for query lookups, containing both the current and recent + // historical states. Protected by a shared mutex so that worker threads + // can read concurrently while the main thread writes on ledger close. + mutable ANNOTATED_SHARED_MUTEX(mMutex); + std::map mStates GUARDED_BY(mMutex); + uint32_t const mMaxSnapshots; + + // Returns a cached LedgerStateSnapshot for the given ledger seq, or + // the latest available snapshot if ledgerSeq is nullopt. The pointer + // is into the per-thread cache and remains valid until the next call + // to getSnapshotForLedger on the same thread. Returns nullptr if no + // snapshot is found. + LedgerStateSnapshot* + getSnapshotForLedger(std::optional ledgerSeq); + bool safeRouter(HandlerRoute route, std::string const& params, std::string const& body, std::string& retStr); @@ -46,7 +65,35 @@ class QueryServer #ifdef BUILD_TESTS public: + // Register the calling thread for per-thread snapshot caching. Must be + // called before any query methods are called from that thread. + void + registerThread() + { + SharedLockExclusive guard(mMutex); + mPerThreadSnapshots[std::this_thread::get_id()]; + } + + LedgerStateSnapshot* + getSnapshotForLedgerForTesting(std::optional ledgerSeq) + { + return getSnapshotForLedger(ledgerSeq); + } + + // Clear all snapshot state. Used between newDB() and start() in tests + // to avoid the duplicate-seq assertion when both paths push the same LCL. + void + resetForTesting() + { + SharedLockExclusive guard(mMutex); + mStates.clear(); + for (auto& [tid, cache] : mPerThreadSnapshots) + { + cache.clear(); + } + } #endif + // Returns raw LedgerKeys for the given keys from the Live BucketList. Does // not query other BucketLists or reason about archival. bool getLedgerEntryRaw(std::string const& params, std::string const& body, @@ -68,5 +115,10 @@ class QueryServer // Called by CommandHandler::setReady() to unblock query endpoints. void setReady(); + + // Called from main thread when a new ledger state is published. The state + // is added to the snapshot map so query workers can serve current and + // historical ledger lookups. + void addSnapshot(CompleteConstLedgerStatePtr state); }; } diff --git a/src/main/main.cpp b/src/main/main.cpp index 016a8454aa..ee8f73dd0c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -350,6 +350,9 @@ main(int argc, char* const* argv) // At least print a backtrace in any circumstance // that would call std::terminate std::set_terminate(printBacktraceAndAbort); + + rust_bridge::set_rust_global_memory_limit_to_unlimited(); + Logging::init(); if (sodium_init() != 0) { diff --git a/src/main/test/BannedAccountsPersistorTests.cpp b/src/main/test/BannedAccountsPersistorTests.cpp new file mode 100644 index 0000000000..c139ed33b0 --- /dev/null +++ b/src/main/test/BannedAccountsPersistorTests.cpp @@ -0,0 +1,440 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#include "crypto/KeyUtils.h" +#include "crypto/SecretKey.h" +#include "herder/Herder.h" +#include "herder/TransactionQueue.h" +#include "main/Application.h" +#include "main/BannedAccountsPersistor.h" +#include "main/CommandHandler.h" +#include "test/Catch2.h" +#include "test/TestAccount.h" +#include "test/TestUtils.h" +#include "test/TxTests.h" +#include "test/test.h" + +using namespace stellar; +using namespace stellar::txtest; + +TEST_CASE("BannedAccountsPersistor basic operations", "[banaccounts]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto& persistor = app->getBannedAccountsPersistor(); + + auto key1 = SecretKey::pseudoRandomForTesting(); + auto key2 = SecretKey::pseudoRandomForTesting(); + auto key3 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + auto addr2 = KeyUtils::toStrKey(key2.getPublicKey()); + auto addr3 = KeyUtils::toStrKey(key3.getPublicKey()); + + SECTION("initially empty") + { + REQUIRE(persistor.getBannedAccounts().empty()); + REQUIRE(persistor.getBannedAccountStrKeys().empty()); + } + + SECTION("add accounts") + { + persistor.addBannedAccounts({addr1, addr2}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + + auto keys = persistor.getBannedAccounts(); + REQUIRE(keys.size() == 2); + // Keys are sorted + REQUIRE(std::is_sorted(keys.begin(), keys.end())); + REQUIRE(std::find(keys.begin(), keys.end(), key1.getPublicKey()) != + keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), key2.getPublicKey()) != + keys.end()); + } + + SECTION("add is idempotent") + { + persistor.addBannedAccounts({addr1}); + persistor.addBannedAccounts({addr1, addr2}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + } + + SECTION("remove accounts") + { + persistor.addBannedAccounts({addr1, addr2, addr3}); + REQUIRE(persistor.getBannedAccounts().size() == 3); + + persistor.removeBannedAccounts({addr2}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + + auto keys = persistor.getBannedAccountStrKeys(); + REQUIRE(std::find(keys.begin(), keys.end(), addr2) == keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), addr1) != keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), addr3) != keys.end()); + } + SECTION("remove non-existent account is no-op") + { + persistor.addBannedAccounts({addr1, addr2}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + + persistor.removeBannedAccounts({addr3}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + } + + SECTION("clear all") + { + persistor.addBannedAccounts({addr1, addr2}); + REQUIRE(persistor.getBannedAccounts().size() == 2); + + persistor.clearBannedAccounts(); + REQUIRE(persistor.getBannedAccounts().empty()); + } +} + +TEST_CASE("FILTERED_G_ADDRESSES migration", "[banaccounts]") +{ + SECTION("addresses migrated from config on startup") + { + VirtualClock clock; + auto cfg = getTestConfig(); + auto key1 = SecretKey::pseudoRandomForTesting(); + auto key2 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + auto addr2 = KeyUtils::toStrKey(key2.getPublicKey()); + + cfg.FILTERED_G_ADDRESSES = {addr1, addr2}; + Application::pointer app = createTestApplication(clock, cfg); + + auto& persistor = app->getBannedAccountsPersistor(); + REQUIRE(persistor.getBannedAccounts().size() == 2); + + auto keys = persistor.getBannedAccountStrKeys(); + REQUIRE(std::find(keys.begin(), keys.end(), addr1) != keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), addr2) != keys.end()); + } + + SECTION("empty config does not affect existing bans") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto key1 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + + // Add a ban via the persistor + app->getBannedAccountsPersistor().addBannedAccounts({addr1}); + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 1); + } + + SECTION("default FILTERED_G_ADDRESSES are migrated") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = { + "GBO7VUL2TOKPWFAWKATIW7K3QYA7WQ63VDY5CAE6AFUUX6BHZBOC2WXC", + "GATDQL767ZM2JQTBEG4BQ5WKOQNGAGWZDUN4GYT2UINPEU3RT2UAMVZH", + "GCQCWEQDICASV3R737LPWPDJ3FPBC6XPWXKPJDL22DLQVGOJAUH5DBJI"}; + // Default config has 3 hardcoded addresses + Application::pointer app = createTestApplication(clock, cfg); + + auto& persistor = app->getBannedAccountsPersistor(); + auto keys = persistor.getBannedAccountStrKeys(); + REQUIRE(keys.size() == 3); + REQUIRE(std::find(keys.begin(), keys.end(), + "GBO7VUL2TOKPWFAWKATIW7K3QYA7WQ63VDY5CAE6AFUUX6" + "BHZBOC2WXC") != keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), + "GATDQL767ZM2JQTBEG4BQ5WKOQNGAGWZDUN4GYT2UINPEU" + "3RT2UAMVZH") != keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), + "GCQCWEQDICASV3R737LPWPDJ3FPBC6XPWXKPJDL22DLQVG" + "OJAUH5DBJI") != keys.end()); + } +} + +TEST_CASE("banaccounts HTTP command with persistence", "[banaccounts]") +{ + SECTION("force flag bypasses banned account filtering") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto srcKey = SecretKey::pseudoRandomForTesting(); + auto src = root->create(srcKey, 1000000000); + + // Ban the source account + auto addr = KeyUtils::toStrKey(srcKey.getPublicKey()); + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr); + + auto acc = getAccount("forceAcc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + + // Without force: filtered + REQUIRE( + app->getHerder().recvTransaction(tx, false, /*force=*/false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + + // With force: bypasses account filter + REQUIRE( + app->getHerder().recvTransaction(tx, false, /*force=*/true).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } + + SECTION("force flag bypasses ban for fee-bump with banned fee source") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + auto feeSourceAcct = root->create(filteredKey, 1000000000); + + // Ban the fee source account + auto addr = KeyUtils::toStrKey(filteredKey.getPublicKey()); + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr); + + auto innerTx = root->tx({payment(root->getPublicKey(), 1)}); + auto fb = feeBump(*app, feeSourceAcct, innerTx, 200); + + // Without force: filtered + REQUIRE( + app->getHerder().recvTransaction(fb, false, /*force=*/false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + + // With force: bypasses account filter + REQUIRE( + app->getHerder().recvTransaction(fb, false, /*force=*/true).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } + + SECTION("ban via command persists and filters transactions") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto srcKey = SecretKey::pseudoRandomForTesting(); + auto src = root->create(srcKey, 1000000000); + + // Ban via HTTP command + auto addr = KeyUtils::toStrKey(srcKey.getPublicKey()); + auto result = app->getCommandHandler().manualCmd( + "banaccounts?accountids=" + addr); + REQUIRE(result.find("banned accounts updated") != std::string::npos); + + // Transaction from the banned source should be filtered + auto acc = getAccount("acc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + REQUIRE( + app->getHerder().recvTransaction(tx, false, /*force=*/false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + + // Verify persisted + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 1); + } + + SECTION("ban is additive") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto key1 = SecretKey::pseudoRandomForTesting(); + auto key2 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + auto addr2 = KeyUtils::toStrKey(key2.getPublicKey()); + + // Add first account + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr1); + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 1); + + // Add second account (additive, not replacing) + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr2); + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 2); + } + + SECTION("empty accountids returns error") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto result = + app->getCommandHandler().manualCmd("banaccounts?accountids="); + REQUIRE(result.find("accountids must not be empty") != + std::string::npos); + } + + SECTION("list banned accounts") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto key1 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr1); + + auto result = app->getCommandHandler().manualCmd("banaccounts"); + REQUIRE(result.find("bannedAccounts") != std::string::npos); + REQUIRE(result.find(addr1) != std::string::npos); + } + + SECTION("invalid address returns error") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto result = app->getCommandHandler().manualCmd( + "banaccounts?accountids=NOT_A_VALID_ADDRESS"); + REQUIRE(result.find("invalid address") != std::string::npos); + } + + SECTION("fee-bump with banned fee source is rejected") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto filteredKey = SecretKey::pseudoRandomForTesting(); + auto feeSource = root->create(filteredKey, 1000000000); + auto feeSourceAcct = TestAccount{*app, filteredKey}; + + auto addr = KeyUtils::toStrKey(filteredKey.getPublicKey()); + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr); + + auto innerTx = root->tx({payment(root->getPublicKey(), 1)}); + auto fb = feeBump(*app, feeSourceAcct, innerTx, 200); + + REQUIRE(app->getHerder().recvTransaction(fb, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + } +} + +TEST_CASE("unbanaccounts HTTP command", "[banaccounts]") +{ + SECTION("unban specific accounts") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto key1 = SecretKey::pseudoRandomForTesting(); + auto key2 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + auto addr2 = KeyUtils::toStrKey(key2.getPublicKey()); + + // Ban both + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr1 + + "," + addr2); + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 2); + + // Unban one + auto result = app->getCommandHandler().manualCmd( + "unbanaccounts?accountids=" + addr1); + REQUIRE(result.find("banned accounts updated") != std::string::npos); + REQUIRE(result.find("\"removed\": 1") != std::string::npos); + + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().size() == + 1); + + // Verify addr2 is still banned + auto keys = app->getBannedAccountsPersistor().getBannedAccountStrKeys(); + REQUIRE(std::find(keys.begin(), keys.end(), addr2) != keys.end()); + REQUIRE(std::find(keys.begin(), keys.end(), addr1) == keys.end()); + } + + SECTION("unban restores transaction acceptance") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto srcKey = SecretKey::pseudoRandomForTesting(); + auto src = root->create(srcKey, 1000000000); + auto addr = KeyUtils::toStrKey(srcKey.getPublicKey()); + + // Ban + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr); + auto acc = getAccount("acc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + + // Unban + app->getCommandHandler().manualCmd("unbanaccounts?accountids=" + addr); + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + } + + SECTION("clear all banned accounts") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto root = app->getRoot(); + auto srcKey = SecretKey::pseudoRandomForTesting(); + auto src = root->create(srcKey, 1000000000); + auto addr = KeyUtils::toStrKey(srcKey.getPublicKey()); + + // Ban first + app->getCommandHandler().manualCmd("banaccounts?accountids=" + addr); + auto acc = getAccount("acc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_FILTERED); + + // Clear all via unbanaccounts with no accountids + auto result = app->getCommandHandler().manualCmd("unbanaccounts"); + REQUIRE(result.find("banned accounts cleared") != std::string::npos); + + // Transaction should now be accepted + REQUIRE(app->getHerder().recvTransaction(tx, false).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + + // Verify persisted state is empty + REQUIRE(app->getBannedAccountsPersistor().getBannedAccounts().empty()); + } + + SECTION("invalid address returns error") + { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + Application::pointer app = createTestApplication(clock, cfg); + + auto result = app->getCommandHandler().manualCmd( + "unbanaccounts?accountids=INVALID"); + REQUIRE(result.find("invalid address") != std::string::npos); + } +} diff --git a/src/main/test/CommandHandlerTests.cpp b/src/main/test/CommandHandlerTests.cpp index 90114ff712..5e8bc6fa7c 100644 --- a/src/main/test/CommandHandlerTests.cpp +++ b/src/main/test/CommandHandlerTests.cpp @@ -2,6 +2,7 @@ // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 +#include "crypto/KeyUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/test/LedgerTestUtils.h" #include "main/Application.h" @@ -603,3 +604,41 @@ TEST_CASE("toggleoverlayonlymode", "[commandhandler]") REQUIRE(root["overlay_only_mode"].asBool() == expectedMode); } } + +TEST_CASE("tx force flag bypasses banned account filter", "[commandhandler]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.FILTERED_G_ADDRESSES = {}; + auto app = createTestApplication(clock, cfg); + auto& ch = app->getCommandHandler(); + + closeLedgerOn(*app, 2, 1, 1, 2017); + + auto root = app->getRoot(); + auto srcKey = SecretKey::pseudoRandomForTesting(); + auto src = root->create(srcKey, 1000000000); + + // Ban the source account + auto addr = KeyUtils::toStrKey(srcKey.getPublicKey()); + ch.manualCmd("banaccounts?accountids=" + addr); + + // Build a valid transaction from the banned account + auto acc = getAccount("forceTestAcc"); + auto tx = src.tx({createAccount(acc.getPublicKey(), 1)}); + auto blob = decoder::encode_b64(xdr::xdr_to_opaque(tx->getEnvelope())); + + SECTION("without force flag, tx is filtered") + { + std::string ret; + ch.tx("?blob=" + blob, ret); + REQUIRE(ret.find("FILTERED") != std::string::npos); + } + + SECTION("with force=true, tx bypasses account ban") + { + std::string ret; + ch.tx("?blob=" + blob + "&force=true", ret); + REQUIRE(ret.find("PENDING") != std::string::npos); + } +} diff --git a/src/main/test/ConfigTests.cpp b/src/main/test/ConfigTests.cpp index f62003f7ab..db47c68fdf 100644 --- a/src/main/test/ConfigTests.cpp +++ b/src/main/test/ConfigTests.cpp @@ -10,9 +10,13 @@ #include "test/Catch2.h" #include "test/test.h" #include "util/Math.h" +#include "util/SecretManager.h" +#include #include +#include using namespace stellar; +namespace stdfs = std::filesystem; namespace { @@ -283,7 +287,7 @@ TEST_CASE("load validators config", "[config]") TEST_CASE("bad validators configs", "[config]") { // basic config has 4 top level as to meet safety requirement - std::string const configPattern = R"( + static char constexpr configPattern[] = R"( NODE_SEED="SA7FGJMMUIHNE3ZPI2UO5I632A7O5FBAZTXFAIEVFA4DSSGLHXACLAIT a3" {NODE_HOME_DOMAIN} NODE_IS_VALIDATOR=true @@ -429,7 +433,8 @@ PUBLIC_KEY="GCWD2OTEJXLIDSOFSTWDPM5IDY27ZGEXIUIBGGA45Q2VXGQ2QAEBG7ZS" ++i; DYNAMIC_SECTION(t[0] << " " << i) { - auto other2 = fmt::format(t[5], fmt::arg("QUALITY_G", t[6])); + auto other2 = + fmt::format(fmt::runtime(t[5]), fmt::arg("QUALITY_G", t[6])); auto newConfig = fmt::format( configPattern, fmt::arg("NODE_HOME_DOMAIN", t[1]), fmt::arg("A1_HOME_DOMAIN", t[2]), fmt::arg("A1_HISTORY", t[3]), @@ -475,7 +480,7 @@ TEST_CASE("nesting level", "[config]") }; std::string configNesting = "UNSAFE_QUORUM=true"; std::string quorumSetNumber = ""; - std::string quorumSetTemplate = R"( + static char constexpr quorumSetTemplate[] = R"( [QUORUM_SET{}] THRESHOLD_PERCENT=50 @@ -570,6 +575,75 @@ TEST_CASE("operation filter configuration", "[config]") } } +TEST_CASE("FILTERED_G_ADDRESSES configuration", "[config]") +{ + auto makeQuorumConfig = []() { + auto hash = sha256(fmt::format("NODE_SEED_{}", 0)); + auto secretKey = SecretKey::fromSeed(hash); + std::stringstream ss; + ss << "UNSAFE_QUORUM=true\n"; + ss << "[QUORUM_SET]\n"; + ss << "THRESHOLD_PERCENT=100\n"; + ss << "VALIDATORS=[\"" << secretKey.getStrKeyPublic() << " A\"]\n"; + return ss; + }; + + SECTION("user config overrides defaults") + { + auto key1 = SecretKey::pseudoRandomForTesting(); + auto key2 = SecretKey::pseudoRandomForTesting(); + auto addr1 = KeyUtils::toStrKey(key1.getPublicKey()); + auto addr2 = KeyUtils::toStrKey(key2.getPublicKey()); + + std::stringstream ss; + ss << "UNSAFE_QUORUM=true\n"; + ss << "FILTERED_G_ADDRESSES=[\"" << addr1 << "\", \"" << addr2 + << "\"]\n"; + ss << "[QUORUM_SET]\n"; + ss << "THRESHOLD_PERCENT=100\n"; + auto hash = sha256(fmt::format("NODE_SEED_{}", 0)); + auto secretKey = SecretKey::fromSeed(hash); + ss << "VALIDATORS=[\"" << secretKey.getStrKeyPublic() << " A\"]\n"; + + Config c; + c.load(ss); + REQUIRE(c.FILTERED_G_ADDRESSES.size() == 2); + REQUIRE(c.FILTERED_G_ADDRESSES[0] == addr1); + REQUIRE(c.FILTERED_G_ADDRESSES[1] == addr2); + } + + SECTION("empty list overrides defaults") + { + std::stringstream ss; + ss << "UNSAFE_QUORUM=true\n"; + ss << "FILTERED_G_ADDRESSES=[]\n"; + ss << "[QUORUM_SET]\n"; + ss << "THRESHOLD_PERCENT=100\n"; + auto hash = sha256(fmt::format("NODE_SEED_{}", 0)); + auto secretKey = SecretKey::fromSeed(hash); + ss << "VALIDATORS=[\"" << secretKey.getStrKeyPublic() << " A\"]\n"; + + Config c; + c.load(ss); + REQUIRE(c.FILTERED_G_ADDRESSES.empty()); + } + + SECTION("invalid G address is rejected") + { + std::stringstream ss; + ss << "UNSAFE_QUORUM=true\n"; + ss << "FILTERED_G_ADDRESSES=[\"NOT_A_VALID_ADDRESS\"]\n"; + ss << "[QUORUM_SET]\n"; + ss << "THRESHOLD_PERCENT=100\n"; + auto hash = sha256(fmt::format("NODE_SEED_{}", 0)); + auto secretKey = SecretKey::fromSeed(hash); + ss << "VALIDATORS=[\"" << secretKey.getStrKeyPublic() << " A\"]\n"; + + Config c; + REQUIRE_THROWS(c.load(ss)); + } +} + // Test that the config loader rejects validator configs with all validators // marked low quality (including 'self'). TEST_CASE("reject all low quality validators config", "[config]") @@ -630,3 +704,150 @@ PUBLIC_KEY="GBVZFVEARURUJTN5ABZPKW36FHKVJK2GHXEVY2SZCCNU5I3CQMTZ3OES" std::stringstream ss(configStr); c.load(ss); } + +TEST_CASE("secret resolution", "[config]") +{ + // A known test seed and its expected public key + std::string const testSeed = + "SA7FGJMMUIHNE3ZPI2UO5I632A7O5FBAZTXFAIEVFA4DSSGLHXACLAIT"; + auto expectedKey = SecretKey::fromStrKeySeed(testSeed).getPublicKey(); + + SECTION("resolve passthrough for plain values") + { + REQUIRE(secretmanager::resolve("hello") == "hello"); + REQUIRE(secretmanager::resolve(testSeed) == testSeed); + REQUIRE(secretmanager::resolve("sqlite3://test.db") == + "sqlite3://test.db"); + } + + SECTION("resolve from file with correct permissions") + { + std::string tmpPath = "/tmp/stellar_test_seed_file"; + { + std::ofstream ofs(tmpPath); + ofs << testSeed; + } + stdfs::permissions(tmpPath, stdfs::perms::owner_read | + stdfs::perms::owner_write); + auto resolved = secretmanager::resolve("$FILE:" + tmpPath); + REQUIRE(resolved == testSeed); + std::remove(tmpPath.c_str()); + } + + SECTION("resolve from file trims trailing whitespace") + { + std::string tmpPath = "/tmp/stellar_test_seed_trim"; + { + std::ofstream ofs(tmpPath); + ofs << testSeed << "\n"; + } + stdfs::permissions(tmpPath, stdfs::perms::owner_read | + stdfs::perms::owner_write); + auto resolved = secretmanager::resolve("$FILE:" + tmpPath); + REQUIRE(resolved == testSeed); + std::remove(tmpPath.c_str()); + } + + SECTION("reject missing file") + { + REQUIRE_THROWS_WITH( + secretmanager::resolve("$FILE:/tmp/stellar_nonexistent_file"), + Catch::Contains("not a regular file")); + } + + SECTION("reject file with overly permissive permissions") + { + std::string tmpPath = "/tmp/stellar_test_seed_perm"; + { + std::ofstream ofs(tmpPath); + ofs << testSeed; + } + stdfs::permissions( + tmpPath, stdfs::perms::owner_read | stdfs::perms::owner_write | + stdfs::perms::group_read | stdfs::perms::others_read); + REQUIRE_THROWS_WITH(secretmanager::resolve("$FILE:" + tmpPath), + Catch::Contains("permissive permissions")); + std::remove(tmpPath.c_str()); + } + + SECTION("reject empty file") + { + std::string tmpPath = "/tmp/stellar_test_seed_empty"; + { + std::ofstream ofs(tmpPath); + // write nothing + } + stdfs::permissions(tmpPath, stdfs::perms::owner_read | + stdfs::perms::owner_write); + REQUIRE_THROWS_WITH(secretmanager::resolve("$FILE:" + tmpPath), + Catch::Contains("empty")); + std::remove(tmpPath.c_str()); + } + + SECTION("NODE_SEED from file in config") + { + std::string tmpPath = "/tmp/stellar_test_node_seed"; + { + std::ofstream ofs(tmpPath); + ofs << testSeed << " self\n"; + } + stdfs::permissions(tmpPath, stdfs::perms::owner_read | + stdfs::perms::owner_write); + auto otherKey = SecretKey::random().getStrKeyPublic(); + std::string configStr = R"( +NODE_SEED="$FILE:)" + tmpPath + + R"(" +UNSAFE_QUORUM=true +[QUORUM_SET] +THRESHOLD_PERCENT=100 +VALIDATORS=[")" + otherKey + R"( A"] +)"; + Config c; + std::stringstream ss(configStr); + c.load(ss); + REQUIRE(c.NODE_SEED.getPublicKey() == expectedKey); + std::remove(tmpPath.c_str()); + } + + SECTION("backward compatibility - inline NODE_SEED") + { + auto otherKey = SecretKey::random().getStrKeyPublic(); + std::string configStr = R"( +NODE_SEED=")" + testSeed + R"( self" +UNSAFE_QUORUM=true +[QUORUM_SET] +THRESHOLD_PERCENT=100 +VALIDATORS=[")" + otherKey + R"( A"] +)"; + Config c; + std::stringstream ss(configStr); + c.load(ss); + REQUIRE(c.NODE_SEED.getPublicKey() == expectedKey); + } + + SECTION("reject external secrets on public network") + { + std::string tmpPath = "/tmp/stellar_test_node_seed_pubnet"; + { + std::ofstream ofs(tmpPath); + ofs << testSeed << " self"; + } + stdfs::permissions(tmpPath, stdfs::perms::owner_read | + stdfs::perms::owner_write); + auto otherKey = SecretKey::random().getStrKeyPublic(); + std::string configStr = R"( +NODE_SEED="$FILE:)" + tmpPath + + R"(" +NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" +UNSAFE_QUORUM=true +[QUORUM_SET] +THRESHOLD_PERCENT=100 +VALIDATORS=[")" + otherKey + R"( A"] +)"; + Config c; + std::stringstream ss(configStr); + REQUIRE_THROWS_WITH(c.load(ss), + Catch::Contains("not supported on the public")); + std::remove(tmpPath.c_str()); + } +} diff --git a/src/main/test/QueryServerTests.cpp b/src/main/test/QueryServerTests.cpp index b4ba4b3185..0b7be52ca3 100644 --- a/src/main/test/QueryServerTests.cpp +++ b/src/main/test/QueryServerTests.cpp @@ -3,13 +3,13 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "bucket/BucketIndexUtils.h" -#include "bucket/BucketManager.h" #include "bucket/test/BucketTestUtils.h" #include "ledger/LedgerTxnImpl.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/test/LedgerTestUtils.h" #include "lib/catch.hpp" #include "main/Application.h" +#include "main/CommandHandler.h" #include "main/Config.h" #include "main/QueryServer.h" #include "test/TestUtils.h" @@ -29,23 +29,60 @@ using namespace stellar; +namespace +{ + +std::string +buildRequestBody(std::optional ledgerSeq, + std::vector const& keys) +{ + std::string body; + if (ledgerSeq) + { + body = "ledgerSeq=" + std::to_string(*ledgerSeq); + } + for (auto const& key : keys) + { + body += (body.empty() ? "" : "&") + std::string("key=") + + toOpaqueBase64(key); + } + return body; +} + +// Performs a query and parses the JSON response. Returns true if the query +// succeeded, populating root with the parsed JSON. On failure, retStr contains +// the error message. +bool +queryAndParse(QueryServer& qServer, std::optional ledgerSeq, + std::vector const& keys, Json::Value& root, + std::string& retStr) +{ + auto reqBody = buildRequestBody(ledgerSeq, keys); + std::string empty; + retStr.clear(); + if (!qServer.getLedgerEntry(empty, reqBody, retStr)) + { + return false; + } + + Json::Reader reader; + REQUIRE(reader.parse(retStr, root)); + return true; +} + +} // namespace + TEST_CASE("getledgerentry", "[queryserver]") { VirtualClock clock; auto cfg = getTestConfig(); cfg.QUERY_SNAPSHOT_LEDGERS = 5; + cfg.QUERY_SERVER_FOR_TESTING = true; auto app = createTestApplication( clock, cfg); auto& lm = app->getLedgerManager(); - - // Query Server is disabled by default in cfg. Instead of enabling it, we're - // going to manage a version here manually so we can directly call functions - // and avoid sending network requests. - auto qServer = std::make_unique("127.0.0.1", 0, - 1, // maxClient - 2, // threadPoolSize - app->getAppConnector(), true); + auto& qServer = app->getCommandHandler().getQueryServer(); std::unordered_map liveEntryMap; @@ -107,24 +144,6 @@ TEST_CASE("getledgerentry", "[queryserver]") closeLedger(*app); } - // Build HTTP request string body - auto buildRequestBody = - [](std::optional ledgerSeq, - std::vector const& keys) -> std::string { - std::string body; - if (ledgerSeq) - { - body = "ledgerSeq=" + std::to_string(*ledgerSeq); - } - - for (auto const& key : keys) - { - body += (body.empty() ? "" : "&") + std::string("key=") + - toOpaqueBase64(key); - } - return body; - }; - // Check response for entries that exist from returned JSON string auto checkEntry = [](auto const& entries, LedgerEntry const& le, std::optional expectedTTL, @@ -245,16 +264,12 @@ TEST_CASE("getledgerentry", "[queryserver]") keysToSearch.push_back(key); } - auto reqBody = buildRequestBody(std::nullopt, keysToSearch); - std::string retStr; - std::string empty; - REQUIRE(qServer->getLedgerEntry(empty, reqBody, retStr)); - auto ledgerSeq = lm.getLastClosedLedgerNum(); Json::Value root; - Json::Reader reader; - REQUIRE(reader.parse(retStr, root)); + std::string retStr; + REQUIRE( + queryAndParse(qServer, std::nullopt, keysToSearch, root, retStr)); REQUIRE(root.isMember("entries")); REQUIRE(root.isMember("ledgerSeq")); REQUIRE(root["ledgerSeq"].asUInt() == ledgerSeq); @@ -378,14 +393,10 @@ TEST_CASE("getledgerentry", "[queryserver]") SECTION("current values") { - auto reqBody = buildRequestBody(newLedger, keysToSearch); - std::string retStr; - std::string empty; - REQUIRE(qServer->getLedgerEntry(empty, reqBody, retStr)); - Json::Value root; - Json::Reader reader; - REQUIRE(reader.parse(retStr, root)); + std::string retStr; + REQUIRE( + queryAndParse(qServer, newLedger, keysToSearch, root, retStr)); REQUIRE(root.isMember("entries")); REQUIRE(root.isMember("ledgerSeq")); REQUIRE(root["ledgerSeq"].asUInt() == newLedger); @@ -413,14 +424,10 @@ TEST_CASE("getledgerentry", "[queryserver]") SECTION("snapshot values") { - auto reqBody = buildRequestBody(oldLedger, keysToSearch); - std::string retStr; - std::string empty; - REQUIRE(qServer->getLedgerEntry(empty, reqBody, retStr)); - Json::Value root; - Json::Reader reader; - REQUIRE(reader.parse(retStr, root)); + std::string retStr; + REQUIRE( + queryAndParse(qServer, oldLedger, keysToSearch, root, retStr)); REQUIRE(root.isMember("entries")); REQUIRE(root.isMember("ledgerSeq")); REQUIRE(root["ledgerSeq"].asUInt() == oldLedger); @@ -451,10 +458,9 @@ TEST_CASE("getledgerentry", "[queryserver]") SECTION("empty keys") { + Json::Value root; std::string retStr; - std::string empty; - auto body = "ledgerSeq=10"; // No keys provided - REQUIRE(!qServer->getLedgerEntry(empty, body, retStr)); + REQUIRE(!queryAndParse(qServer, 10, {}, root, retStr)); REQUIRE(retStr == "Must specify key in POST body: key=\n"); @@ -465,10 +471,9 @@ TEST_CASE("getledgerentry", "[queryserver]") LedgerKey ttlKey = LedgerEntryKey( LedgerTestUtils::generateValidLedgerEntryOfType(TTL)); - auto body = buildRequestBody(std::nullopt, {ttlKey}); + Json::Value root; std::string retStr; - std::string empty; - REQUIRE(!qServer->getLedgerEntry(empty, body, retStr)); + REQUIRE(!queryAndParse(qServer, std::nullopt, {ttlKey}, root, retStr)); REQUIRE(retStr == "TTL keys are not allowed\n"); } @@ -476,20 +481,22 @@ TEST_CASE("getledgerentry", "[queryserver]") { auto liveEntry = liveEntryMap.begin()->first; auto currentLedger = lm.getLastClosedLedgerNum(); - auto body = buildRequestBody(currentLedger + 1000, {liveEntry}); + + Json::Value root; std::string retStr; - std::string empty; - REQUIRE(!qServer->getLedgerEntry(empty, body, retStr)); + REQUIRE(!queryAndParse(qServer, currentLedger + 1000, {liveEntry}, root, + retStr)); REQUIRE(retStr == "Ledger not found\n"); } SECTION("duplicate keys") { auto liveEntry = liveEntryMap.begin()->first; - auto body = buildRequestBody(std::nullopt, {liveEntry, liveEntry}); + + Json::Value root; std::string retStr; - std::string empty; - REQUIRE(!qServer->getLedgerEntry(empty, body, retStr)); + REQUIRE(!queryAndParse(qServer, std::nullopt, {liveEntry, liveEntry}, + root, retStr)); REQUIRE(retStr == "Duplicate keys\n"); } @@ -515,14 +522,10 @@ TEST_CASE("getledgerentry", "[queryserver]") auto testKeyOrder = [&](std::vector const& keyOrder, bool liveFirst) { - auto reqBody = buildRequestBody(std::nullopt, keyOrder); - std::string retStr; - std::string empty; - REQUIRE(qServer->getLedgerEntry(empty, reqBody, retStr)); - Json::Value root; - Json::Reader reader; - REQUIRE(reader.parse(retStr, root)); + std::string retStr; + REQUIRE( + queryAndParse(qServer, std::nullopt, keyOrder, root, retStr)); REQUIRE(root.isMember("entries")); auto entries = root["entries"]; @@ -557,3 +560,153 @@ TEST_CASE("getledgerentry", "[queryserver]") testKeyOrder({newKey, liveKey}, false); } } + +TEST_CASE("query server with zero snapshot ledgers", "[queryserver]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.QUERY_SNAPSHOT_LEDGERS = 0; + cfg.QUERY_SERVER_FOR_TESTING = true; + + auto app = createTestApplication( + clock, cfg); + auto& lm = app->getLedgerManager(); + auto& qServer = app->getCommandHandler().getQueryServer(); + + // Insert some entries and close a few ledgers + auto entries = LedgerTestUtils::generateValidUniqueLedgerEntriesWithTypes( + {ACCOUNT}, 5); + std::vector keys; + for (auto const& le : entries) + { + keys.push_back(LedgerEntryKey(le)); + } + + lm.setNextLedgerEntryBatchForBucketTesting(entries, {}, {}); + closeLedger(*app); + + auto currentLedger = lm.getLastClosedLedgerNum(); + + SECTION("current ledger query works") + { + // Query without specifying ledgerSeq — should return LCL data + Json::Value root; + std::string retStr; + REQUIRE(queryAndParse(qServer, std::nullopt, keys, root, retStr)); + REQUIRE(root["ledgerSeq"].asUInt() == currentLedger); + REQUIRE(root["entries"].size() == keys.size()); + } + + SECTION("explicit current ledger query works") + { + // Query with explicit current ledgerSeq + Json::Value root; + std::string retStr; + REQUIRE(queryAndParse(qServer, currentLedger, keys, root, retStr)); + REQUIRE(root["ledgerSeq"].asUInt() == currentLedger); + REQUIRE(root["entries"].size() == keys.size()); + } + + SECTION("historical query fails") + { + // Close another ledger so the previous one becomes historical + lm.setNextLedgerEntryBatchForBucketTesting({}, entries, {}); + closeLedger(*app); + + Json::Value root; + std::string retStr; + REQUIRE(!queryAndParse(qServer, currentLedger, keys, root, retStr)); + REQUIRE(retStr == "Ledger not found\n"); + } +} + +TEST_CASE("query server historical snapshots", "[queryserver]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.QUERY_SNAPSHOT_LEDGERS = 5; + cfg.QUERY_SERVER_FOR_TESTING = true; + + auto app = createTestApplication( + clock, cfg); + auto& lm = app->getLedgerManager(); + auto& qServer = app->getCommandHandler().getQueryServer(); + + // Create a single account entry that we modify each ledger + auto entry = LedgerTestUtils::generateValidLedgerEntryOfType(ACCOUNT); + auto key = LedgerEntryKey(entry); + + lm.setNextLedgerEntryBatchForBucketTesting({entry}, {}, {}); + closeLedger(*app); + uint32_t firstLedger = lm.getLastClosedLedgerNum(); + + // Close several more ledgers, modifying the entry each time + uint32_t const additionalLedgers = 8; + for (uint32_t i = 0; i < additionalLedgers; ++i) + { + entry.lastModifiedLedgerSeq = lm.getLastClosedLedgerNum(); + lm.setNextLedgerEntryBatchForBucketTesting({}, {entry}, {}); + closeLedger(*app); + } + + uint32_t currentLedger = lm.getLastClosedLedgerNum(); + + SECTION("current ledger returns data") + { + Json::Value root; + std::string retStr; + REQUIRE(queryAndParse(qServer, currentLedger, {key}, root, retStr)); + REQUIRE(root["ledgerSeq"].asUInt() == currentLedger); + REQUIRE(root["entries"].size() == 1); + REQUIRE(root["entries"][0]["state"].asString() == "live"); + } + + SECTION("recent historical ledgers return data") + { + // Query each ledger in the historical window + for (uint32_t seq = currentLedger - 1; + seq >= currentLedger - cfg.QUERY_SNAPSHOT_LEDGERS + 1; --seq) + { + Json::Value root; + std::string retStr; + REQUIRE(queryAndParse(qServer, seq, {key}, root, retStr)); + REQUIRE(root["ledgerSeq"].asUInt() == seq); + REQUIRE(root["entries"].size() == 1); + } + } + + SECTION("ledger outside window returns not found") + { + // Query a ledger that has been evicted from the window + Json::Value root; + std::string retStr; + REQUIRE(!queryAndParse(qServer, firstLedger, {key}, root, retStr)); + REQUIRE(retStr == "Ledger not found\n"); + } + + SECTION("future ledger returns not found") + { + Json::Value root; + std::string retStr; + REQUIRE( + !queryAndParse(qServer, currentLedger + 100, {key}, root, retStr)); + REQUIRE(retStr == "Ledger not found\n"); + } + + SECTION("default query returns latest after advancing") + { + // Close one more ledger + entry.lastModifiedLedgerSeq = lm.getLastClosedLedgerNum(); + lm.setNextLedgerEntryBatchForBucketTesting({}, {entry}, {}); + closeLedger(*app); + + uint32_t newLedger = lm.getLastClosedLedgerNum(); + REQUIRE(newLedger == currentLedger + 1); + + // Query without ledgerSeq should return the new latest + Json::Value root; + std::string retStr; + REQUIRE(queryAndParse(qServer, std::nullopt, {key}, root, retStr)); + REQUIRE(root["ledgerSeq"].asUInt() == newLedger); + } +} diff --git a/src/overlay/FlowControl.cpp b/src/overlay/FlowControl.cpp index 9623cd3b86..33e529c7bd 100644 --- a/src/overlay/FlowControl.cpp +++ b/src/overlay/FlowControl.cpp @@ -278,8 +278,15 @@ FlowControl::beginMessageProcessing(StellarMessage const& msg) releaseAssert(!threadIsMain() || !mUseBackgroundThread); MutexLocker guard(mFlowControlMutex); - return mFlowControlCapacity.lockLocalCapacity(msg) && - mFlowControlBytesCapacity.lockLocalCapacity(msg); + if (!mFlowControlBytesCapacity.canLockLocalCapacity(msg) || + !mFlowControlCapacity.canLockLocalCapacity(msg)) + { + return false; + } + + mFlowControlCapacity.lockLocalCapacity(msg); + mFlowControlBytesCapacity.lockLocalCapacity(msg); + return true; } SendMoreCapacity diff --git a/src/overlay/FlowControl.h b/src/overlay/FlowControl.h index b3e98f1f60..d8149b930d 100644 --- a/src/overlay/FlowControl.h +++ b/src/overlay/FlowControl.h @@ -67,7 +67,7 @@ class FlowControl size_t mTxQueueByteCount GUARDED_BY(mFlowControlMutex){0}; // Mutex to synchronize flow control state - Mutex mutable mFlowControlMutex; + mutable ANNOTATED_MUTEX(mFlowControlMutex); // Is this peer currently throttled due to lack of capacity std::optional mLastThrottle GUARDED_BY(mFlowControlMutex); diff --git a/src/overlay/FlowControlCapacity.cpp b/src/overlay/FlowControlCapacity.cpp index 4521cca45b..486511f022 100644 --- a/src/overlay/FlowControlCapacity.cpp +++ b/src/overlay/FlowControlCapacity.cpp @@ -139,10 +139,34 @@ FlowControlCapacity::lockOutboundCapacity(StellarMessage const& msg) } bool +FlowControlCapacity::canLockLocalCapacity(StellarMessage const& msg) const +{ + ZoneScoped; + auto msgResources = getMsgResourceCount(msg); + if (OverlayManager::isFloodMessage(msg)) + { + if (mCapacity.mFloodCapacity < msgResources) + { + return false; + } + } + if (mCapacity.mTotalCapacity) + { + if (*mCapacity.mTotalCapacity < msgResources) + { + return false; + } + } + return true; +} + +void FlowControlCapacity::lockLocalCapacity(StellarMessage const& msg) { ZoneScoped; checkCapacityInvariants(); + releaseAssert(canLockLocalCapacity(msg)); + auto msgResources = getMsgResourceCount(msg); if (mCapacity.mTotalCapacity) { @@ -152,12 +176,6 @@ FlowControlCapacity::lockLocalCapacity(StellarMessage const& msg) if (OverlayManager::isFloodMessage(msg)) { - // No capacity to process flood message - if (mCapacity.mFloodCapacity < msgResources) - { - return false; - } - mCapacity.mFloodCapacity -= msgResources; if (mCapacity.mFloodCapacity == 0) { @@ -165,8 +183,6 @@ FlowControlCapacity::lockLocalCapacity(StellarMessage const& msg) mConfig.toShortString(mNodeID)); } } - - return true; } uint64_t diff --git a/src/overlay/FlowControlCapacity.h b/src/overlay/FlowControlCapacity.h index 182e4c2e0f..eba7f27126 100644 --- a/src/overlay/FlowControlCapacity.h +++ b/src/overlay/FlowControlCapacity.h @@ -38,7 +38,8 @@ class FlowControlCapacity virtual void releaseOutboundCapacity(StellarMessage const& msg) = 0; void lockOutboundCapacity(StellarMessage const& msg); - bool lockLocalCapacity(StellarMessage const& msg); + void lockLocalCapacity(StellarMessage const& msg); + bool canLockLocalCapacity(StellarMessage const& msg) const; // Release capacity used by this message. Return how flood capacity was // freed uint64_t releaseLocalCapacity(StellarMessage const& msg); diff --git a/src/overlay/Hmac.cpp b/src/overlay/Hmac.cpp index f455318d8e..ee6ed72b64 100644 --- a/src/overlay/Hmac.cpp +++ b/src/overlay/Hmac.cpp @@ -83,6 +83,7 @@ Hmac::setAuthenticatedMessageBody(AuthenticatedMessage& aMsg, void Hmac::damageRecvMacKey() { + LOCK_GUARD(mMutex, guard); auto bytes = randomBytes(mRecvMacKey.key.size()); std::copy(bytes.begin(), bytes.end(), mRecvMacKey.key.begin()); } diff --git a/src/overlay/Hmac.h b/src/overlay/Hmac.h index c4850a75c7..ecd8ef632a 100644 --- a/src/overlay/Hmac.h +++ b/src/overlay/Hmac.h @@ -11,17 +11,23 @@ using namespace stellar; +namespace stellar +{ +class Peer; +} + class Hmac { -#ifndef USE_TRACY - Mutex mMutex; -#else - TracyLockable(std::mutex, mMutex); +#ifdef THREAD_SAFETY + // Make the peer class a friend for thread safety analysis + friend class stellar::Peer; #endif - HmacSha256Key mSendMacKey; - HmacSha256Key mRecvMacKey; - uint64_t mSendMacSeq{0}; - uint64_t mRecvMacSeq{0}; + + ANNOTATED_MUTEX(mMutex); + HmacSha256Key mSendMacKey GUARDED_BY(mMutex); + HmacSha256Key mRecvMacKey GUARDED_BY(mMutex); + uint64_t mSendMacSeq GUARDED_BY(mMutex){0}; + uint64_t mRecvMacSeq GUARDED_BY(mMutex){0}; public: bool setSendMackey(HmacSha256Key const& key); diff --git a/src/overlay/ItemFetcher.cpp b/src/overlay/ItemFetcher.cpp index c57ef0796f..47f37ee7e1 100644 --- a/src/overlay/ItemFetcher.cpp +++ b/src/overlay/ItemFetcher.cpp @@ -95,24 +95,34 @@ ItemFetcher::fetchingFor(Hash const& itemHash) const } void -ItemFetcher::stopFetchingBelow(uint64 slotIndex, uint64 slotToKeep) +ItemFetcher::stopFetchingOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep) { + if (mTrackers.empty()) + { + // Nothing to do. No need to post a cleanup task to the main thread. + return; + } // only perform this cleanup from the top of the stack as it causes // all sorts of evil side effects mApp.postOnMainThread( - [this, slotIndex, slotToKeep]() { - stopFetchingBelowInternal(slotIndex, slotToKeep); + [this, minSlot, maxSlot, slotToKeep]() { + stopFetchingOutsideRangeInternal(minSlot, maxSlot, slotToKeep); }, - "ItemFetcher: stopFetchingBelow"); + "ItemFetcher: stopFetchingOutsideRange"); } void -ItemFetcher::stopFetchingBelowInternal(uint64 slotIndex, uint64 slotToKeep) +ItemFetcher::stopFetchingOutsideRangeInternal(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep) { ZoneScoped; for (auto iter = mTrackers.begin(); iter != mTrackers.end();) { - if (!iter->second->clearEnvelopesBelow(slotIndex, slotToKeep)) + if (!iter->second->clearEnvelopesOutsideRange(minSlot, maxSlot, + slotToKeep)) { iter = mTrackers.erase(iter); } diff --git a/src/overlay/ItemFetcher.h b/src/overlay/ItemFetcher.h index 049c91f83d..7306522c5d 100644 --- a/src/overlay/ItemFetcher.h +++ b/src/overlay/ItemFetcher.h @@ -9,6 +9,7 @@ #include "util/Timer.h" #include #include +#include namespace medida { @@ -69,11 +70,14 @@ class ItemFetcher : private NonMovableOrCopyable std::vector fetchingFor(Hash const& itemHash) const; /** - * Called periodically to remove old envelopes from list (with ledger id - * below some @p slotIndex). Can also remove @see Tracker instances when - * non needed anymore. + * Called periodically to remove envelopes from list that fall outside + * the range [minSlot, maxSlot]. Either bound may be nullopt to skip + * that direction. Can also remove @see Tracker instances when not + * needed anymore. */ - void stopFetchingBelow(uint64 slotIndex, uint64 slotToKeep); + void stopFetchingOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep); /** * Called when given @p peer informs that it does not have data identified @@ -93,7 +97,9 @@ class ItemFetcher : private NonMovableOrCopyable #endif protected: - void stopFetchingBelowInternal(uint64 slotIndex, uint64 slotToKeep); + void stopFetchingOutsideRangeInternal(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep); Application& mApp; std::map> mTrackers; diff --git a/src/overlay/OverlayManager.h b/src/overlay/OverlayManager.h index bd2f453799..551c2133d1 100644 --- a/src/overlay/OverlayManager.h +++ b/src/overlay/OverlayManager.h @@ -5,6 +5,7 @@ #pragma once #include "crypto/BLAKE2.h" +#include "ledger/LedgerStateSnapshot.h" #include "overlay/Peer.h" /** @@ -214,6 +215,6 @@ class OverlayManager // Get a snapshot of ledger state for use by the overlay thread only. Caller // is responsible for updating the snapshot as needed. - virtual SearchableSnapshotConstPtr& getOverlayThreadSnapshot() = 0; + virtual LedgerStateSnapshot& getOverlayThreadSnapshot() = 0; }; } diff --git a/src/overlay/OverlayManagerImpl.cpp b/src/overlay/OverlayManagerImpl.cpp index 3cf558029e..8e8279c19d 100644 --- a/src/overlay/OverlayManagerImpl.cpp +++ b/src/overlay/OverlayManagerImpl.cpp @@ -9,7 +9,6 @@ #include "crypto/ShortHash.h" #include "database/Database.h" #include "herder/Herder.h" -#include "ledger/LedgerManager.h" #include "lib/util/finally.h" #include "lib/util/stdrandom.h" #include "main/Application.h" @@ -23,6 +22,7 @@ #include "overlay/TCPPeer.h" #include "overlay/TxDemandsManager.h" #include "util/GlobalChecks.h" +#include "util/JitterInjection.h" #include "util/Logging.h" #include "util/Math.h" #include "util/MetricsRegistry.h" @@ -1432,18 +1432,18 @@ OverlayManagerImpl::recordMessageMetric(StellarMessage const& stellarMsg, } } -SearchableSnapshotConstPtr& +LedgerStateSnapshot& OverlayManagerImpl::getOverlayThreadSnapshot() { releaseAssert(mApp.threadIsType(Application::ThreadType::OVERLAY)); + JITTER_INJECT_DELAY(); if (!mOverlayThreadSnapshot) { // Create a new snapshot - mOverlayThreadSnapshot = mApp.getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + mOverlayThreadSnapshot = + mApp.getLedgerManager().copyLedgerStateSnapshot(); } - return mOverlayThreadSnapshot; + return *mOverlayThreadSnapshot; } } diff --git a/src/overlay/OverlayManagerImpl.h b/src/overlay/OverlayManagerImpl.h index 3a62ddd45e..c4b41c0ab8 100644 --- a/src/overlay/OverlayManagerImpl.h +++ b/src/overlay/OverlayManagerImpl.h @@ -9,6 +9,7 @@ #include "PeerDoor.h" #include "PeerManager.h" #include "herder/TxSetFrame.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "overlay/Floodgate.h" #include "overlay/OverlayManager.h" @@ -167,7 +168,7 @@ class OverlayManagerImpl : public OverlayManager void recordMessageMetric(StellarMessage const& stellarMsg, Peer::pointer peer) override; - SearchableSnapshotConstPtr& getOverlayThreadSnapshot() override; + LedgerStateSnapshot& getOverlayThreadSnapshot() override; private: struct ResolvedPeers @@ -185,7 +186,7 @@ class OverlayManagerImpl : public OverlayManager mScheduledMessages; // Snapshot of ledger state for use ONLY by the overlay thread - SearchableSnapshotConstPtr mOverlayThreadSnapshot; + std::optional mOverlayThreadSnapshot; void triggerPeerResolution(); std::pair, bool> diff --git a/src/overlay/Peer.cpp b/src/overlay/Peer.cpp index e6d16ee3c3..4ad1a937f1 100644 --- a/src/overlay/Peer.cpp +++ b/src/overlay/Peer.cpp @@ -56,6 +56,10 @@ using namespace soci; namespace { +// Maximum number of GET_SCP_STATE requests per window per peer to respond to. A +// window defaults to roughly 1 minute. +constexpr uint32_t GET_SCP_STATE_MAX_RATE = 10; + // Check the signature(s) in `tx`, adding the result to the signature cache in // the process. This function requires that background signature verification // is enabled and the current thread is the overlay thread. @@ -67,20 +71,18 @@ populateSignatureCache(AppConnector& app, TransactionFrameBaseConstPtr tx) app.threadIsType(Application::ThreadType::OVERLAY)); auto& snapshot = app.getOverlayThreadSnapshot(); - app.maybeCopySearchableBucketListSnapshot(snapshot); - LedgerSnapshot ledgerSnapshot(snapshot); + app.maybeUpdateLedgerStateSnapshot(snapshot); + LedgerReadView lrv(snapshot); - // Use ledgerSnapshot to check all transactions in `tx`. We use a lambda to + // Use lrv to check all transactions in `tx`. We use a lambda to // simplify checking of both outer and inner transactions in the case of fee // bumps. - auto const checkTxSignatures = [&ledgerSnapshot]( - TransactionFrameBaseConstPtr tx) { + auto const checkTxSignatures = [&lrv](TransactionFrameBaseConstPtr tx) { auto const& hash = tx->getContentsHash(); auto const& signatures = txbridge::getSignatures(tx->getEnvelope()); SignatureChecker signatureChecker( - ledgerSnapshot.getLedgerHeader().current().ledgerVersion, hash, - signatures); + lrv.getLedgerHeader().current().ledgerVersion, hash, signatures); // Do not report signature cache metrics during background validation. // This allows us to more accurately measure the impact of background @@ -90,8 +92,7 @@ populateSignatureCache(AppConnector& app, TransactionFrameBaseConstPtr tx) // NOTE: Use getFeeSourceID so that this works for both TransactionFrame // and FeeBumpTransactionFrame - auto const sourceAccount = - ledgerSnapshot.getAccount(tx->getFeeSourceID()); + auto const sourceAccount = lrv.getAccount(tx->getFeeSourceID()); if (!sourceAccount) { @@ -112,10 +113,10 @@ populateSignatureCache(AppConnector& app, TransactionFrameBaseConstPtr tx) // Check all transaction signatures tx->checkAllTransactionSignatures( signatureChecker, sourceAccount, - ledgerSnapshot.getLedgerHeader().current().ledgerVersion); + lrv.getLedgerHeader().current().ledgerVersion); // Check all operation signatures. - tx->checkOperationSignatures(signatureChecker, ledgerSnapshot, nullptr); + tx->checkOperationSignatures(signatureChecker, lrv, nullptr); }; checkTxSignatures(tx); @@ -166,7 +167,7 @@ CapacityTrackedMessage::CapacityTrackedMessage(std::weak_ptr peer, { throw std::runtime_error("Invalid peer"); } - self->beginMessageProcessing(mMsg); + mCapacityLocked = self->beginMessageProcessing(mMsg); if (mMsg.type() == SCP_MESSAGE || mMsg.type() == TRANSACTION) { mMaybeHash = xdrBlake2(msg); @@ -222,6 +223,10 @@ CapacityTrackedMessage::maybeGetHash() const CapacityTrackedMessage::~CapacityTrackedMessage() { + if (!mCapacityLocked) + { + return; + } auto self = mWeakPeer.lock(); try { @@ -269,7 +274,7 @@ Peer::sendHello() sendMessage(msgPtr); } -void +bool Peer::beginMessageProcessing(StellarMessage const& msg) { releaseAssert(mFlowControl); @@ -279,6 +284,7 @@ Peer::beginMessageProcessing(StellarMessage const& msg) drop("unexpected flood message, peer at capacity", Peer::DropDirection::WE_DROPPED_REMOTE); } + return success; } void @@ -1003,7 +1009,8 @@ Peer::getLifeTime() const bool Peer::shouldAbort(RecursiveLockGuard const& stateGuard) const { - return mState == CLOSING || mAppConnector.overlayShuttingDown(); + return mState == CLOSING || mAppConnector.overlayShuttingDown() || + mDropStarted; } bool @@ -1410,15 +1417,15 @@ Peer::recvDontHave(StellarMessage const& msg) } bool -Peer::process(QueryInfo& queryInfo) +Peer::process(QueryInfo& queryInfo, std::optional maxQueriesPerWindow) { auto const& cfg = mAppConnector.getConfig(); std::chrono::seconds const QUERY_WINDOW = std::chrono::duration_cast( mAppConnector.getLedgerManager().getExpectedLedgerCloseTime() * cfg.MAX_SLOTS_TO_REMEMBER); - uint32_t const QUERIES_PER_WINDOW = - QUERY_WINDOW.count() * QUERY_RESPONSE_MULTIPLIER; + uint32_t const QUERIES_PER_WINDOW = maxQueriesPerWindow.value_or( + QUERY_WINDOW.count() * QUERY_RESPONSE_MULTIPLIER); if (mAppConnector.now() - queryInfo.mLastTimeStamp >= QUERY_WINDOW) { queryInfo.mLastTimeStamp = mAppConnector.now(); @@ -1673,6 +1680,13 @@ Peer::recvGetSCPState(StellarMessage const& msg) { ZoneScoped; releaseAssert(threadIsMain()); + if (!process(mSCPStateQueryInfo, GET_SCP_STATE_MAX_RATE)) + { + CLOG_DEBUG(Overlay, "Dropping GET_SCP_STATE request from {}", + KeyUtils::toShortString(mPeerID)); + return; + } + mSCPStateQueryInfo.mNumQueries++; uint32 seq = msg.getSCPLedgerSeq(); mAppConnector.getHerder().sendSCPStateToPeer(seq, shared_from_this()); } diff --git a/src/overlay/Peer.h b/src/overlay/Peer.h index fcba076869..3435338fe3 100644 --- a/src/overlay/Peer.h +++ b/src/overlay/Peer.h @@ -190,17 +190,20 @@ class Peer : public std::enable_shared_from_this, OverlayMetrics& mOverlayMetrics; // No need for GUARDED_BY, PeerMetrics is thread-safe PeerMetrics mPeerMetrics; + + // Drop can be initiated from any thread only once, keep track of that with + // an atomic + std::atomic mDropStarted{false}; + #ifdef BUILD_TESTS std::string mDropReason GUARDED_BY(mStateMutex); #endif // Mutex to protect PeerState, which can be accessed and modified from - // multiple threads -#ifndef USE_TRACY - RecursiveMutex mutable mStateMutex; -#else - mutable TracyLockable(std::recursive_mutex, mStateMutex); -#endif + // multiple threads. + // LOCK ORDERING: mStateMutex must be acquired before Hmac::mMutex. + mutable ANNOTATED_RECURSIVE_MUTEX(mStateMutex, + ACQUIRED_BEFORE(Hmac::mMutex)); Hmac mHmac; // Does local node have capacity to read from this peer @@ -271,6 +274,7 @@ class Peer : public std::enable_shared_from_this, std::shared_ptr mTxAdverts; QueryInfo mQSetQueryInfo; QueryInfo mTxSetQueryInfo; + QueryInfo mSCPStateQueryInfo; bool mPeersReceived{false}; static Hash pingIDfromTimePoint(VirtualClock::time_point const& tp); @@ -314,7 +318,17 @@ class Peer : public std::enable_shared_from_this, void sendDontHave(MessageType type, uint256 const& itemID); void sendPeers(); void sendError(ErrorCode error, std::string const& message); - bool process(QueryInfo& queryInfo); + + // Returns `true` if a query is within the configured limits and should be + // processed, `false` if it exceeds limits and should be dropped. This + // function may reset the per-window state in `queryInfo` when a new + // window begins, but it does not increment any query counters; callers + // are responsible for updating `queryInfo` (for example, incrementing the + // number of processed queries) after a query is accepted. Callers may + // optionally set `maxQueriesPerWindow` to override the default per-window + // query limit. + bool process(QueryInfo& queryInfo, + std::optional maxQueriesPerWindow = std::nullopt); void recvMessage(std::shared_ptr msgTracker); @@ -343,7 +357,7 @@ class Peer : public std::enable_shared_from_this, void sendAuthenticatedMessage( std::shared_ptr msg, std::optional timePlaced = std::nullopt); - void beginMessageProcessing(StellarMessage const& msg); + bool beginMessageProcessing(StellarMessage const& msg); void endMessageProcessing(StellarMessage const& msg); public: @@ -487,6 +501,13 @@ class Peer : public std::enable_shared_from_this, static void populateSignatureCacheForTesting(AppConnector& app, TransactionFrameBaseConstPtr tx); + + uint32_t + getSCPStateQueryCountForTesting() const + { + releaseAssert(threadIsMain()); + return mSCPStateQueryInfo.mNumQueries; + } #endif // Public thread-safe methods that access Peer's state @@ -530,6 +551,7 @@ class CapacityTrackedMessage : private NonMovableOrCopyable { std::weak_ptr const mWeakPeer; StellarMessage const mMsg; + bool mCapacityLocked{false}; std::optional mMaybeHash; // xdrBlake2 -> txFrame (with pre-populated hashes) std::unordered_map mTxsMap; diff --git a/src/overlay/TCPPeer.h b/src/overlay/TCPPeer.h index 14755665f9..671fe270fa 100644 --- a/src/overlay/TCPPeer.h +++ b/src/overlay/TCPPeer.h @@ -82,9 +82,6 @@ class TCPPeer : public Peer ThreadRestrictedVars mThreadVars; - // Drop can be initiated from any thread only once, keep track of that with - // an atomic - std::atomic mDropStarted{false}; std::shared_ptr mSocket; std::string const mIPAddress; diff --git a/src/overlay/Tracker.cpp b/src/overlay/Tracker.cpp index 1b7d6a3a4e..2ea8acd02b 100644 --- a/src/overlay/Tracker.cpp +++ b/src/overlay/Tracker.cpp @@ -50,14 +50,18 @@ Tracker::pop() // returns false if no one cares about this guy anymore bool -Tracker::clearEnvelopesBelow(uint64 slotIndex, uint64 slotToKeep) +Tracker::clearEnvelopesOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep) { ZoneScoped; for (auto iter = mWaitingEnvelopes.begin(); iter != mWaitingEnvelopes.end();) { - if (auto index = iter->second.statement.slotIndex; - index < slotIndex && index != slotToKeep) + auto const index = iter->second.statement.slotIndex; + bool const outsideRange = + (minSlot && index < *minSlot) || (maxSlot && index > *maxSlot); + if (outsideRange && index != slotToKeep) { iter = mWaitingEnvelopes.erase(iter); } diff --git a/src/overlay/Tracker.h b/src/overlay/Tracker.h index 8685b000e6..7af1d104f3 100644 --- a/src/overlay/Tracker.h +++ b/src/overlay/Tracker.h @@ -4,6 +4,8 @@ #pragma once +#include + /** * @class Tracker * @@ -102,13 +104,16 @@ class Tracker std::chrono::milliseconds getDuration(); /** - * Called periodically to remove old envelopes from list (with ledger id - * below some @p slotIndex). Envolope not removed if ledger id == - * slotToKeep. + * Called periodically to remove envelopes from list that fall outside + * the range [minSlot, maxSlot]. If minSlot is nullopt, no lower bound + * is applied. If maxSlot is nullopt, no upper bound is applied. + * Envelopes with ledger id == slotToKeep are never removed. * * Returns true if at least one envelope remained in list. */ - bool clearEnvelopesBelow(uint64 slotIndex, uint64 slotToKeep); + bool clearEnvelopesOutsideRange(std::optional minSlot, + std::optional maxSlot, + uint64 slotToKeep); /** * Add @p env to list of envelopes that will be resend to Herder when data diff --git a/src/overlay/test/OverlayTests.cpp b/src/overlay/test/OverlayTests.cpp index 797ab0b871..52b682fc03 100644 --- a/src/overlay/test/OverlayTests.cpp +++ b/src/overlay/test/OverlayTests.cpp @@ -1843,6 +1843,84 @@ TEST_CASE("drop peers who straggle", "[overlay][connections][straggler]") } } +TEST_CASE("GET_SCP_STATE rate limiting", "[overlay]") +{ + VirtualClock clock; + Config cfg1 = getTestConfig(0); + Config cfg2 = getTestConfig(1); + + // Bump up close time and max slots to remember to production levels. These + // must be large enough that crankSome calls between requests don't cause a + // window reset. + cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5; + cfg2.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5; + cfg1.MAX_SLOTS_TO_REMEMBER = 12; + cfg2.MAX_SLOTS_TO_REMEMBER = 12; + + // The window size + 1 second. Minimum time required to ensure the rate + // limit window resets. + std::chrono::seconds const WINDOW_CLEAR_DURATION( + cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING * + cfg1.MAX_SLOTS_TO_REMEMBER + + 1); + + // Should be no more than 10 processed GET_SCP_STATE messages per window + uint32_t constexpr MAX_PER_WINDOW = 10; + + auto app1 = createTestApplication(clock, cfg1); + auto app2 = createTestApplication(clock, cfg2); + + LoopbackPeerConnection conn(*app1, *app2); + auto sender = conn.getInitiator(); + auto receiver = conn.getAcceptor(); + testutil::crankSome(clock); + REQUIRE(conn.getInitiator()->isAuthenticatedForTesting()); + REQUIRE(conn.getAcceptor()->isAuthenticatedForTesting()); + + // Advance past QUERY_WINDOW so the first test request triggers a window + // reset + testutil::crankFor(clock, WINDOW_CLEAR_DURATION); + + // Send requests up to the limit. + for (int i = 0; i < MAX_PER_WINDOW; i++) + { + sender->sendGetScpState(0); + testutil::crankSome(clock); + } + + // Should have logged 10 queries, and the peers should remain connected + REQUIRE(receiver->getSCPStateQueryCountForTesting() == MAX_PER_WINDOW); + + // Send 5 more -- all should be dropped + for (int i = 0; i < 5; i++) + { + sender->sendGetScpState(0); + testutil::crankSome(clock); + } + // Should still be at the maximum query count, as the additional messages + // should have been dropped + REQUIRE(receiver->getSCPStateQueryCountForTesting() == MAX_PER_WINDOW); + + // Advance past the window duration so the next request triggers a window + // reset + testutil::crankFor(clock, WINDOW_CLEAR_DURATION); + + // Send a GET_SCP_STATE message to trigger the window reset + sender->sendGetScpState(0); + testutil::crankSome(clock); + + // Should just have processed the one message sent after the window clear + // duration + REQUIRE(receiver->getSCPStateQueryCountForTesting() == 1); + + // Peers should still be connected + REQUIRE(sender->isConnectedForTesting()); + REQUIRE(receiver->isConnectedForTesting()); + + testutil::shutdownWorkScheduler(*app2); + testutil::shutdownWorkScheduler(*app1); +} + TEST_CASE("reject peers with the same nodeid", "[overlay][connections]") { VirtualClock clock; @@ -3341,10 +3419,10 @@ TEST_CASE("populateSignatureCache tests", "[overlay]") REQUIRE(!isValid); // Verify it fails with bad auth, not other reasons - auto ls = LedgerSnapshot(ltx); + auto lrv = LedgerReadView(ltx); auto diagnostics = DiagnosticEventManager::createDisabled(); - auto result = paymentTx->checkValid(app->getAppConnector(), ls, 0, 0, 0, - diagnostics); + auto result = paymentTx->checkValid(app->getAppConnector(), lrv, 0, 0, + 0, diagnostics); REQUIRE(result->getResultCode() == txBAD_AUTH); // We expect a single cache miss at this point from the application of diff --git a/src/overlay/test/TCPPeerTests.cpp b/src/overlay/test/TCPPeerTests.cpp index 5431d9f759..c2c6f7124b 100644 --- a/src/overlay/test/TCPPeerTests.cpp +++ b/src/overlay/test/TCPPeerTests.cpp @@ -2,6 +2,7 @@ // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 +#include "herder/Herder.h" #include "main/Application.h" #include "main/Config.h" #include "overlay/OverlayManager.h" @@ -250,4 +251,66 @@ TEST_CASE("TCPPeer read malformed messages", "[overlay]") crankAndValidateDrop("received corrupt XDR", true); } } + +TEST_CASE("TCPPeer drop at capacity", "[overlay][flowcontrol]") +{ + Hash networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); + auto txMsgPtr = makeStellarMessage(1); + uint32 txSize = static_cast(xdr::xdr_argpack_size(*txMsgPtr)); + + Simulation::pointer s = std::make_shared( + Simulation::OVER_TCP, networkID, [txSize](int i) { + Config cfg = getTestConfig(i); + cfg.ARTIFICIALLY_SLEEP_MAIN_THREAD_FOR_TESTING = + std::chrono::milliseconds(300); + if (i == 2) + { + cfg.PEER_FLOOD_READING_CAPACITY = 1; + cfg.FLOW_CONTROL_SEND_MORE_BATCH_SIZE = 1; + } + return cfg; + }); + + auto v10SecretKey = SecretKey::fromSeed(sha256("v10")); + auto v11SecretKey = SecretKey::fromSeed(sha256("v11")); + + SCPQuorumSet n0_qset; + n0_qset.threshold = 1; + n0_qset.validators.push_back(v10SecretKey.getPublicKey()); + auto n0 = s->addNode(v10SecretKey, n0_qset); + auto n1 = s->addNode(v11SecretKey, n0_qset); + s->addPendingConnection(v10SecretKey.getPublicKey(), + v11SecretKey.getPublicKey()); + s->startAllNodes(); + n0->getHerder().setMaxClassicTxSize(txSize); + n1->getHerder().setMaxClassicTxSize(txSize); + s->stopOverlayTick(); + s->crankForAtLeast(std::chrono::seconds(5), false); + + auto p0 = n0->getOverlayManager().getConnectedPeer( + PeerBareAddress{"127.0.0.1", n1->getConfig().PEER_PORT}); + auto p1 = n1->getOverlayManager().getConnectedPeer( + PeerBareAddress{"127.0.0.1", n0->getConfig().PEER_PORT}); + + REQUIRE(p0); + REQUIRE(p1); + REQUIRE(p0->isAuthenticatedForTesting()); + REQUIRE(p1->isAuthenticatedForTesting()); + + p0->sendAuthenticatedMessageForTesting(txMsgPtr); + p0->sendAuthenticatedMessageForTesting(txMsgPtr); + + s->crankUntil( + [&]() { + return !p0->isConnectedForTesting() && !p1->isConnectedForTesting(); + }, + std::chrono::seconds(10), false); + + REQUIRE(!p0->isConnectedForTesting()); + REQUIRE(!p1->isConnectedForTesting()); + REQUIRE(p1->getDropReason() == + "unexpected flood message, peer at capacity"); + + s->stopAllNodes(); +} } diff --git a/src/overlay/test/TrackerTests.cpp b/src/overlay/test/TrackerTests.cpp index f449f4ac73..42c912ec81 100644 --- a/src/overlay/test/TrackerTests.cpp +++ b/src/overlay/test/TrackerTests.cpp @@ -107,7 +107,7 @@ TEST_CASE("Tracker works", "[overlay][Tracker]") SECTION("properly removes some old envelopes") { - REQUIRE(t.clearEnvelopesBelow(4, 4)); + REQUIRE(t.clearEnvelopesOutsideRange(4, std::nullopt, 4)); REQUIRE(t.size() == 2); REQUIRE(env4 == t.pop()); REQUIRE(env5 == t.pop()); @@ -115,17 +115,58 @@ TEST_CASE("Tracker works", "[overlay][Tracker]") SECTION("properly removes all old envelopes") { - REQUIRE(!t.clearEnvelopesBelow(6, 6)); + REQUIRE(!t.clearEnvelopesOutsideRange(6, std::nullopt, 6)); REQUIRE(t.empty()); } SECTION("keeps checkpoint envelope") { - REQUIRE(t.clearEnvelopesBelow(5, 1)); + REQUIRE(t.clearEnvelopesOutsideRange(5, std::nullopt, 1)); REQUIRE(t.size() == 2); REQUIRE(env1 == t.pop()); REQUIRE(env5 == t.pop()); } + + SECTION("properly removes some future envelopes") + { + REQUIRE(t.clearEnvelopesOutsideRange(std::nullopt, 3, 3)); + REQUIRE(t.size() == 3); + REQUIRE(env2 == t.pop()); + REQUIRE(env1 == t.pop()); + REQUIRE(env3 == t.pop()); + } + + SECTION("properly removes all future envelopes") + { + REQUIRE(!t.clearEnvelopesOutsideRange(std::nullopt, 0, 0)); + REQUIRE(t.empty()); + } + + SECTION("keeps checkpoint envelope when removing future") + { + REQUIRE(t.clearEnvelopesOutsideRange(std::nullopt, 2, 5)); + REQUIRE(t.size() == 3); + REQUIRE(env2 == t.pop()); + REQUIRE(env1 == t.pop()); + REQUIRE(env5 == t.pop()); + } + + SECTION("removes envelopes outside range on both sides") + { + REQUIRE(t.clearEnvelopesOutsideRange(2, 4, 0)); + REQUIRE(t.size() == 3); + REQUIRE(env4 == t.pop()); + REQUIRE(env2 == t.pop()); + REQUIRE(env3 == t.pop()); + } + + SECTION("removes envelopes outside range, keeping checkpoint") + { + REQUIRE(t.clearEnvelopesOutsideRange(3, 3, 1)); + REQUIRE(t.size() == 2); + REQUIRE(env1 == t.pop()); + REQUIRE(env3 == t.pop()); + } } } } diff --git a/src/process/ProcessManagerImpl.cpp b/src/process/ProcessManagerImpl.cpp index ee1e866bf2..395670090a 100644 --- a/src/process/ProcessManagerImpl.cpp +++ b/src/process/ProcessManagerImpl.cpp @@ -197,7 +197,7 @@ class ProcessExitEvent::Impl size_t ProcessManagerImpl::getNumRunningProcesses() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); size_t n = 0; for (auto const& pe : mProcesses) { @@ -212,7 +212,7 @@ ProcessManagerImpl::getNumRunningProcesses() size_t ProcessManagerImpl::getNumRunningOrShuttingDownProcesses() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); return mProcesses.size(); } @@ -262,7 +262,7 @@ ProcessManagerImpl::isShutdown() const void ProcessManagerImpl::shutdown() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); if (!mIsShutdown) { mIsShutdown = true; @@ -281,7 +281,7 @@ ProcessManagerImpl::shutdown() void ProcessManagerImpl::tryProcessShutdownAll() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); for (auto const& pe : mProcesses) { tryProcessShutdown(pe.second); @@ -292,7 +292,7 @@ bool ProcessManagerImpl::tryProcessShutdown(std::shared_ptr pe) { ZoneScoped; - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); checkInvariants(); if (!pe) @@ -364,7 +364,7 @@ asio::error_code ProcessManagerImpl::handleProcessTermination(int pid, int status) { ZoneScoped; - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); checkInvariants(); auto pair = mProcesses.find(pid); @@ -668,14 +668,14 @@ ProcessManagerImpl::ProcessManagerImpl(Application& app) , mTmpDir( std::make_unique(app.getTmpDirManager().tmpDir("process"))) { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); startWaitingForSignalChild(); } void ProcessManagerImpl::startWaitingForSignalChild() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); mSigChild.async_wait( std::bind(&ProcessManagerImpl::handleSignalChild, this)); } @@ -696,7 +696,7 @@ ProcessManagerImpl::reapChildren() { // Store tuples (pid, status) std::vector> signaledChildren; - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); for (auto const& pair : mProcesses) { int const pid = pair.first; @@ -840,7 +840,7 @@ std::weak_ptr ProcessManagerImpl::runProcess(std::string const& cmdLine, std::string outFile) { ZoneScoped; - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); auto pe = std::shared_ptr(new ProcessExitEvent(mIOContext)); @@ -867,7 +867,7 @@ ProcessManagerImpl::maybeRunPendingProcesses() { return; } - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); while (!mPending.empty() && getNumRunningOrShuttingDownProcesses() < mMaxProcesses) { @@ -905,7 +905,7 @@ ProcessManagerImpl::maybeRunPendingProcesses() void ProcessManagerImpl::checkInvariants() { - std::lock_guard guard(mProcessesMutex); + RECURSIVE_LOCK_GUARD(mProcessesMutex, guard); if (mIsShutdown) { releaseAssertOrThrow(mPending.empty()); diff --git a/src/process/ProcessManagerImpl.h b/src/process/ProcessManagerImpl.h index b29a5f0c1a..675d95cd1d 100644 --- a/src/process/ProcessManagerImpl.h +++ b/src/process/ProcessManagerImpl.h @@ -5,6 +5,7 @@ #pragma once #include "process/ProcessManager.h" +#include "util/ThreadAnnotations.h" #include "util/TmpDir.h" #include #include @@ -18,14 +19,15 @@ class ProcessManagerImpl : public ProcessManager { // Subprocesses will be removed asynchronously, hence the lock on // just the mProcesses member. - std::recursive_mutex mProcessesMutex; + ANNOTATED_RECURSIVE_MUTEX(mProcessesMutex); // Stores a map from pid to running-or-shutting-down processes. // Any ProcessExitEvent should be stored either in mProcesses // or in mPending (before it's launched). - std::map> mProcesses; + std::map> + mProcesses GUARDED_BY(mProcessesMutex); - bool mIsShutdown{false}; + std::atomic mIsShutdown{false}; size_t const mMaxProcesses; asio::io_context& mIOContext; // These are only used on POSIX, but they're harmless here. @@ -33,7 +35,8 @@ class ProcessManagerImpl : public ProcessManager std::unique_ptr mTmpDir; uint64_t mTempFileCount{0}; - std::deque> mPending; + std::deque> + mPending GUARDED_BY(mProcessesMutex); void maybeRunPendingProcesses(); void checkInvariants(); diff --git a/src/protocol-curr/xdr b/src/protocol-curr/xdr index 0a621ec781..cff714a5eb 160000 --- a/src/protocol-curr/xdr +++ b/src/protocol-curr/xdr @@ -1 +1 @@ -Subproject commit 0a621ec7811db000a60efae5b35f78dee3aa2533 +Subproject commit cff714a5ebaaaf2dac343b3546c2df73f0b7a36e diff --git a/src/protocol-next/xdr b/src/protocol-next/xdr index 520b487de5..5b64bdbd3a 160000 --- a/src/protocol-next/xdr +++ b/src/protocol-next/xdr @@ -1 +1 @@ -Subproject commit 520b487de58fc6c809dd0a959fcc765b3f00b38d +Subproject commit 5b64bdbd3a15267a093765106fb03935852bdc1d diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index 3e43626a32..de57c3e2e1 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -167,7 +167,7 @@ rev = "688bc34e6cd15c71742139e625268c7f30f55a92" [dependencies.stellar-quorum-analyzer] version = "0.1.0" git = "https://github.com/stellar/stellar-quorum-analyzer" -rev = "956ba5b8d786d755f5c575160dfc1dec6b313f40" +rev = "174d2a89c7e676000ef4ee2998959681a55befec" [features] diff --git a/src/rust/apply-load-wasm/README.md b/src/rust/apply-load-wasm/README.md new file mode 100644 index 0000000000..5cffc5285e --- /dev/null +++ b/src/rust/apply-load-wasm/README.md @@ -0,0 +1,6 @@ +This directory contains additional Wasm contracts built for apply load benchmarking. Moving the Wasms here as opposed to Soroban test Wasms in Soroban env reduces coupling between Soroban env and Core and allows for simpler and faster iteration on the Wasms without needing to update Soroban env. + +Contents: + +- `token.wasm` - a token contract generated by OpenZeppelin contract wizard. Source can be found in `scripts/apply_load/token` directory. +- Soroswap Wasm contracts: `soroswap_factory.wasm`, `soroswap_pool.wasm`, and `soroswap_router.wasm`. These are the official Soroswap Wasm contracts downloaded directly from Mainnet. https://docs.soroswap.finance/smart-contracts/01-protocol-overview/03-technical-reference/deployed-addresses documents the deployed addresses and https://github.com/soroswap/core contains the source code for reference. \ No newline at end of file diff --git a/src/rust/apply-load-wasm/soroswap_factory.wasm b/src/rust/apply-load-wasm/soroswap_factory.wasm new file mode 100644 index 0000000000..00eded64d4 Binary files /dev/null and b/src/rust/apply-load-wasm/soroswap_factory.wasm differ diff --git a/src/rust/apply-load-wasm/soroswap_pool.wasm b/src/rust/apply-load-wasm/soroswap_pool.wasm new file mode 100644 index 0000000000..132b4181f2 Binary files /dev/null and b/src/rust/apply-load-wasm/soroswap_pool.wasm differ diff --git a/src/rust/apply-load-wasm/soroswap_router.wasm b/src/rust/apply-load-wasm/soroswap_router.wasm new file mode 100644 index 0000000000..bd621c598d Binary files /dev/null and b/src/rust/apply-load-wasm/soroswap_router.wasm differ diff --git a/src/rust/apply-load-wasm/token.wasm b/src/rust/apply-load-wasm/token.wasm new file mode 100644 index 0000000000..47d7ec4f07 Binary files /dev/null and b/src/rust/apply-load-wasm/token.wasm differ diff --git a/src/rust/build.rs b/src/rust/build.rs new file mode 100644 index 0000000000..764c6e985c --- /dev/null +++ b/src/rust/build.rs @@ -0,0 +1,14 @@ +fn main() { + // On Windows (build_rust.bat), soroban submodule revisions are written to + // .soroban-revs before invoking cargo. Watching this file causes cargo to + // mark the crate dirty when a submodule changes, so it re-links against + // the updated extern rlibs (which are passed via --extern after "--" and + // not tracked by cargo's own dependency graph). + // + // On Unix (Makefile.am), the rebuild is instead driven by Make + // prerequisites and -Cmetadata in RUSTFLAGS, so the file won't exist; + // we only register it when it's actually present. + if std::path::Path::new(".soroban-revs").exists() { + println!("cargo:rerun-if-changed=.soroban-revs"); + } +} diff --git a/src/rust/soroban/p25 b/src/rust/soroban/p25 index d2ff024b72..6323c1fc03 160000 --- a/src/rust/soroban/p25 +++ b/src/rust/soroban/p25 @@ -1 +1 @@ -Subproject commit d2ff024b72f7f3f75737402ac74ca5d0093a4690 +Subproject commit 6323c1fc03ecb9f53b7c1e42fd62c1bbd3aebc2c diff --git a/src/rust/soroban/p26 b/src/rust/soroban/p26 index fced8a1241..b351f88a46 160000 --- a/src/rust/soroban/p26 +++ b/src/rust/soroban/p26 @@ -1 +1 @@ -Subproject commit fced8a1241038f7b944f5e75bffda7023d55ddbf +Subproject commit b351f88a468d3b9e1d6de53d5b0ca585f6b7dadb diff --git a/src/rust/src/bridge.rs b/src/rust/src/bridge.rs index dd0935508f..87666bba75 100644 --- a/src/rust/src/bridge.rs +++ b/src/rust/src/bridge.rs @@ -219,6 +219,10 @@ pub(crate) mod rust_bridge { fn get_test_contract_sac_transfer(protocol_version: u32) -> Result; fn get_write_bytes() -> Result; fn get_invoke_contract_wasm() -> Result; + fn get_apply_load_token_wasm() -> Result; + fn get_apply_load_soroswap_factory_wasm() -> Result; + fn get_apply_load_soroswap_pool_wasm() -> Result; + fn get_apply_load_soroswap_router_wasm() -> Result; fn get_hostile_large_val_wasm() -> Result; @@ -317,14 +321,10 @@ pub(crate) mod rust_bridge { type SorobanModuleCache; fn new_module_cache() -> Result>; - fn compile( - self: &mut SorobanModuleCache, - ledger_protocol: u32, - source: &[u8], - ) -> Result<()>; + fn compile(self: &SorobanModuleCache, ledger_protocol: u32, source: &[u8]) -> Result<()>; fn shallow_clone(self: &SorobanModuleCache) -> Result>; - fn evict_contract_code(self: &mut SorobanModuleCache, key: &[u8]) -> Result<()>; - fn clear(self: &mut SorobanModuleCache) -> Result<()>; + fn evict_contract_code(self: &SorobanModuleCache, key: &[u8]) -> Result<()>; + fn clear(self: &SorobanModuleCache) -> Result<()>; fn contains_module(self: &SorobanModuleCache, protocol: u32, key: &[u8]) -> Result; fn get_mem_bytes_consumed(self: &SorobanModuleCache, protocol: u32) -> Result; @@ -364,6 +364,13 @@ pub(crate) mod rust_bridge { resource_limit: &QuorumCheckerResource, resource_usage: &mut QuorumCheckerResource, ) -> Result; + + // The QI checker actually manages the memory limit using a global + // allocator, which winds up controlling _all_ memory allocation by + // rust code in the process. So we want to ensure that limit is unlimited + // when the process starts up -- the QI check call will limit it later, + // if and only if it's running as a QI-checking subprocess. + fn set_rust_global_memory_limit_to_unlimited(); } // And the extern "C++" block declares C++ stuff we're going to import to diff --git a/src/rust/src/dep-trees/p26-expect.txt b/src/rust/src/dep-trees/p26-expect.txt index 2dd4ae5d0f..3ab32d17d5 100644 --- a/src/rust/src/dep-trees/p26-expect.txt +++ b/src/rust/src/dep-trees/p26-expect.txt @@ -1,4 +1,4 @@ -soroban-env-host v26.0.0-rc.1 (src/rust/soroban/p26/soroban-env-host) +soroban-env-host v26.0.0 (src/rust/soroban/p26/soroban-env-host) ├── ark-bls12-381 v0.5.0 │ ├── ark-ec v0.5.0 │ │ ├── ahash v0.8.11 @@ -236,17 +236,17 @@ soroban-env-host v26.0.0-rc.1 (src/rust/soroban/p26/soroban-env-host) │ ├── digest v0.10.7 (*) │ └── keccak v0.1.4 │ └── cpufeatures v0.2.8 (*) -├── soroban-builtin-sdk-macros v26.0.0-rc.1 (proc-macro) (src/rust/soroban/p26/soroban-builtin-sdk-macros) +├── soroban-builtin-sdk-macros v26.0.0 (proc-macro) (src/rust/soroban/p26/soroban-builtin-sdk-macros) │ ├── itertools v0.13.0 │ │ └── either v1.8.1 │ ├── proc-macro2 v1.0.69 (*) │ ├── quote v1.0.33 (*) │ └── syn v2.0.39 (*) -├── soroban-env-common v26.0.0-rc.1 (src/rust/soroban/p26/soroban-env-common) +├── soroban-env-common v26.0.0 (src/rust/soroban/p26/soroban-env-common) │ ├── ethnum v1.5.0 │ ├── num-derive v0.4.1 (proc-macro) (*) │ ├── num-traits v0.2.17 (*) -│ ├── soroban-env-macros v26.0.0-rc.1 (proc-macro) (src/rust/soroban/p26/soroban-env-macros) +│ ├── soroban-env-macros v26.0.0 (proc-macro) (src/rust/soroban/p26/soroban-env-macros) │ │ ├── itertools v0.13.0 (*) │ │ ├── proc-macro2 v1.0.69 (*) │ │ ├── quote v1.0.33 (*) @@ -259,7 +259,7 @@ soroban-env-host v26.0.0-rc.1 (src/rust/soroban/p26/soroban-env-host) │ │ │ ├── itoa v1.0.6 │ │ │ ├── ryu v1.0.13 │ │ │ └── serde v1.0.192 (*) -│ │ ├── stellar-xdr v25.0.0 (https://github.com/stellar/rs-stellar-xdr?rev=c458ac6bb943c271332cb8cf274b492433cb763f#c458ac6b) +│ │ ├── stellar-xdr v26.0.0 │ │ │ ├── cfg_eval v0.1.2 (proc-macro) │ │ │ │ ├── proc-macro2 v1.0.69 (*) │ │ │ │ ├── quote v1.0.33 (*) @@ -290,7 +290,7 @@ soroban-env-host v26.0.0-rc.1 (src/rust/soroban/p26/soroban-env-host) │ │ └── wasmparser-nostd v0.100.2 │ │ └── indexmap-nostd v0.4.0 │ ├── static_assertions v1.1.0 -│ ├── stellar-xdr v25.0.0 (https://github.com/stellar/rs-stellar-xdr?rev=c458ac6bb943c271332cb8cf274b492433cb763f#c458ac6b) +│ ├── stellar-xdr v26.0.0 │ │ ├── base64 v0.22.1 │ │ ├── cfg_eval v0.1.2 (proc-macro) (*) │ │ ├── escape-bytes v0.1.1 diff --git a/src/rust/src/quorum_checker.rs b/src/rust/src/quorum_checker.rs index c7684cc0db..b5f6875373 100644 --- a/src/rust/src/quorum_checker.rs +++ b/src/rust/src/quorum_checker.rs @@ -32,6 +32,10 @@ impl From for QuorumCheckerStatus { } } +pub(crate) fn set_rust_global_memory_limit_to_unlimited() { + ResourceLimiter::new(0, usize::MAX); +} + fn update_resource_usage( resource_limiter: &ResourceLimiter, resource_usage: &mut QuorumCheckerResource, diff --git a/src/rust/src/soroban_invoke.rs b/src/rust/src/soroban_invoke.rs index adab0722fc..e9c5fc8c93 100644 --- a/src/rust/src/soroban_invoke.rs +++ b/src/rust/src/soroban_invoke.rs @@ -20,22 +20,56 @@ pub(crate) fn invoke_host_function( rent_fee_configuration: CxxRentFeeConfiguration, module_cache: &SorobanModuleCache, ) -> Result> { + use std::error::Error as StdError; + type BoxStdErr = Box; + type BoxStdErrSend = Box; + type BoxStdErrSendSync = Box; + + fn sendable_str_err(str: &str) -> BoxStdErrSend { + let tmp: BoxStdErrSendSync = Box::from(str); + tmp as BoxStdErrSend + } + let hm = get_host_module_for_protocol(config_max_protocol, ledger_info.protocol_version)?; - let res = (hm.invoke_host_function)( - enable_diagnostics, - instruction_limit, - hf_buf, - &resources_buf, - restored_rw_entry_indices, - source_account_buf, - auth_entries, - &ledger_info, - ledger_entries, - ttl_entries, - base_prng_seed, - &rent_fee_configuration, - module_cache, - ); + // Rust stacks are 2MiB by default, which is a little too small + // for comfort; to give ourselves a little more breathing room + // against unforeseen bugs we use a 100MiB stack. Unfortunately + // there's no easy way to enforce this at the C++ side when the + // initial std::async parallel-exec thread is spawned, so we + // have to spawn _another_ here. On linux this is fairly fast, + // on the order of a ten-ish microseconds. + let LARGE_STACK_SIZE: usize = 100 * 1024 * 1024; // 100 MiB + let res = std::thread::scope(|scope| { + std::thread::Builder::new() + .stack_size(LARGE_STACK_SIZE) + .spawn_scoped(scope, || { + (hm.invoke_host_function)( + enable_diagnostics, + instruction_limit, + hf_buf, + &resources_buf, + restored_rw_entry_indices, + source_account_buf, + auth_entries, + &ledger_info, + ledger_entries, + ttl_entries, + base_prng_seed, + &rent_fee_configuration, + module_cache, + ) + // Map non-sendable error to sendable for crossing thread boundary. + // This is crude but the error is going to be stringified on the + // bridge-crossing anyways. + .map_err(|e| sendable_str_err(&format!("{e}"))) + }) + .map_err(|_| sendable_str_err("spawn_scoped failed"))? + .join() + .map_err(|_| sendable_str_err("join failed"))? + }); + + // Map sendable error back to non-sendable -- Rust doesn't do dyn upcasts. + let res = res.map_err(|e: BoxStdErrSend| e as BoxStdErr); #[cfg(feature = "testutils")] crate::soroban_test_extra_protocol::maybe_invoke_host_function_again_and_compare_outputs( diff --git a/src/rust/src/soroban_module_cache.rs b/src/rust/src/soroban_module_cache.rs index ce87b83674..c6dd8e5dcf 100644 --- a/src/rust/src/soroban_module_cache.rs +++ b/src/rust/src/soroban_module_cache.rs @@ -16,17 +16,13 @@ use crate::{ rust_bridge::CxxBuf, - soroban_proto_all::{get_host_module_for_protocol, p23, p24, p25, protocol_agnostic}, + soroban_proto_all::{get_host_module_for_protocol, p23, p24, p25, p26, protocol_agnostic}, }; -#[cfg(feature = "next")] -use crate::soroban_proto_all::p26; - pub(crate) struct SorobanModuleCache { pub(crate) p23_cache: p23::soroban_proto_any::ProtocolSpecificModuleCache, pub(crate) p24_cache: p24::soroban_proto_any::ProtocolSpecificModuleCache, pub(crate) p25_cache: p25::soroban_proto_any::ProtocolSpecificModuleCache, - #[cfg(feature = "next")] pub(crate) p26_cache: p26::soroban_proto_any::ProtocolSpecificModuleCache, } @@ -36,12 +32,11 @@ impl SorobanModuleCache { p23_cache: p23::soroban_proto_any::ProtocolSpecificModuleCache::new()?, p24_cache: p24::soroban_proto_any::ProtocolSpecificModuleCache::new()?, p25_cache: p25::soroban_proto_any::ProtocolSpecificModuleCache::new()?, - #[cfg(feature = "next")] p26_cache: p26::soroban_proto_any::ProtocolSpecificModuleCache::new()?, }) } pub fn compile( - &mut self, + &self, ledger_protocol: u32, _wasm: &[u8], ) -> Result<(), Box> { @@ -49,8 +44,9 @@ impl SorobanModuleCache { 23 => self.p23_cache.compile(_wasm), 24 => self.p24_cache.compile(_wasm), 25 => self.p25_cache.compile(_wasm), - #[cfg(feature = "next")] 26 => self.p26_cache.compile(_wasm), + #[cfg(feature = "next")] + 27 => self.p26_cache.compile(_wasm), // Add other protocols here as needed. _ => Err(protocol_agnostic::make_error("unsupported protocol")), } @@ -60,12 +56,11 @@ impl SorobanModuleCache { p23_cache: self.p23_cache.shallow_clone()?, p24_cache: self.p24_cache.shallow_clone()?, p25_cache: self.p25_cache.shallow_clone()?, - #[cfg(feature = "next")] p26_cache: self.p26_cache.shallow_clone()?, })) } - pub fn evict_contract_code(&mut self, key: &[u8]) -> Result<(), Box> { + pub fn evict_contract_code(&self, key: &[u8]) -> Result<(), Box> { let _hash: [u8; 32] = key .as_ref() .try_into() @@ -73,15 +68,13 @@ impl SorobanModuleCache { self.p23_cache.evict(&_hash)?; self.p24_cache.evict(&_hash)?; self.p25_cache.evict(&_hash)?; - #[cfg(feature = "next")] self.p26_cache.evict(&_hash)?; Ok(()) } - pub fn clear(&mut self) -> Result<(), Box> { + pub fn clear(&self) -> Result<(), Box> { self.p23_cache.clear()?; self.p24_cache.clear()?; self.p25_cache.clear()?; - #[cfg(feature = "next")] self.p26_cache.clear()?; Ok(()) } @@ -99,8 +92,9 @@ impl SorobanModuleCache { 23 => self.p23_cache.contains_module(&_hash), 24 => self.p24_cache.contains_module(&_hash), 25 => self.p25_cache.contains_module(&_hash), - #[cfg(feature = "next")] 26 => self.p26_cache.contains_module(&_hash), + #[cfg(feature = "next")] + 27 => self.p26_cache.contains_module(&_hash), _ => Err(protocol_agnostic::make_error("unsupported protocol")), } } @@ -114,8 +108,9 @@ impl SorobanModuleCache { 23 => bytes = bytes.max(self.p23_cache.get_mem_bytes_consumed()?), 24 => bytes = bytes.max(self.p24_cache.get_mem_bytes_consumed()?), 25 => bytes = bytes.max(self.p25_cache.get_mem_bytes_consumed()?), - #[cfg(feature = "next")] 26 => bytes = bytes.max(self.p26_cache.get_mem_bytes_consumed()?), + #[cfg(feature = "next")] + 27 => bytes = bytes.max(self.p26_cache.get_mem_bytes_consumed()?), _ => return Err(protocol_agnostic::make_error("unsupported protocol")), } Ok(bytes) diff --git a/src/rust/src/soroban_proto_all.rs b/src/rust/src/soroban_proto_all.rs index 71a2a2ada0..efa552d856 100644 --- a/src/rust/src/soroban_proto_all.rs +++ b/src/rust/src/soroban_proto_all.rs @@ -31,10 +31,11 @@ use crate::RustBuf; // We also alias the latest soroban as soroban_curr to help reduce churn in code // that's just "always supposed to use the latest". -#[cfg(not(feature = "next"))] -pub(crate) use p25 as soroban_curr; -#[cfg(feature = "next")] + +//#[cfg(not(feature = "next"))] pub(crate) use p26 as soroban_curr; +//#[cfg(feature = "next")] +//pub(crate) use p27 as soroban_curr; // We also pin some protocol _agnostic_ definitions that are technically // implemented by a specific version of soroban, but which is protocol-stable @@ -51,7 +52,6 @@ pub(crate) mod protocol_agnostic { pub(crate) use super::p24::soroban_env_host::xdr::int128_helpers; } -#[cfg(feature = "next")] #[path = "."] pub(crate) mod p26 { pub(crate) extern crate soroban_env_host_p26; @@ -1192,7 +1192,6 @@ const HOST_MODULES: &'static [HostModule] = &[ proto_versioned_functions_for_module!(p23), proto_versioned_functions_for_module!(p24), proto_versioned_functions_for_module!(p25), - #[cfg(feature = "next")] proto_versioned_functions_for_module!(p26), ]; diff --git a/src/rust/src/soroban_proto_any.rs b/src/rust/src/soroban_proto_any.rs index 2dcf2650bb..2dda58618a 100644 --- a/src/rust/src/soroban_proto_any.rs +++ b/src/rust/src/soroban_proto_any.rs @@ -720,7 +720,7 @@ impl ProtocolSpecificModuleCache { }) } - pub(crate) fn compile(&mut self, wasm: &[u8]) -> Result<(), Box> { + pub(crate) fn compile(&self, wasm: &[u8]) -> Result<(), Box> { let compilation_context = CoreCompilationContext::new()?; let res = self.module_cache.parse_and_cache_module_simple( &compilation_context, @@ -736,12 +736,12 @@ impl ProtocolSpecificModuleCache { Ok(res?) } - pub(crate) fn evict(&mut self, key: &[u8; 32]) -> Result<(), Box> { + pub(crate) fn evict(&self, key: &[u8; 32]) -> Result<(), Box> { let _ = self.module_cache.remove_module(&key.clone().into())?; Ok(()) } - pub(crate) fn clear(&mut self) -> Result<(), Box> { + pub(crate) fn clear(&self) -> Result<(), Box> { Ok(self.module_cache.clear()?) } diff --git a/src/rust/src/soroban_test_wasm.rs b/src/rust/src/soroban_test_wasm.rs index c767aec0b0..4b76ed2cd0 100644 --- a/src/rust/src/soroban_test_wasm.rs +++ b/src/rust/src/soroban_test_wasm.rs @@ -113,6 +113,31 @@ pub(crate) fn get_custom_account_wasm() -> Result Result> { + Ok(RustBuf { + data: include_bytes!("../apply-load-wasm/token.wasm").to_vec(), + }) +} + +pub(crate) fn get_apply_load_soroswap_factory_wasm() -> Result> +{ + Ok(RustBuf { + data: include_bytes!("../apply-load-wasm/soroswap_factory.wasm").to_vec(), + }) +} + +pub(crate) fn get_apply_load_soroswap_pool_wasm() -> Result> { + Ok(RustBuf { + data: include_bytes!("../apply-load-wasm/soroswap_pool.wasm").to_vec(), + }) +} + +pub(crate) fn get_apply_load_soroswap_router_wasm() -> Result> { + Ok(RustBuf { + data: include_bytes!("../apply-load-wasm/soroswap_router.wasm").to_vec(), + }) +} + pub(crate) fn get_invoke_contract_wasm() -> Result> { Ok(RustBuf { data: soroban_test_wasms::INVOKE_CONTRACT diff --git a/src/scp/SCP.cpp b/src/scp/SCP.cpp index 44496fbb57..6bb7edce30 100644 --- a/src/scp/SCP.cpp +++ b/src/scp/SCP.cpp @@ -70,11 +70,11 @@ SCP::getLocalNodeID() } void -SCP::purgeSlots(uint64 maxSlotIndex, uint64 slotToKeep) +SCP::purgeSlotsOutsideRange(std::optional minSlotIndex, + std::optional maxSlotIndex, + uint64 slotToKeep) { - auto it = mKnownSlots.begin(); - while (it != mKnownSlots.end() && it->first < maxSlotIndex) - { + auto const maybeEraseSlot = [&](auto& it) { if (it->first == slotToKeep) { it++; @@ -83,6 +83,24 @@ SCP::purgeSlots(uint64 maxSlotIndex, uint64 slotToKeep) { it = mKnownSlots.erase(it); } + }; + + if (minSlotIndex) + { + auto it = mKnownSlots.begin(); + while (it != mKnownSlots.end() && it->first < *minSlotIndex) + { + maybeEraseSlot(it); + } + } + + if (maxSlotIndex) + { + auto it = mKnownSlots.upper_bound(*maxSlotIndex); + while (it != mKnownSlots.end()) + { + maybeEraseSlot(it); + } } } @@ -261,6 +279,17 @@ SCP::getMissingNodes(NodeID const& id, uint64 index) return ret; } +std::set +SCP::getNominationLeaders(uint64 slotIndex) +{ + auto slot = getSlot(slotIndex, false); + if (slot) + { + return slot->getNominationLeaders(); + } + return {}; +} + bool SCP::isValidator() { diff --git a/src/scp/SCP.h b/src/scp/SCP.h index 3fff1019b0..f06980937c 100644 --- a/src/scp/SCP.h +++ b/src/scp/SCP.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "lib/json/json-forwards.h" @@ -89,9 +90,15 @@ class SCP // Get a list of nodes from id's quorum set that are missing in consensus std::set getMissingNodes(NodeID const& id, uint64 index = 0); - // Purges all data relative to all the slots whose slotIndex is smaller - // than the specified `maxSlotIndex` except for slotToKeep slot. - void purgeSlots(uint64 maxSlotIndex, uint64 slotToKeep); + // returns the current nomination leaders for the given slot + std::set getNominationLeaders(uint64 slotIndex); + + // Purges all data relative to slots that fall outside the range + // [minSlotIndex, maxSlotIndex]. Either bound may be nullopt to skip + // that direction. The slotToKeep slot is never purged. + void purgeSlotsOutsideRange(std::optional minSlotIndex, + std::optional maxSlotIndex, + uint64 slotToKeep); // Returns whether the local node is a validator. bool isValidator(); diff --git a/src/simulation/ApplyLoad.cpp b/src/simulation/ApplyLoad.cpp index 3a2636b33d..f7fc35ab4d 100644 --- a/src/simulation/ApplyLoad.cpp +++ b/src/simulation/ApplyLoad.cpp @@ -2,32 +2,33 @@ #include #include -#include +#include #include +#include #include #include +#include "bucket/BucketListSnapshot.h" +#include "bucket/BucketManager.h" #include "bucket/test/BucketTestUtils.h" #include "herder/Herder.h" +#include "herder/HerderImpl.h" +#include "ledger/InMemorySorobanState.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerManagerImpl.h" +#include "ledger/LedgerStateSnapshot.h" +#include "main/Application.h" +#include "main/CommandLine.h" #include "simulation/TxGenerator.h" #include "test/TxTests.h" #include "transactions/MutableTransactionResult.h" #include "transactions/TransactionUtils.h" -#include "util/MetricsRegistry.h" -#include "util/types.h" - -#include "herder/HerderImpl.h" - -#include "medida/metrics_registry.h" - -#include "bucket/BucketListSnapshot.h" -#include "bucket/BucketManager.h" -#include "bucket/BucketSnapshotManager.h" +#include "transactions/test/SorobanTxTestUtils.h" #include "util/GlobalChecks.h" #include "util/Logging.h" +#include "util/MetricsRegistry.h" #include "util/XDRCereal.h" +#include "util/types.h" #include "xdrpp/printer.h" #include @@ -35,6 +36,59 @@ namespace stellar { namespace { +constexpr double NOISY_BINARY_SEARCH_CONFIDENCE = 0.99; + +LedgerKey +makeSACBalanceKey(SCAddress const& sacContract, SCVal const& holderAddrVal) +{ + LedgerKey key(CONTRACT_DATA); + key.contractData().contract = sacContract; + key.contractData().key = + txtest::makeVecSCVal({makeSymbolSCVal("Balance"), holderAddrVal}); + key.contractData().durability = ContractDataDurability::PERSISTENT; + return key; +} + +LedgerKey +makeTrustlineKey(PublicKey const& accountID, Asset const& asset) +{ + LedgerKey key(TRUSTLINE); + key.trustLine().accountID = accountID; + key.trustLine().asset = assetToTrustLineAsset(asset); + return key; +} + +void +logExecutionEnvironmentSnapshot(Config const& cfg) +{ + std::ostringstream versionInfo; + writeVersionInfo(versionInfo); + + CLOG_INFO(Perf, "[Apply load] Core version info:\n{}", versionInfo.str()); + + auto const& configSnapshot = cfg.getLoadedConfigToml(); + CLOG_INFO(Perf, "[Apply load] Loaded Core config snapshot:\n{}", + configSnapshot); +} + +double +interpolatePercentile(std::vector const& sortedValues, + double percentile) +{ + releaseAssert(!sortedValues.empty()); + if (sortedValues.size() == 1) + { + return sortedValues.front(); + } + + releaseAssert(percentile >= 0.0 && percentile <= 100.0); + double rank = percentile / 100.0 * (sortedValues.size() - 1); + auto lo = static_cast(std::floor(rank)); + auto hi = static_cast(std::ceil(rank)); + double weight = rank - lo; + return sortedValues[lo] * (1.0 - weight) + sortedValues[hi] * weight; +} + SorobanUpgradeConfig getUpgradeConfig(Config const& cfg, bool validate = true) { @@ -164,18 +218,266 @@ getUpgradeConfigForMaxTPS(Config const& cfg, uint64_t instructionsPerCluster, return upgradeConfig; } +} // namespace + +/* + * Binary search for a noisy monotone function. + * + * This function locates an integer x* such that: + * + * E[f(x*)] == targetA + * + * under the assumptions that: + * - f(x) is strictly monotone in x + * - evaluations of f(x) are noisy + * - the noise distribution and variance are unknown + * + * The algorithm performs adaptive binary search: + * - at each midpoint, samples until confident about the direction + * - uses t-statistics to determine if mean is above/below target + * - adjusts per-decision confidence to achieve overall confidence + * + * Parameters: + * ---------- + * f : + * Expensive benchmark or measurement function. + * Must be monotone in x. + * Returns a noisy scalar measurement. + * + * targetA : + * Target value such that x* satisfies E[f(x*)] == targetA. + * + * xMin : + * Inclusive lower bound of the search domain. + * + * xMax : + * Inclusive upper bound of the search domain. + * + * confidence : + * Desired confidence level for the final result. + * Example: 0.95 means 95% probability the true x* is in [lo, hi]. + * The algorithm computes per-decision confidence as confidence^(1/k) + * where k is the number of binary search decisions, ensuring the + * product of all decision confidences meets the overall target. + * + * xTolerance : + * Early-stop threshold on interval width. + * Search stops when (hi - lo) <= xTolerance. + * Use 0 to require a single integer solution. + * + * maxSamplesPerPoint : + * Maximum samples to take at each midpoint before giving up on confidence. + * + * prepareIteration : + * When set, call before sampling f at each midpoint. + * + * iterationResult : + * When set, call after iterations are done with a bool indicating whether + * the midpoint was confidently above (true) or below (false) the target. + * + * Returns: + * -------- + * A pair (lo, hi) representing the search interval such that with + * probability >= confidence, the true x* lies within [lo, hi]. + * The bounds are inclusive. + */ +#ifndef BUILD_TESTS +static std::pair +#else +std::pair +#endif +noisyBinarySearch(std::function const& f, double targetA, + uint32_t xMin, uint32_t xMax, double confidence, + uint32_t xTolerance, size_t maxSamplesPerPoint, + std::function const& prepareIteration, + std::function const& iterationResult) +{ + releaseAssert(xMin <= xMax); + size_t const minSamples = 30; + releaseAssert(maxSamplesPerPoint >= minSamples); + + // Binary search bounds + uint32_t lo = xMin; + uint32_t hi = xMax; + + // Calculate per-decision confidence needed to achieve final confidence. + // With k decisions each having probability p of being correct, + // P(all correct) = p^k >= confidence + // => p >= confidence^(1/k) + size_t rangeSize = static_cast(xMax - xMin + 1); + size_t numDecisions = static_cast(std::ceil( + std::log2(static_cast(rangeSize) / (xTolerance + 1)))); + numDecisions = std::max(numDecisions, size_t{1}); + + double perDecisionConfidence = + std::pow(confidence, 1.0 / static_cast(numDecisions)); + + // Minimum samples before we start checking confidence + + size_t totalSamples = 0; + + while (hi - lo > xTolerance) + { + uint32_t mid = lo + (hi - lo) / 2; + + // Collect samples using Welford's algorithm + size_t count = 0; + double mean = 0.0; + double m2 = 0.0; + + double probAbove = 0.5; + bool confident = false; + if (prepareIteration) + { + prepareIteration(mid); + } + while (count < maxSamplesPerPoint) + { + // Take a sample + double y = f(mid); + count++; + totalSamples++; + double delta = y - mean; + mean += delta / count; + double delta2 = y - mean; + m2 += delta * delta2; + + if (count < minSamples) + { + continue; + } + + // Compute t-statistic: t = (mean - target) / (s / sqrt(n)) + double variance = m2 / (count - 1); + double sem = std::sqrt(variance / count); + CLOG_INFO(Perf, + "noisy binary search:x={}, y={}, n={}, mean={:.4f}, " + "variance={:.4f}, sem={:.4f}", + mid, y, count, mean, variance, sem); + // Avoid division by zero + if (sem < 1e-10) + { + // Variance is essentially zero - mean is very stable + probAbove = (mean > targetA) ? 1.0 - 1e-10 : 1e-10; + confident = true; + break; + } + + double t = (mean - targetA) / sem; + + // Convert t-statistic to probability using normal approximation + // (good enough with 30+ samples). + probAbove = 0.5 * std::erfc(-t / std::sqrt(2.0)); + // Check if we have enough confidence to make a decision + if (probAbove >= perDecisionConfidence || + probAbove <= (1.0 - perDecisionConfidence)) + { + confident = true; + break; + } + } + + if (!confident) + { + // Couldn't reach required confidence - log a warning + // but still make a decision based on best estimate + CLOG_WARNING( + Perf, + "Noisy binary search: couldn't reach {:.4f} confidence at " + "x={} after {} samples (probAbove={:.4f})", + perDecisionConfidence, mid, count, probAbove); + } + else + { + CLOG_INFO(Perf, + "Noisy binary search: at x={} took {} samples to reach " + "{:.4f} confidence (probAbove={:.4f})", + mid, count, perDecisionConfidence, probAbove); + } + + if (iterationResult) + { + iterationResult(mid, probAbove >= 0.5); + } + // Make decision based on best estimate + if (probAbove >= 0.5) + { + hi = mid; + } + else + { + lo = mid + 1; + } + } + CLOG_INFO(Perf, + "Noisy binary search completed {} total samples; final interval " + "[{}, {}]", + totalSamples, lo, hi); + + return {lo, hi}; } uint64_t ApplyLoad::calculateInstructionsPerTx() const { - uint32_t batchSize = mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; - if (batchSize > 1) + switch (mModelTx) + { + case ApplyLoadModelTx::CUSTOM_TOKEN: + return TxGenerator::CUSTOM_TOKEN_TX_INSTRUCTIONS; + case ApplyLoadModelTx::SOROSWAP: + return TxGenerator::SOROSWAP_SWAP_TX_INSTRUCTIONS; + case ApplyLoadModelTx::SAC: { - // Conservative estimate: each transfer in batch costs same as SAC - return batchSize * TxGenerator::BATCH_TRANSFER_TX_INSTRUCTIONS; + uint32_t batchSize = mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; + if (batchSize > 1) + { + return batchSize * TxGenerator::BATCH_TRANSFER_TX_INSTRUCTIONS; + } + return TxGenerator::SAC_TX_INSTRUCTIONS; } - return TxGenerator::SAC_TX_INSTRUCTIONS; + } + releaseAssertOrThrow(false); + return 0; +} + +uint32_t +ApplyLoad::calculateBenchmarkModelTxCount() const +{ + auto const& config = mApp.getConfig(); + releaseAssertOrThrow(config.APPLY_LOAD_BATCH_SAC_COUNT > 0); + + switch (mModelTx) + { + case ApplyLoadModelTx::SAC: + // In benchmark mode APPLY_LOAD_MAX_SOROBAN_TX_COUNT means modeled SAC + // transfers, while generation expects number of tx envelopes. + releaseAssertOrThrow(config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT % + config.APPLY_LOAD_BATCH_SAC_COUNT == + 0); + { + auto benchmarkTxCount = config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT / + config.APPLY_LOAD_BATCH_SAC_COUNT; + if (benchmarkTxCount < + config.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS) + { + throw std::runtime_error( + "For benchmark SAC mode, " + "APPLY_LOAD_MAX_SOROBAN_TX_COUNT / " + "APPLY_LOAD_BATCH_SAC_COUNT must be at least " + "APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS to satisfy " + "requested parallelism"); + } + return benchmarkTxCount; + } + case ApplyLoadModelTx::CUSTOM_TOKEN: + // No batching for custom token, one transfer per tx envelope + return config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT; + case ApplyLoadModelTx::SOROSWAP: + // No batching for Soroswap, one swap per tx envelope + return config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT; + } + releaseAssertOrThrow(false); + return 0; } void @@ -275,12 +577,12 @@ ApplyLoad::calculateRequiredHotArchiveEntries(ApplyLoadMode mode, return totalExpectedRestores * 1.5; } -ApplyLoad::ApplyLoad(Application& app, ApplyLoadMode mode) +ApplyLoad::ApplyLoad(Application& app) : mApp(app) - , mMode(mode) - , mRoot(app.getRoot()) + , mMode(app.getConfig().APPLY_LOAD_MODE) + , mModelTx(app.getConfig().APPLY_LOAD_MODEL_TX) , mTotalHotArchiveEntries( - calculateRequiredHotArchiveEntries(mode, app.getConfig())) + calculateRequiredHotArchiveEntries(mMode, app.getConfig())) , mTxCountUtilization( mApp.getMetrics().NewHistogram({"soroban", "apply-load", "tx-count"})) , mInstructionUtilization(mApp.getMetrics().NewHistogram( @@ -299,6 +601,57 @@ ApplyLoad::ApplyLoad(Application& app, ApplyLoadMode mode) { auto const& config = mApp.getConfig(); + // Basic input parameter validation - it's not comprehensive, but should + // catch some simple misconfiguration cases. + if (mMode == ApplyLoadMode::BENCHMARK_MODEL_TX) + { + if (mModelTx == ApplyLoadModelTx::SAC) + { + if (config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT % + config.APPLY_LOAD_BATCH_SAC_COUNT != + 0) + { + throw std::runtime_error( + "For benchmark APPLY_LOAD_MODEL_TX=sac, " + "APPLY_LOAD_MAX_SOROBAN_TX_COUNT must be divisible by " + "APPLY_LOAD_BATCH_SAC_COUNT"); + } + auto benchmarkTxCount = config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT / + config.APPLY_LOAD_BATCH_SAC_COUNT; + if (benchmarkTxCount < + config.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS) + { + throw std::runtime_error( + "For benchmark APPLY_LOAD_MODEL_TX=sac, " + "APPLY_LOAD_MAX_SOROBAN_TX_COUNT / " + "APPLY_LOAD_BATCH_SAC_COUNT must be at least " + "APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS to satisfy " + "requested parallelism"); + } + } + } + // Noisy binary search-based modes require at least 30 ledgers to have + // enough samples for statistics to be meaningful. + if (mMode == ApplyLoadMode::MAX_SAC_TPS || + mMode == ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX) + { + + if (config.APPLY_LOAD_NUM_LEDGERS < 30) + { + throw std::runtime_error( + "APPLY_LOAD_NUM_LEDGERS must be at least 30"); + } + } + + if (mMode == ApplyLoadMode::MAX_SAC_TPS && + config.APPLY_LOAD_MAX_SAC_TPS_MIN_TPS > + config.APPLY_LOAD_MAX_SAC_TPS_MAX_TPS) + { + throw std::runtime_error( + "APPLY_LOAD_MAX_SAC_TPS_MIN_TPS must not be greater than " + "APPLY_LOAD_MAX_SAC_TPS_MAX_TPS for max_sac_tps mode"); + } + switch (mMode) { case ApplyLoadMode::LIMIT_BASED: @@ -311,8 +664,30 @@ ApplyLoad::ApplyLoad(Application& app, ApplyLoadMode mode) break; case ApplyLoadMode::MAX_SAC_TPS: mNumAccounts = config.APPLY_LOAD_MAX_SAC_TPS_MAX_TPS * - config.SOROBAN_TRANSACTION_QUEUE_SIZE_MULTIPLIER * - config.APPLY_LOAD_TARGET_CLOSE_TIME_MS / 1000.0; + config.SOROBAN_TRANSACTION_QUEUE_SIZE_MULTIPLIER * + config.APPLY_LOAD_TARGET_CLOSE_TIME_MS / 1000.0 + + config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; + break; + case ApplyLoadMode::BENCHMARK_MODEL_TX: + if (mModelTx == ApplyLoadModelTx::CUSTOM_TOKEN) + { + // Need 2 unique accounts per transfer to avoid conflicts + mNumAccounts = config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT * 2 + + config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; + } + else if (mModelTx == ApplyLoadModelTx::SOROSWAP) + { + // Need 1 unique account per swap + classic accounts + root + mNumAccounts = config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT + 1 + + config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; + } + else + { + mNumAccounts = + config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT * + config.SOROBAN_TRANSACTION_QUEUE_SIZE_MULTIPLIER + + config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER + 2; + } break; } if (config.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS == 0) @@ -326,7 +701,23 @@ ApplyLoad::ApplyLoad(Application& app, ApplyLoadMode mode) void ApplyLoad::setup() { - releaseAssert(mTxGenerator.loadAccount(mRoot)); + auto const& cfg = mApp.getConfig(); + if (cfg.GENESIS_TEST_ACCOUNT_COUNT < mNumAccounts) + { + throw std::runtime_error( + "GENESIS_TEST_ACCOUNT_COUNT (" + + std::to_string(cfg.GENESIS_TEST_ACCOUNT_COUNT) + + ") must be at least " + std::to_string(mNumAccounts) + + " for apply-load"); + } + + for (uint32_t i = 0; i < mNumAccounts; ++i) + { + auto acc = + std::make_shared(txtest::getGenesisAccount(mApp, i)); + releaseAssert(mTxGenerator.loadAccount(acc)); + mTxGenerator.addAccount(i, acc); + } if (mApp.getLedgerManager() .getLastClosedLedgerHeader() @@ -344,10 +735,40 @@ ApplyLoad::setup() closeLedger({}, upgrade); } - setupAccounts(); - setupUpgradeContract(); + // Set large resources for initial setup + upgradeSettingsForMaxTPS(100000); + + // Make setup based on mode. + switch (mMode) + { + case ApplyLoadMode::LIMIT_BASED: + case ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX: + setupLoadContract(); + break; + case ApplyLoadMode::MAX_SAC_TPS: + setupXLMContract(); + setupBatchTransferContracts(); + break; + case ApplyLoadMode::BENCHMARK_MODEL_TX: + switch (mModelTx) + { + case ApplyLoadModelTx::SAC: + setupXLMContract(); + setupBatchTransferContracts(); + break; + case ApplyLoadModelTx::CUSTOM_TOKEN: + setupTokenContract(); + break; + case ApplyLoadModelTx::SOROSWAP: + setupSoroswapContracts(); + break; + } + break; + } + + // Upgrade to final settings. switch (mMode) { case ApplyLoadMode::MAX_SAC_TPS: @@ -356,18 +777,15 @@ ApplyLoad::setup() // upgrade again before each TPS run. upgradeSettingsForMaxTPS(100000); break; + case ApplyLoadMode::BENCHMARK_MODEL_TX: + upgradeSettingsForMaxTPS(calculateBenchmarkModelTxCount()); + break; case ApplyLoadMode::LIMIT_BASED: upgradeSettings(); break; } - setupLoadContract(); - setupXLMContract(); - if (mMode == ApplyLoadMode::MAX_SAC_TPS && - mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT > 1) - { - setupBatchTransferContracts(); - } + // Setup initial bucket list for modes that support it. if (mMode == ApplyLoadMode::LIMIT_BASED || mMode == ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX) { @@ -428,6 +846,8 @@ ApplyLoad::closeLedger(std::vector const& txs, void ApplyLoad::execute() { + logExecutionEnvironmentSnapshot(mApp.getConfig()); + switch (mMode) { case ApplyLoadMode::LIMIT_BASED: @@ -439,29 +859,9 @@ ApplyLoad::execute() case ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX: findMaxLimitsForModelTransaction(); break; - } -} - -void -ApplyLoad::setupAccounts() -{ - auto const& lm = mApp.getLedgerManager(); - // pass in false for initialAccounts so we fund new account with a lower - // balance, allowing the creation of more accounts. - std::vector creationOps = mTxGenerator.createAccounts( - 0, mNumAccounts, lm.getLastClosedLedgerNum() + 1, false); - - for (size_t i = 0; i < creationOps.size(); i += MAX_OPS_PER_TX) - { - std::vector txs; - - size_t end_id = std::min(i + MAX_OPS_PER_TX, creationOps.size()); - std::vector currOps(creationOps.begin() + i, - creationOps.begin() + end_id); - txs.push_back(mTxGenerator.createTransactionFramePtr(mRoot, currOps, - std::nullopt)); - - closeLedger(txs); + case ApplyLoadMode::BENCHMARK_MODEL_TX: + benchmarkModelTx(); + break; } } @@ -524,11 +924,11 @@ ApplyLoad::applyConfigUpgrade(SorobanUpgradeConfig const& upgradeConfig) upgradeBytes, mUpgradeCodeKey, mUpgradeInstanceKey, std::nullopt, resources); { - LedgerSnapshot ls(mApp); + LedgerReadView lrv(mApp); auto diagnostics = DiagnosticEventManager::createForValidation(mApp.getConfig()); - auto validationRes = invokeTx->checkValid(mApp.getAppConnector(), ls, 0, - 0, 0, diagnostics); + auto validationRes = invokeTx->checkValid(mApp.getAppConnector(), lrv, + 0, 0, 0, diagnostics); if (!validationRes->isSuccess()) { if (validationRes->getResultCode() == txSOROBAN_INVALID) @@ -759,7 +1159,7 @@ ApplyLoad::setupBatchTransferContracts() { auto const& lm = mApp.getLedgerManager(); - // First, upload the batch_transfer contract WASM + // First, upload the batch_transfer contract Wasm auto wasm = rust_bridge::get_test_contract_sac_transfer( mApp.getConfig().LEDGER_PROTOCOL_VERSION); xdr::opaque_vec<> wasmBytes; @@ -1112,14 +1512,15 @@ ApplyLoad::benchmarkLimits() CLOG_INFO(Perf, "Tx Success Rate: {:f}%", successRate() * 100); } -void +double ApplyLoad::benchmarkLimitsIteration() { - releaseAssert(mMode != ApplyLoadMode::MAX_SAC_TPS); - mApp.getBucketManager().getLiveBucketList().resolveAllFutures(); releaseAssert( mApp.getBucketManager().getLiveBucketList().futuresAllResolved()); + mApp.getBucketManager().getHotArchiveBucketList().resolveAllFutures(); + releaseAssert( + mApp.getBucketManager().getHotArchiveBucketList().futuresAllResolved()); auto& lm = mApp.getLedgerManager(); auto const& config = mApp.getConfig(); @@ -1144,39 +1545,33 @@ ApplyLoad::benchmarkLimitsIteration() maxResourcesToGenerate.toString()); auto resourcesLeft = maxResourcesToGenerate; + // Generate classic payments using the first + // APPLY_LOAD_CLASSIC_TXS_PER_LEDGER accounts. + generateClassicPayments(txs, 0); + + // Use remaining accounts (after classic) for soroban transactions auto const& accounts = mTxGenerator.getAccounts(); + uint32_t sorobanStartIdx = config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; // Omit root account - std::vector shuffledAccounts(accounts.size() - 1); - std::iota(shuffledAccounts.begin(), shuffledAccounts.end(), 0); + std::vector shuffledAccounts(accounts.size() - 1 - + sorobanStartIdx); + std::iota(shuffledAccounts.begin(), shuffledAccounts.end(), + sorobanStartIdx); stellar::shuffle(std::begin(shuffledAccounts), std::end(shuffledAccounts), getGlobalRandomEngine()); - LedgerSnapshot ls(mApp); + LedgerReadView lrv(mApp); auto appConnector = mApp.getAppConnector(); - auto addTx = [&ls, &appConnector, &txs](TransactionFrameBasePtr tx) { + auto addTx = [&lrv, &appConnector, &txs](TransactionFrameBasePtr tx) { auto diagnostics = DiagnosticEventManager::createDisabled(); - auto res = tx->checkValid(appConnector, ls, 0, 0, 0, diagnostics); + auto res = tx->checkValid(appConnector, lrv, 0, 0, 0, diagnostics); releaseAssert(res && res->isSuccess()); txs.emplace_back(tx); }; - releaseAssert(shuffledAccounts.size() >= - config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER); - for (size_t i = 0; i < config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; ++i) - { - auto it = accounts.find(shuffledAccounts[i]); - releaseAssert(it != accounts.end()); - it->second->loadSequenceNumber(); - auto [_, tx] = mTxGenerator.paymentTransaction( - mNumAccounts, 0, lm.getLastClosedLedgerNum() + 1, it->first, 1, - std::nullopt); - addTx(tx); - } - bool sorobanLimitHit = false; - for (size_t i = config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; - i < shuffledAccounts.size(); ++i) + for (size_t i = 0; i < shuffledAccounts.size(); ++i) { auto it = accounts.find(shuffledAccounts[i]); releaseAssert(it != accounts.end()); @@ -1221,7 +1616,16 @@ ApplyLoad::benchmarkLimitsIteration() // accounts, which should not happen. releaseAssert(sorobanLimitHit); + auto& ledgerCloseTime = + mApp.getMetrics().NewTimer({"ledger", "ledger", "close"}); + + double timeBefore = ledgerCloseTime.sum(); closeLedger(txs, {}, /* recordSorobanUtilization */ true); + double timeAfter = ledgerCloseTime.sum(); + + double closeTime = timeAfter - timeBefore; + CLOG_INFO(Perf, "Limits benchmark time: {:.2f}ms", closeTime); + return closeTime; } void @@ -1267,25 +1671,13 @@ ApplyLoad::findMaxLimitsForModelTransaction() validateTxParam("APPLY_LOAD_EVENT_COUNT", config.APPLY_LOAD_EVENT_COUNT, config.APPLY_LOAD_EVENT_COUNT_DISTRIBUTION, true); - auto roundDown = [](uint64_t value, uint64_t step) { - return value - value % step; - }; - - auto& ledgerCloseTime = - mApp.getMetrics().NewTimer({"ledger", "ledger", "close"}); + double targetTimeMs = mApp.getConfig().APPLY_LOAD_TARGET_CLOSE_TIME_MS; - uint64_t minTxsPerLedger = 1; - uint64_t maxTxsPerLedger = mApp.getConfig().APPLY_LOAD_MAX_SOROBAN_TX_COUNT; + // Track the best config found during the search SorobanUpgradeConfig maxLimitsConfig; uint64_t maxLimitsTxsPerLedger = 0; - uint64_t prevTxsPerLedger = 0; - - double targetTimeMs = mApp.getConfig().APPLY_LOAD_TARGET_CLOSE_TIME_MS; - - while (minTxsPerLedger <= maxTxsPerLedger) - { - uint64_t testTxsPerLedger = (minTxsPerLedger + maxTxsPerLedger) / 2; + auto prepareIteration = [this, &config](uint32_t testTxsPerLedger) { CLOG_INFO(Perf, "Testing ledger max model txs: {}, generated limits: " "instructions {}, tx size {}, disk read entries {}, rw " @@ -1295,52 +1687,50 @@ ApplyLoad::findMaxLimitsForModelTransaction() testTxsPerLedger * config.APPLY_LOAD_TX_SIZE_BYTES[0], testTxsPerLedger * config.APPLY_LOAD_NUM_DISK_READ_ENTRIES[0], testTxsPerLedger * config.APPLY_LOAD_NUM_RW_ENTRIES[0]); + auto [upgradeConfig, actualMaxTxsPerLedger] = updateSettingsForTxCount(testTxsPerLedger); - // Break when due to rounding we've arrived at the same actual txs to - // test as in the previous iteration, or at the value lower than the - // best found so far. - if (actualMaxTxsPerLedger == prevTxsPerLedger || - actualMaxTxsPerLedger <= maxLimitsTxsPerLedger) - { - CLOG_INFO(Perf, "No change in generated limits after update due to " - "rounding, ending search."); - break; - } - applyConfigUpgrade(upgradeConfig); - prevTxsPerLedger = actualMaxTxsPerLedger; - ledgerCloseTime.Clear(); - for (size_t i = 0; i < mApp.getConfig().APPLY_LOAD_NUM_LEDGERS; ++i) - { - benchmarkLimitsIteration(); - } - releaseAssert(successRate() == 1.0); - if (ledgerCloseTime.mean() > targetTimeMs) - { - CLOG_INFO( - Perf, - "Failed: {} model txs per ledger (avg close time: {:.2f}ms)", - actualMaxTxsPerLedger, ledgerCloseTime.mean()); - maxTxsPerLedger = testTxsPerLedger - 1; - } - else + applyConfigUpgrade(upgradeConfig); + }; + auto iterationResult = [this, &maxLimitsTxsPerLedger, &maxLimitsConfig]( + uint32_t testTxsPerLedger, bool isAbove) { + auto [upgradeConfig, actualMaxTxsPerLedger] = + updateSettingsForTxCount(testTxsPerLedger); + // Store the config if this is the best so far + if (!isAbove && actualMaxTxsPerLedger > maxLimitsTxsPerLedger) { - CLOG_INFO(Perf, - "Success: {} model txs per ledger (avg close time: " - "{:.2f}ms)", - actualMaxTxsPerLedger, ledgerCloseTime.mean()); - minTxsPerLedger = testTxsPerLedger + 1; maxLimitsTxsPerLedger = actualMaxTxsPerLedger; maxLimitsConfig = upgradeConfig; } - } + }; + + auto benchmarkFunc = [this](uint32_t testTxsPerLedger) -> double { + double closeTime = benchmarkLimitsIteration(); + releaseAssert(successRate() == 1.0); + return closeTime; + }; + + uint32_t minTxsPerLedger = 1; + uint32_t maxTxsPerLedger = mApp.getConfig().APPLY_LOAD_MAX_SOROBAN_TX_COUNT; + size_t maxSamplesPerPoint = mApp.getConfig().APPLY_LOAD_NUM_LEDGERS; + uint32_t xTolerance = 100; + + auto [lo, hi] = noisyBinarySearch( + benchmarkFunc, targetTimeMs, minTxsPerLedger, maxTxsPerLedger, + NOISY_BINARY_SEARCH_CONFIDENCE, xTolerance, maxSamplesPerPoint, + prepareIteration, iterationResult); + // Note, that the final search range may be above the TPL found, that's due + // to rounding we do when calculating TPL to benchmark (not every TPL + // value can be tested fairly). CLOG_INFO(Perf, - "Maximum limits found for model transaction ({} TPL): " + "Maximum limits found for model transaction ({} TPL, [{}, {}] " + "final search range): " "instructions {}, " "tx size {}, disk read entries {}, disk read bytes {}, " "write entries {}, write bytes {}", - maxLimitsTxsPerLedger, *maxLimitsConfig.ledgerMaxInstructions, + maxLimitsTxsPerLedger, lo, hi, + *maxLimitsConfig.ledgerMaxInstructions, *maxLimitsConfig.ledgerMaxTransactionsSizeBytes, *maxLimitsConfig.ledgerMaxDiskReadEntries, *maxLimitsConfig.ledgerMaxDiskReadBytes, @@ -1424,21 +1814,13 @@ ApplyLoad::findMaxSacTps() std::ceil(static_cast(MIN_TXS_PER_STEP) / txsPerStep) * txsPerStep; } - uint32_t stepsPerSecond = 1000 / ApplyLoad::TARGET_CLOSE_TIME_STEP_MS; - // Round min and max rate of txs per step of TARGET_CLOSE_TIME_STEP_MS - // duration to be multiple of txsPerStep. - uint32_t minTxRateSteps = - std::max(1u, mApp.getConfig().APPLY_LOAD_MAX_SAC_TPS_MIN_TPS / - stepsPerSecond / txsPerStep); - uint32_t maxTxRateSteps = std::ceil( + uint32_t minSteps = std::max( + 1u, mApp.getConfig().APPLY_LOAD_MAX_SAC_TPS_MIN_TPS / txsPerStep); + uint32_t maxSteps = std::ceil( static_cast(mApp.getConfig().APPLY_LOAD_MAX_SAC_TPS_MAX_TPS) / - stepsPerSecond / txsPerStep); - uint32_t bestTps = 0; + txsPerStep); double targetCloseTimeMs = mApp.getConfig().APPLY_LOAD_TARGET_CLOSE_TIME_MS; - uint32_t targetCloseTimeSteps = - mApp.getConfig().APPLY_LOAD_TARGET_CLOSE_TIME_MS / - ApplyLoad::TARGET_CLOSE_TIME_STEP_MS; auto txsPerLedgerToTPS = [targetCloseTimeMs](uint32_t txsPerLedger) -> uint32_t { @@ -1449,47 +1831,45 @@ ApplyLoad::findMaxSacTps() CLOG_WARNING(Perf, "Starting MAX_SAC_TPS binary search between {} and {} TPS " "with search step of {} txs", - txsPerLedgerToTPS(minTxRateSteps * txsPerStep), - txsPerLedgerToTPS(maxTxRateSteps * txsPerStep), txsPerStep); + txsPerLedgerToTPS(minSteps * txsPerStep), + txsPerLedgerToTPS(maxSteps * txsPerStep), txsPerStep); CLOG_WARNING(Perf, "Target close time: {}ms", targetCloseTimeMs); CLOG_WARNING(Perf, "Num parallel clusters: {}", mApp.getConfig().APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS); - while (minTxRateSteps <= maxTxRateSteps) - { - uint32_t testTxRateSteps = (minTxRateSteps + maxTxRateSteps) / 2; - uint32_t testTxRate = testTxRateSteps * txsPerStep; - - // Calculate transactions per ledger based on target close time - uint32_t txsPerLedger = targetCloseTimeSteps * testTxRate / - mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; - uint32_t testTps = txsPerLedgerToTPS( - txsPerLedger * mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT); + auto prepareIter = [this, txsPerStep](uint32_t numSteps) { + uint32_t testTxRate = numSteps * txsPerStep; + uint32_t txsPerLedger = + testTxRate / mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; - CLOG_WARNING( - Perf, - "Testing {} TPS with {} batched TXs per ledger ({} transfers).", - testTps, txsPerLedger, - txsPerLedger * mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT); + CLOG_INFO(Perf, "Testing {} TXs per ledger ({} transfers).", + txsPerLedger, + txsPerLedger * mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT); upgradeSettingsForMaxTPS(txsPerLedger); + }; + // Create benchmark function that returns close time for a given TPS step + auto benchmarkFunc = [this, txsPerStep](uint32_t numSteps) -> double { + uint32_t testTxRate = numSteps * txsPerStep; + uint32_t txsPerLedger = + testTxRate / mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; + return benchmarkModelTxTpsSingleLedger(ApplyLoadModelTx::SAC, + txsPerLedger); + }; - double avgCloseTime = benchmarkSacTps(txsPerLedger); + size_t maxSamplesPerPoint = mApp.getConfig().APPLY_LOAD_NUM_LEDGERS; + uint32_t const tolerance = 0; - if (avgCloseTime <= targetCloseTimeMs) - { - bestTps = testTps; - minTxRateSteps = testTxRateSteps + 1; - CLOG_WARNING(Perf, "Success: {} TPS (avg total tx apply: {:.2f}ms)", - testTps, avgCloseTime); - } - else - { - maxTxRateSteps = testTxRateSteps - 1; - CLOG_WARNING(Perf, "Failed: {} TPS (avg total tx apply: {:.2f}ms)", - testTps, avgCloseTime); - } - } + auto [lo, hi] = + noisyBinarySearch(benchmarkFunc, targetCloseTimeMs, minSteps, maxSteps, + NOISY_BINARY_SEARCH_CONFIDENCE, tolerance, + maxSamplesPerPoint, prepareIter); + releaseAssert(lo == hi); + uint32_t bestTxRate = lo * txsPerStep; + uint32_t bestTxsPerLedger = + bestTxRate / mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT; + uint32_t bestTps = txsPerLedgerToTPS( + bestTxsPerLedger * mApp.getConfig().APPLY_LOAD_BATCH_SAC_COUNT); CLOG_WARNING(Perf, "================================================"); CLOG_WARNING(Perf, "Maximum sustainable SAC payments per second: {}", @@ -1499,75 +1879,183 @@ ApplyLoad::findMaxSacTps() CLOG_WARNING(Perf, "================================================"); } +void +ApplyLoad::benchmarkModelTx() +{ + releaseAssertOrThrow(mMode == ApplyLoadMode::BENCHMARK_MODEL_TX); + + auto const& config = mApp.getConfig(); + std::vector closeTimes; + closeTimes.reserve(config.APPLY_LOAD_NUM_LEDGERS); + + CLOG_WARNING(Perf, + "Starting model transaction benchmark for {} ledgers with " + "{} tx per ledger", + config.APPLY_LOAD_NUM_LEDGERS, + config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT); + + for (size_t i = 0; i < config.APPLY_LOAD_NUM_LEDGERS; ++i) + { + double closeTimeMs = 0.0; + switch (mModelTx) + { + case ApplyLoadModelTx::SAC: + closeTimeMs = benchmarkModelTxTpsSingleLedger( + ApplyLoadModelTx::SAC, calculateBenchmarkModelTxCount()); + break; + case ApplyLoadModelTx::CUSTOM_TOKEN: + closeTimeMs = benchmarkModelTxTpsSingleLedger( + ApplyLoadModelTx::CUSTOM_TOKEN, + calculateBenchmarkModelTxCount()); + break; + case ApplyLoadModelTx::SOROSWAP: + closeTimeMs = benchmarkModelTxTpsSingleLedger( + ApplyLoadModelTx::SOROSWAP, calculateBenchmarkModelTxCount()); + break; + } + closeTimes.emplace_back(closeTimeMs); + } + + releaseAssert(!closeTimes.empty()); + + double avgCloseTimeMs = + std::accumulate(closeTimes.begin(), closeTimes.end(), 0.0) / + closeTimes.size(); + + double varianceMsSq = 0.0; + for (auto const& closeTime : closeTimes) + { + double delta = closeTime - avgCloseTimeMs; + varianceMsSq += delta * delta; + } + varianceMsSq /= closeTimes.size(); + + std::vector sortedCloseTimes = closeTimes; + std::sort(sortedCloseTimes.begin(), sortedCloseTimes.end()); + + CLOG_WARNING(Perf, "================================================"); + CLOG_WARNING( + Perf, "Model tx benchmark stats ({} ledgers, {} tx per ledger):", + config.APPLY_LOAD_NUM_LEDGERS, config.APPLY_LOAD_MAX_SOROBAN_TX_COUNT); + CLOG_WARNING(Perf, "mean close time: {} ms", avgCloseTimeMs); + CLOG_WARNING(Perf, "p25 close time: {} ms", + interpolatePercentile(sortedCloseTimes, 25.0)); + CLOG_WARNING(Perf, "p50 close time: {} ms", + interpolatePercentile(sortedCloseTimes, 50.0)); + CLOG_WARNING(Perf, "p75 close time: {} ms", + interpolatePercentile(sortedCloseTimes, 75.0)); + CLOG_WARNING(Perf, "p95 close time: {} ms", + interpolatePercentile(sortedCloseTimes, 95.0)); + CLOG_WARNING(Perf, "p99 close time: {} ms", + interpolatePercentile(sortedCloseTimes, 99.0)); + CLOG_WARNING(Perf, "close time stddev: {} ms", std::sqrt(varianceMsSq)); + CLOG_WARNING(Perf, "================================================"); +} + double -ApplyLoad::benchmarkSacTps(uint32_t txsPerLedger) +ApplyLoad::benchmarkModelTxTpsSingleLedger(ApplyLoadModelTx modelTx, + uint32_t txsPerLedger) { - // For timing, we just want to track the TX application itself. This - // includes charging fees, applying transactions, and post apply work (like - // meta). It does not include writing the results to disk. - // When APPLY_LOAD_TIME_WRITES is true, use the ledger close timer instead - // which includes database writes. auto& totalTxApplyTimer = mApp.getConfig().APPLY_LOAD_TIME_WRITES ? mApp.getMetrics().NewTimer({"ledger", "ledger", "close"}) : mApp.getMetrics().NewTimer( {"ledger", "transaction", "total-apply"}); - totalTxApplyTimer.Clear(); - uint32_t numLedgers = mApp.getConfig().APPLY_LOAD_NUM_LEDGERS; - for (uint32_t iter = 0; iter < numLedgers; ++iter) - { - warmAccountCache(); - - int64_t initialSuccessCount = - mTxGenerator.getApplySorobanSuccess().count(); + warmAccountCache(); - // Generate exactly enough SAC payment transactions - std::vector txs; - txs.reserve(txsPerLedger); + int64_t initialSuccessCount = mTxGenerator.getApplySorobanSuccess().count(); + // Generate classic payments using accounts at the end of the range, + // so they don't overlap with soroban accounts. + std::vector txs; + txs.reserve(txsPerLedger + + mApp.getConfig().APPLY_LOAD_CLASSIC_TXS_PER_LEDGER); + uint32_t classicStartIdx = + mNumAccounts - mApp.getConfig().APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; + generateClassicPayments(txs, classicStartIdx); + + // Generate soroban model transactions + switch (modelTx) + { + case ApplyLoadModelTx::SAC: generateSacPayments(txs, txsPerLedger); - releaseAssertOrThrow(txs.size() == txsPerLedger); + break; + case ApplyLoadModelTx::CUSTOM_TOKEN: + generateTokenTransfers(txs, txsPerLedger); + break; + case ApplyLoadModelTx::SOROSWAP: + generateSoroswapSwaps(txs, txsPerLedger); + break; + } + releaseAssertOrThrow( + txs.size() == + txsPerLedger + mApp.getConfig().APPLY_LOAD_CLASSIC_TXS_PER_LEDGER); + + mApp.getBucketManager().getLiveBucketList().resolveAllFutures(); + releaseAssert( + mApp.getBucketManager().getLiveBucketList().futuresAllResolved()); + mApp.getBucketManager().getHotArchiveBucketList().resolveAllFutures(); + releaseAssert( + mApp.getBucketManager().getHotArchiveBucketList().futuresAllResolved()); + double timeBefore = totalTxApplyTimer.sum(); + closeLedger(txs); + double timeAfter = totalTxApplyTimer.sum(); - mApp.getBucketManager().getLiveBucketList().resolveAllFutures(); - releaseAssert( - mApp.getBucketManager().getLiveBucketList().futuresAllResolved()); + double closeTime = timeAfter - timeBefore; - closeLedger(txs); + CLOG_INFO(Perf, "Model tx benchmark: {:.2f}ms", closeTime); - CLOG_WARNING(Perf, " Ledger {}/{} completed", iter + 1, numLedgers); + // Check transaction success rate. We should never have any failures, + // and all TXs should have been executed. + int64_t newSuccessCount = + mTxGenerator.getApplySorobanSuccess().count() - initialSuccessCount; - // Check transaction success rate. We should never have any failures, - // and all TXs should have been executed. - int64_t newSuccessCount = - mTxGenerator.getApplySorobanSuccess().count() - initialSuccessCount; + releaseAssert(mTxGenerator.getApplySorobanFailure().count() == 0); + releaseAssert(newSuccessCount == txsPerLedger); - releaseAssert(mTxGenerator.getApplySorobanFailure().count() == 0); - releaseAssert(newSuccessCount == txsPerLedger); + // Verify we had max parallelism, i.e. 1 stage with + // maxDependentTxClusters clusters + auto& stagesMetric = + mApp.getMetrics().NewCounter({"ledger", "apply-soroban", "stages"}); + auto& maxClustersMetric = mApp.getMetrics().NewCounter( + {"ledger", "apply-soroban", "max-clusters"}); - // Verify we had max parallelism, i.e. 1 stage with - // maxDependentTxClusters clusters - auto& stagesMetric = - mApp.getMetrics().NewCounter({"ledger", "apply-soroban", "stages"}); - auto& maxClustersMetric = mApp.getMetrics().NewCounter( - {"ledger", "apply-soroban", "max-clusters"}); + releaseAssert(stagesMetric.count() == 1); + releaseAssert(maxClustersMetric.count() == + mApp.getConfig().APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS); - releaseAssert(stagesMetric.count() == 1); - releaseAssert( - maxClustersMetric.count() == - mApp.getConfig().APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS); - } + return closeTime; +} - // Calculate average close time from all closed ledgers - double totalTime = totalTxApplyTimer.sum(); - double avgTime = totalTime / numLedgers; +void +ApplyLoad::generateClassicPayments(std::vector& txs, + uint32_t startAccountIdx) +{ + auto const& config = mApp.getConfig(); + auto const& accounts = mTxGenerator.getAccounts(); + auto& lm = mApp.getLedgerManager(); + + releaseAssert(accounts.size() >= + startAccountIdx + config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER); - CLOG_WARNING(Perf, " Total time: {:.2f}ms for {} ledgers", totalTime, - numLedgers); - CLOG_WARNING(Perf, " Average total tx apply time per ledger: {:.2f}ms", - avgTime); + LedgerReadView lrv(mApp); + auto appConnector = mApp.getAppConnector(); + auto diagnostics = DiagnosticEventManager::createDisabled(); - return avgTime; + for (uint32_t i = 0; i < config.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER; ++i) + { + uint64_t accountIdx = startAccountIdx + i; + auto it = accounts.find(accountIdx); + releaseAssert(it != accounts.end()); + it->second->loadSequenceNumber(); + auto [_, tx] = mTxGenerator.paymentTransaction( + mNumAccounts, 0, lm.getLastClosedLedgerNum() + 1, it->first, 1, + std::nullopt); + auto res = tx->checkValid(appConnector, lrv, 0, 0, 0, diagnostics); + releaseAssert(res && res->isSuccess()); + txs.emplace_back(tx); + } } void @@ -1590,6 +2078,7 @@ ApplyLoad::generateSacPayments(std::vector& txs, // Calculate how many batch transfer transactions we need. Wrt to TPS, // here we consider one transfer a "transaction" uint32_t txsPerCluster = count / numClusters; + releaseAssertOrThrow(count % numClusters == 0); for (uint32_t clusterId = 0; clusterId < numClusters; ++clusterId) { @@ -1645,5 +2134,1078 @@ ApplyLoad::generateSacPayments(std::vector& txs, txs.push_back(tx.second); } } + LedgerReadView lrv(mApp); + auto diag = DiagnosticEventManager::createDisabled(); + // Validate all the generated transactions. This serves 2 purposes: + // - ensure that the tx generator works as expected + // - prime the signature cache + // Signature cache priming may not be always desirable, but in reality we + // expect most of the signatures to be cached by the time we execute the + // transactions, so excluding the verification from the benchmark is likely + // more realistic than including it. + for (auto const& tx : txs) + { + releaseAssert(tx->checkValid(mApp.getAppConnector(), lrv, 0, 0, 0, diag) + ->isSuccess()); + } +} +void +ApplyLoad::setupTokenContract() +{ + auto const& lm = mApp.getLedgerManager(); + int64_t initialSuccessCount = mTxGenerator.getApplySorobanSuccess().count(); + + auto wasm = rust_bridge::get_apply_load_token_wasm(); + xdr::opaque_vec<> wasmBytes; + wasmBytes.assign(wasm.data.begin(), wasm.data.end()); + + LedgerKey contractCodeLedgerKey; + contractCodeLedgerKey.type(CONTRACT_CODE); + contractCodeLedgerKey.contractCode().hash = sha256(wasmBytes); + + SorobanResources uploadResources; + uploadResources.instructions = 50'000'000; + uploadResources.diskReadBytes = wasmBytes.size() + 500; + uploadResources.writeBytes = wasmBytes.size() + 500; + + auto uploadTx = mTxGenerator.createUploadWasmTransaction( + lm.getLastClosedLedgerNum() + 1, TxGenerator::ROOT_ACCOUNT_ID, + wasmBytes, contractCodeLedgerKey, std::nullopt, uploadResources); + + closeLedger({uploadTx.second}); + + // Create the contract with constructor(owner). + // The owner is the root account. + auto rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto salt = sha256("apply load token contract salt"); + auto contractIDPreimage = + txtest::makeContractIDPreimage(*rootAccount, salt); + + SorobanResources createResources; + createResources.instructions = 50'000'000; + createResources.diskReadBytes = wasmBytes.size() + 10000; + createResources.writeBytes = 50000; + + // Constructor arg: owner address + SCVal ownerVal(SCV_ADDRESS); + ownerVal.address() = makeAccountAddress(rootAccount->getPublicKey()); + + txtest::ConstructorParams ctorParams; + ctorParams.constructorArgs = {ownerVal}; + + auto createTx = txtest::makeSorobanCreateContractTx( + mApp, *rootAccount, contractIDPreimage, + txtest::makeWasmExecutable(contractCodeLedgerKey.contractCode().hash), + createResources, mTxGenerator.generateFee(std::nullopt, /* opsCnt */ 1), + ctorParams); + closeLedger({createTx}); + + auto instanceKey = createTx->sorobanResources().footprint.readWrite.back(); + + mTokenInstance.readOnlyKeys.emplace_back(contractCodeLedgerKey); + mTokenInstance.readOnlyKeys.emplace_back(instanceKey); + mTokenInstance.contractID = instanceKey.contractData().contract; + mTokenInstance.contractEntriesSize = + footprintSize(mApp, mTokenInstance.readOnlyKeys); + + // Now call multi_mint to mint tokens to all genesis accounts. + // Batch into chunks to keep transaction sizes manageable. + static constexpr uint32_t MINT_BATCH_SIZE = 500; + uint32_t totalAccounts = mNumAccounts; + for (uint32_t offset = 0; offset < totalAccounts; offset += MINT_BATCH_SIZE) + { + uint32_t batchEnd = std::min(offset + MINT_BATCH_SIZE, totalAccounts); + + auto mintAccount = mTxGenerator.findAccount( + TxGenerator::ROOT_ACCOUNT_ID, lm.getLastClosedLedgerNum()); + mintAccount->loadSequenceNumber(); + + // Build multi_mint invocation: multi_mint(accounts, amount) + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mTokenInstance.contractID; + ihf.invokeContract().functionName = "multi_mint"; + + // Build accounts vector + SCVal accountsVec(SCV_VEC); + accountsVec.vec().activate(); + for (uint32_t i = offset; i < batchEnd; ++i) + { + auto acc = mTxGenerator.getAccount(i); + SCVal addrVal(SCV_ADDRESS); + addrVal.address() = makeAccountAddress(acc->getPublicKey()); + accountsVec.vec()->push_back(addrVal); + } + + ihf.invokeContract().args = {accountsVec, + txtest::makeI128(1'000'000'000)}; + + SorobanResources resources; + resources.instructions = 500'000'000; + resources.diskReadBytes = wasmBytes.size() + 100'000; + resources.writeBytes = (batchEnd - offset) * 500 + 10000; + + resources.footprint.readOnly.push_back( + mTokenInstance.readOnlyKeys.at(0)); + // Put instance into RW footprint as OZ token apparently modifies it + // on mint. + resources.footprint.readWrite.push_back( + mTokenInstance.readOnlyKeys.at(1)); + + // Source account + LedgerKey rootKey(ACCOUNT); + rootKey.account().accountID = mintAccount->getPublicKey(); + resources.footprint.readWrite.emplace_back(rootKey); + + // Balance entries for each account being minted to + for (uint32_t i = offset; i < batchEnd; ++i) + { + auto acc = mTxGenerator.getAccount(i); + SCVal addrVal(SCV_ADDRESS); + addrVal.address() = makeAccountAddress(acc->getPublicKey()); + + LedgerKey balanceKey(CONTRACT_DATA); + balanceKey.contractData().contract = mTokenInstance.contractID; + balanceKey.contractData().key = + txtest::makeVecSCVal({makeSymbolSCVal("Balance"), addrVal}); + balanceKey.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.emplace_back(balanceKey); + } + + // Auth: source account credentials for owner + SorobanAuthorizedInvocation invocation; + invocation.function.type(SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + invocation.function.contractFn() = ihf.invokeContract(); + + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, + invocation); + + auto resourceFee = txtest::sorobanResourceFee( + mApp, resources, 5000 + (batchEnd - offset) * 100, 200); + resourceFee += 500'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *mintAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + + closeLedger({tx}); + } + + int64_t totalSetupTxs = + mTxGenerator.getApplySorobanSuccess().count() - initialSuccessCount; + // upload + create + multi_mint batches + uint32_t expectedMintBatches = + (totalAccounts + MINT_BATCH_SIZE - 1) / MINT_BATCH_SIZE; + releaseAssert(totalSetupTxs == + static_cast(2 + expectedMintBatches)); + releaseAssert(mTxGenerator.getApplySorobanFailure().count() == 0); + + CLOG_INFO(Perf, + "Custom token contract setup complete: {} accounts minted in " + "{} batches", + totalAccounts, expectedMintBatches); +} + +void +ApplyLoad::generateTokenTransfers(std::vector& txs, + uint32_t count) +{ + auto& lm = mApp.getLedgerManager(); + + releaseAssert(mNumAccounts >= count * 2); + + for (uint32_t i = 0; i < count; ++i) + { + // Use pairs of accounts: (2i, 2i+1) to avoid RW conflicts + uint32_t fromIdx = 2 * i; + uint32_t toIdx = 2 * i + 1; + + auto tx = mTxGenerator.invokeTokenTransfer( + lm.getLastClosedLedgerNum() + 1, fromIdx, toIdx, mTokenInstance, + 100, 1'000'000); + + txs.push_back(tx.second); + } + + LedgerReadView lrv(mApp); + auto diag = DiagnosticEventManager::createDisabled(); + for (auto const& tx : txs) + { + releaseAssert(tx->checkValid(mApp.getAppConnector(), lrv, 0, 0, 0, diag) + ->isSuccess()); + } +} + +void +ApplyLoad::setupSoroswapContracts() +{ + auto const& lm = mApp.getLedgerManager(); + auto const& config = mApp.getConfig(); + int64_t initialSuccessCount = mTxGenerator.getApplySorobanSuccess().count(); + + // Upgrade maxTxSetSize so we can batch up to 10000 classic ops per + // ledger during setup. + static constexpr uint32_t SETUP_MAX_TX_SET_SIZE = 10000; + { + auto upgrade = xdr::xvector{}; + LedgerUpgrade ledgerUpgrade; + ledgerUpgrade.type(LEDGER_UPGRADE_MAX_TX_SET_SIZE); + ledgerUpgrade.newMaxTxSetSize() = SETUP_MAX_TX_SET_SIZE; + auto v = xdr::xdr_to_opaque(ledgerUpgrade); + upgrade.push_back(UpgradeType{v.begin(), v.end()}); + closeLedger({}, upgrade); + } + + // Step 1: We create exactly APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS (C) + // token pairs (one per cluster/bin) so that the tx set builder can assign + // each pair's transactions to its own bin, achieving maximum parallelism. + // Using C+1 tokens in a chain gives exactly C pairs: (T0,T1), (T1,T2), ..., + // (T_{C-1},T_C). + uint32_t numPairs = config.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS; + uint32_t numTokens = numPairs + 1; + mSoroswapState.numTokens = numTokens; + + CLOG_INFO(Perf, "Soroswap setup: {} tokens, {} pairs for {} clusters", + numTokens, numPairs, numPairs); + + // Step 2: Create N classic credit assets using root as issuer + auto rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + for (uint32_t i = 0; i < numTokens; ++i) + { + std::string code = "T" + std::to_string(i); + mSoroswapState.assets.push_back( + txtest::makeAsset(rootAccount->getSecretKey(), code)); + } + + // Step 3: Create trustlines for all accounts x all assets. + // Batch up to 10000 ChangeTrust txs per ledger close. + CLOG_INFO(Perf, + "Soroswap setup: creating trustlines for {} accounts x {} " + "assets", + mNumAccounts, numTokens); + for (uint32_t assetIdx = 0; assetIdx < numTokens; ++assetIdx) + { + std::vector trustlineTxs; + for (uint32_t accIdx = 1; accIdx < mNumAccounts; ++accIdx) + { + auto acc = + mTxGenerator.findAccount(accIdx, lm.getLastClosedLedgerNum()); + acc->loadSequenceNumber(); + auto op = + txtest::changeTrust(mSoroswapState.assets[assetIdx], INT64_MAX); + auto tx = + mTxGenerator.createTransactionFramePtr(acc, {op}, std::nullopt); + trustlineTxs.push_back( + std::const_pointer_cast(tx)); + + // Close ledger in batches of SETUP_MAX_TX_SET_SIZE + if (trustlineTxs.size() >= SETUP_MAX_TX_SET_SIZE) + { + closeLedger(trustlineTxs); + trustlineTxs.clear(); + } + } + if (!trustlineTxs.empty()) + { + closeLedger(trustlineTxs); + } + } + + // Step 4: Fund all accounts with each asset. + // Two-phase approach for efficiency: + // Phase 1: Root mints to NUM_DISTRIBUTORS "distribution" accounts + // (one multi-op tx per asset, closed in a single ledger). + // Phase 2: Each distributor pays ~100 target accounts via a multi-op + // tx. We batch up to 100 such txs per ledger close, giving + // ~10000 ops per ledger. + static constexpr uint32_t NUM_DISTRIBUTORS = 100; + static constexpr uint32_t OPS_PER_TX = 100; + // Total amount each final account should receive. + static constexpr int64_t AMOUNT_PER_ACCOUNT = 1'000'000'000; + + CLOG_INFO(Perf, "Soroswap setup: funding accounts ({} distributors)", + NUM_DISTRIBUTORS); + + // Accounts [1 .. NUM_DISTRIBUTORS] are distributors. + // Accounts [NUM_DISTRIBUTORS+1 .. mNumAccounts-1] are targets. + uint32_t numTargets = mNumAccounts - 1 - NUM_DISTRIBUTORS; + + for (uint32_t assetIdx = 0; assetIdx < numTokens; ++assetIdx) + { + // Phase 1: Root -> distributors (single multi-op tx per asset). + { + int64_t amountPerDistributor = + AMOUNT_PER_ACCOUNT * + static_cast((numTargets / NUM_DISTRIBUTORS) + 2); + std::vector ops; + for (uint32_t d = 1; d <= NUM_DISTRIBUTORS; ++d) + { + ops.push_back(txtest::payment( + mTxGenerator.getAccount(d)->getPublicKey(), + mSoroswapState.assets[assetIdx], amountPerDistributor)); + } + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + auto tx = mTxGenerator.createTransactionFramePtr(rootAccount, ops, + std::nullopt); + closeLedger({std::const_pointer_cast(tx)}); + } + + // Phase 2: Distributors -> targets. + // Each distributor handles a slice of target accounts. + // Build one multi-op tx per distributor, batch up to 100 txs per + // ledger close (~10000 ops per ledger). + uint32_t firstTarget = NUM_DISTRIBUTORS + 1; + + // Group targets by distributor (round-robin assignment). + std::vector> distTargets(NUM_DISTRIBUTORS); + for (uint32_t targetIdx = firstTarget; targetIdx < mNumAccounts; + ++targetIdx) + { + uint32_t distSlot = (targetIdx - firstTarget) % NUM_DISTRIBUTORS; + distTargets[distSlot].push_back(targetIdx); + } + + // Build txs: one tx per OPS_PER_TX targets of a distributor. + std::vector batchTxs; + for (uint32_t d = 0; d < NUM_DISTRIBUTORS; ++d) + { + uint32_t distAccId = d + 1; + auto const& targets = distTargets[d]; + std::vector ops; + for (size_t t = 0; t < targets.size(); ++t) + { + ops.push_back(txtest::payment( + mTxGenerator.getAccount(targets[t])->getPublicKey(), + mSoroswapState.assets[assetIdx], AMOUNT_PER_ACCOUNT)); + + if (ops.size() >= OPS_PER_TX || t == targets.size() - 1) + { + auto distAcc = mTxGenerator.findAccount( + distAccId, lm.getLastClosedLedgerNum()); + distAcc->loadSequenceNumber(); + auto tx = mTxGenerator.createTransactionFramePtr( + distAcc, ops, std::nullopt); + batchTxs.push_back( + std::const_pointer_cast(tx)); + ops.clear(); + + if (batchTxs.size() >= 100) + { + closeLedger(batchTxs); + batchTxs.clear(); + } + } + } + } + if (!batchTxs.empty()) + { + closeLedger(batchTxs); + } + } + + // Step 5: Create N SAC contracts for each asset. + // We use higher resource limits than createSACTransaction's defaults + // because credit asset SAC initialization needs more than 1M + // instructions. + CLOG_INFO(Perf, "Soroswap setup: creating {} SAC contracts", numTokens); + mSoroswapState.sacInstances.resize(numTokens); + for (uint32_t i = 0; i < numTokens; ++i) + { + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + SorobanResources sacResources; + sacResources.instructions = 10'000'000; + sacResources.diskReadBytes = 1000; + sacResources.writeBytes = 1000; + + auto contractIDPreimage = + txtest::makeContractIDPreimage(mSoroswapState.assets[i]); + + auto createTx = txtest::makeSorobanCreateContractTx( + mApp, *rootAccount, contractIDPreimage, + txtest::makeAssetExecutable(mSoroswapState.assets[i]), sacResources, + mTxGenerator.generateFee(std::nullopt, /* opsCnt */ 1)); + closeLedger({createTx}); + + auto instanceKey = + createTx->sorobanResources().footprint.readWrite.back(); + mSoroswapState.sacInstances[i].readOnlyKeys.emplace_back(instanceKey); + mSoroswapState.sacInstances[i].contractID = + instanceKey.contractData().contract; + } + + // Step 6: Upload 3 Soroswap Wasms (factory, pair, router) + CLOG_INFO(Perf, "Soroswap setup: uploading Wasms"); + + auto factoryWasm = rust_bridge::get_apply_load_soroswap_factory_wasm(); + xdr::opaque_vec<> factoryWasmBytes; + factoryWasmBytes.assign(factoryWasm.data.begin(), factoryWasm.data.end()); + LedgerKey factoryCodeKey; + factoryCodeKey.type(CONTRACT_CODE); + factoryCodeKey.contractCode().hash = sha256(factoryWasmBytes); + mSoroswapState.factoryCodeKey = factoryCodeKey; + + SorobanResources factoryUploadRes; + factoryUploadRes.instructions = 50'000'000; + factoryUploadRes.diskReadBytes = + static_cast(factoryWasmBytes.size()) + 500; + factoryUploadRes.writeBytes = + static_cast(factoryWasmBytes.size()) + 500; + auto factoryUploadTx = mTxGenerator.createUploadWasmTransaction( + lm.getLastClosedLedgerNum() + 1, TxGenerator::ROOT_ACCOUNT_ID, + factoryWasmBytes, factoryCodeKey, std::nullopt, factoryUploadRes); + closeLedger({factoryUploadTx.second}); + + auto pairWasm = rust_bridge::get_apply_load_soroswap_pool_wasm(); + xdr::opaque_vec<> pairWasmBytes; + pairWasmBytes.assign(pairWasm.data.begin(), pairWasm.data.end()); + LedgerKey pairCodeKey; + pairCodeKey.type(CONTRACT_CODE); + pairCodeKey.contractCode().hash = sha256(pairWasmBytes); + mSoroswapState.pairCodeKey = pairCodeKey; + + SorobanResources pairUploadRes; + pairUploadRes.instructions = 50'000'000; + pairUploadRes.diskReadBytes = + static_cast(pairWasmBytes.size()) + 500; + pairUploadRes.writeBytes = + static_cast(pairWasmBytes.size()) + 500; + auto pairUploadTx = mTxGenerator.createUploadWasmTransaction( + lm.getLastClosedLedgerNum() + 1, TxGenerator::ROOT_ACCOUNT_ID, + pairWasmBytes, pairCodeKey, std::nullopt, pairUploadRes); + closeLedger({pairUploadTx.second}); + + auto routerWasm = rust_bridge::get_apply_load_soroswap_router_wasm(); + xdr::opaque_vec<> routerWasmBytes; + routerWasmBytes.assign(routerWasm.data.begin(), routerWasm.data.end()); + LedgerKey routerCodeKey; + routerCodeKey.type(CONTRACT_CODE); + routerCodeKey.contractCode().hash = sha256(routerWasmBytes); + mSoroswapState.routerCodeKey = routerCodeKey; + + SorobanResources routerUploadRes; + routerUploadRes.instructions = 50'000'000; + routerUploadRes.diskReadBytes = + static_cast(routerWasmBytes.size()) + 500; + routerUploadRes.writeBytes = + static_cast(routerWasmBytes.size()) + 500; + auto routerUploadTx = mTxGenerator.createUploadWasmTransaction( + lm.getLastClosedLedgerNum() + 1, TxGenerator::ROOT_ACCOUNT_ID, + routerWasmBytes, routerCodeKey, std::nullopt, routerUploadRes); + closeLedger({routerUploadTx.second}); + + // Step 7: Deploy factory contract and initialize it + CLOG_INFO(Perf, "Soroswap setup: deploying factory"); + { + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto salt = sha256("soroswap factory salt"); + auto contractIDPreimage = + txtest::makeContractIDPreimage(*rootAccount, salt); + + SorobanResources createResources; + createResources.instructions = 50'000'000; + createResources.diskReadBytes = + static_cast(factoryWasmBytes.size()) + 10000; + createResources.writeBytes = 50000; + + auto createTx = txtest::makeSorobanCreateContractTx( + mApp, *rootAccount, contractIDPreimage, + txtest::makeWasmExecutable(factoryCodeKey.contractCode().hash), + createResources, + mTxGenerator.generateFee(std::nullopt, /* opsCnt */ 1)); + closeLedger({createTx}); + + auto instanceKey = + createTx->sorobanResources().footprint.readWrite.back(); + mSoroswapState.factoryInstanceKey = instanceKey; + mSoroswapState.factoryContractID = instanceKey.contractData().contract; + } + + // Initialize factory: initialize(setter, pair_wasm_hash) + CLOG_INFO(Perf, "Soroswap setup: initializing factory"); + { + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto setterVal = + makeAddressSCVal(makeAccountAddress(rootAccount->getPublicKey())); + + SCVal pairWasmHashVal(SCV_BYTES); + pairWasmHashVal.bytes().assign(pairCodeKey.contractCode().hash.begin(), + pairCodeKey.contractCode().hash.end()); + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mSoroswapState.factoryContractID; + ihf.invokeContract().functionName = "initialize"; + ihf.invokeContract().args = {setterVal, pairWasmHashVal}; + + SorobanResources resources; + resources.instructions = 50'000'000; + resources.diskReadBytes = + static_cast(factoryWasmBytes.size()) + 10000; + resources.writeBytes = 50000; + resources.footprint.readOnly.push_back(factoryCodeKey); + resources.footprint.readWrite.push_back( + mSoroswapState.factoryInstanceKey); + + // PairWasmHash persistent data key (factory.initialize writes this) + { + LedgerKey pairWasmHashDataKey(CONTRACT_DATA); + pairWasmHashDataKey.contractData().contract = + mSoroswapState.factoryContractID; + pairWasmHashDataKey.contractData().key = + txtest::makeVecSCVal({makeSymbolSCVal("PairWasmHash")}); + pairWasmHashDataKey.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.push_back(pairWasmHashDataKey); + } + + // Source account for auth + SorobanAuthorizedInvocation invocation; + invocation.function.type(SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + invocation.function.contractFn() = ihf.invokeContract(); + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, + invocation); + + auto resourceFee = + txtest::sorobanResourceFee(mApp, resources, 5000, 200); + resourceFee += 50'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *rootAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + closeLedger({tx}); + } + + // Step 8: Deploy router contract and initialize it + CLOG_INFO(Perf, "Soroswap setup: deploying router"); + { + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto salt = sha256("soroswap router salt"); + auto contractIDPreimage = + txtest::makeContractIDPreimage(*rootAccount, salt); + + SorobanResources createResources; + createResources.instructions = 50'000'000; + createResources.diskReadBytes = + static_cast(routerWasmBytes.size()) + 10000; + createResources.writeBytes = 50000; + + auto createTx = txtest::makeSorobanCreateContractTx( + mApp, *rootAccount, contractIDPreimage, + txtest::makeWasmExecutable(routerCodeKey.contractCode().hash), + createResources, + mTxGenerator.generateFee(std::nullopt, /* opsCnt */ 1)); + closeLedger({createTx}); + + auto instanceKey = + createTx->sorobanResources().footprint.readWrite.back(); + mSoroswapState.routerInstanceKey = instanceKey; + mSoroswapState.routerContractID = instanceKey.contractData().contract; + } + + // Initialize router: initialize(factory_address) + CLOG_INFO(Perf, "Soroswap setup: initializing router"); + { + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto factoryVal = makeAddressSCVal(mSoroswapState.factoryContractID); + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mSoroswapState.routerContractID; + ihf.invokeContract().functionName = "initialize"; + ihf.invokeContract().args = {factoryVal}; + + SorobanResources resources; + resources.instructions = 50'000'000; + resources.diskReadBytes = + static_cast(routerWasmBytes.size()) + 10000; + resources.writeBytes = 50000; + resources.footprint.readOnly.push_back(routerCodeKey); + resources.footprint.readWrite.push_back( + mSoroswapState.routerInstanceKey); + + SorobanAuthorizedInvocation invocation; + invocation.function.type(SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + invocation.function.contractFn() = ihf.invokeContract(); + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, + invocation); + + auto resourceFee = + txtest::sorobanResourceFee(mApp, resources, 5000, 200); + resourceFee += 50'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *rootAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + closeLedger({tx}); + } + + // Step 9: Create pairs explicitly via factory.create_pair(). + // We compute each pair's contract address deterministically so we can + // build the correct footprint before submission. + CLOG_INFO(Perf, "Soroswap setup: creating {} pairs via factory", numPairs); + for (uint32_t pairNum = 0; pairNum < numPairs; ++pairNum) + { + // Chain: pair pairNum uses tokens (pairNum, pairNum+1) + uint32_t i = pairNum; + uint32_t j = pairNum + 1; + + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + // Sort tokens as Soroswap factory does (token_0 < token_1) + SCAddress token0 = mSoroswapState.sacInstances[i].contractID; + SCAddress token1 = mSoroswapState.sacInstances[j].contractID; + if (token1 < token0) + std::swap(token0, token1); + + // Compute pair salt: sha256(xdr(ScVal(token0)) || + // xdr(ScVal(token1))). This matches Soroban SDK's + // Address::to_xdr() used in factory's pair.rs salt(). + auto token0Val = makeAddressSCVal(token0); + auto token1Val = makeAddressSCVal(token1); + auto xdr0 = xdr::xdr_to_opaque(token0Val); + auto xdr1 = xdr::xdr_to_opaque(token1Val); + std::vector saltInput(xdr0.begin(), xdr0.end()); + saltInput.insert(saltInput.end(), xdr1.begin(), xdr1.end()); + uint256 pairSalt = + sha256(ByteSlice(saltInput.data(), saltInput.size())); + + // Derive pair contract address deterministically + ContractIDPreimage pairPreimage(CONTRACT_ID_PREIMAGE_FROM_ADDRESS); + pairPreimage.fromAddress().address = mSoroswapState.factoryContractID; + pairPreimage.fromAddress().salt = pairSalt; + auto fullPreimage = txtest::makeFullContractIdPreimage( + mApp.getNetworkID(), pairPreimage); + Hash pairContractHash = xdrSha256(fullPreimage); + SCAddress pairAddress = txtest::makeContractAddress(pairContractHash); + LedgerKey pairInstanceKey = + txtest::makeContractInstanceKey(pairAddress); + + // Store pair info + SoroswapPairInfo pairInfo; + pairInfo.tokenAIndex = i; + pairInfo.tokenBIndex = j; + pairInfo.pairContractID = pairAddress; + mSoroswapState.pairs.push_back(pairInfo); + uint32_t pairIdx = + static_cast(mSoroswapState.pairs.size() - 1); + + // Build factory.create_pair(token_a, token_b) invocation + auto tokenAVal = + makeAddressSCVal(mSoroswapState.sacInstances[i].contractID); + auto tokenBVal = + makeAddressSCVal(mSoroswapState.sacInstances[j].contractID); + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mSoroswapState.factoryContractID; + ihf.invokeContract().functionName = "create_pair"; + ihf.invokeContract().args = {tokenAVal, tokenBVal}; + + SorobanResources resources; + resources.instructions = 100'000'000; + resources.diskReadBytes = 100'000; + resources.writeBytes = 100'000; + + // Read-only: factory code, pair Wasm code, + // PairWasmHash (persistent, read during deploy), + // SAC token instances (pair.initialize calls + // token_0.symbol() and token_1.symbol()) + resources.footprint.readOnly.push_back(factoryCodeKey); + resources.footprint.readOnly.push_back(pairCodeKey); + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[i].readOnlyKeys.at(0)); + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[j].readOnlyKeys.at(0)); + { + LedgerKey pairWasmHashKey(CONTRACT_DATA); + pairWasmHashKey.contractData().contract = + mSoroswapState.factoryContractID; + pairWasmHashKey.contractData().key = + txtest::makeVecSCVal({makeSymbolSCVal("PairWasmHash")}); + pairWasmHashKey.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readOnly.push_back(pairWasmHashKey); + } + + // Read-write: factory instance (TotalPairs update), + // new pair instance (created), + // PairAddressesByTokens (created), + // PairAddressesNIndexed(n) (created) + resources.footprint.readWrite.push_back( + mSoroswapState.factoryInstanceKey); + resources.footprint.readWrite.push_back(pairInstanceKey); + { + LedgerKey pairByTokensLK(CONTRACT_DATA); + pairByTokensLK.contractData().contract = + mSoroswapState.factoryContractID; + pairByTokensLK.contractData().key = txtest::makeVecSCVal( + {makeSymbolSCVal("PairAddressesByTokens"), + txtest::makeVecSCVal({token0Val, token1Val})}); + pairByTokensLK.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.push_back(pairByTokensLK); + } + { + LedgerKey nIndexedLK(CONTRACT_DATA); + nIndexedLK.contractData().contract = + mSoroswapState.factoryContractID; + nIndexedLK.contractData().key = + txtest::makeVecSCVal({makeSymbolSCVal("PairAddressesNIndexed"), + txtest::makeU32(pairIdx)}); + nIndexedLK.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.push_back(nIndexedLK); + } + + // factory.create_pair doesn't call require_auth + auto resourceFee = + txtest::sorobanResourceFee(mApp, resources, 20000, 200); + resourceFee += 500'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *rootAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + closeLedger({tx}); + } + + // Step 10: Add liquidity to all pairs via router.add_liquidity. + // Pairs already exist from step 9, so footprint is simpler. + CLOG_INFO(Perf, "Soroswap setup: adding liquidity to {} pairs", numPairs); + for (size_t pairIdx = 0; pairIdx < mSoroswapState.pairs.size(); ++pairIdx) + { + auto const& pair = mSoroswapState.pairs[pairIdx]; + uint32_t ti = pair.tokenAIndex; + uint32_t tj = pair.tokenBIndex; + + rootAccount = mTxGenerator.findAccount(TxGenerator::ROOT_ACCOUNT_ID, + lm.getLastClosedLedgerNum()); + rootAccount->loadSequenceNumber(); + + auto tokenAVal = + makeAddressSCVal(mSoroswapState.sacInstances[ti].contractID); + auto tokenBVal = + makeAddressSCVal(mSoroswapState.sacInstances[tj].contractID); + + int64_t desiredAmount = 100'000'000; + int64_t minAmount = 99'000'000; + + auto toVal = + makeAddressSCVal(makeAccountAddress(rootAccount->getPublicKey())); + + SCVal deadlineVal(SCV_U64); + deadlineVal.u64() = UINT64_MAX; + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mSoroswapState.routerContractID; + ihf.invokeContract().functionName = "add_liquidity"; + ihf.invokeContract().args = {tokenAVal, + tokenBVal, + txtest::makeI128(desiredAmount), + txtest::makeI128(desiredAmount), + txtest::makeI128(minAmount), + txtest::makeI128(minAmount), + toVal, + deadlineVal}; + + SorobanResources resources; + resources.instructions = 100'000'000; + resources.diskReadBytes = 100'000; + resources.writeBytes = 100'000; + + // Sort tokens for the factory PairAddressesByTokens lookup key + SCAddress sortedToken0 = mSoroswapState.sacInstances[ti].contractID; + SCAddress sortedToken1 = mSoroswapState.sacInstances[tj].contractID; + if (sortedToken1 < sortedToken0) + std::swap(sortedToken0, sortedToken1); + auto sortedToken0Val = makeAddressSCVal(sortedToken0); + auto sortedToken1Val = makeAddressSCVal(sortedToken1); + + auto pairAddrVal = makeAddressSCVal(pair.pairContractID); + + // Read-only: router code+instance, factory code+instance, + // PairAddressesByTokens, token SAC instances, pair code + resources.footprint.readOnly.push_back(routerCodeKey); + resources.footprint.readOnly.push_back( + mSoroswapState.routerInstanceKey); + resources.footprint.readOnly.push_back(factoryCodeKey); + resources.footprint.readOnly.push_back( + mSoroswapState.factoryInstanceKey); + { + LedgerKey pairByTokensLK(CONTRACT_DATA); + pairByTokensLK.contractData().contract = + mSoroswapState.factoryContractID; + pairByTokensLK.contractData().key = txtest::makeVecSCVal( + {makeSymbolSCVal("PairAddressesByTokens"), + txtest::makeVecSCVal({sortedToken0Val, sortedToken1Val})}); + pairByTokensLK.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readOnly.push_back(pairByTokensLK); + } + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[ti].readOnlyKeys.at(0)); + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[tj].readOnlyKeys.at(0)); + resources.footprint.readOnly.push_back(pairCodeKey); + + // Read-write: root account, trustlines, token balances, + // pair instance, LP token balance + LedgerKey rootKey(ACCOUNT); + rootKey.account().accountID = rootAccount->getPublicKey(); + resources.footprint.readWrite.emplace_back(rootKey); + + // Note: root is the asset issuer, so no trustline entries are + // needed — issuers have unlimited supply and no trustlines. + + // Token A Balance[pair] + resources.footprint.readWrite.emplace_back(makeSACBalanceKey( + mSoroswapState.sacInstances[ti].contractID, pairAddrVal)); + // Token B Balance[pair] + resources.footprint.readWrite.emplace_back(makeSACBalanceKey( + mSoroswapState.sacInstances[tj].contractID, pairAddrVal)); + // Pair contract instance (RW - modified during deposit) + resources.footprint.readWrite.emplace_back( + txtest::makeContractInstanceKey(pair.pairContractID)); + // Pair LP token Balance[root] (minted during first deposit) + resources.footprint.readWrite.emplace_back( + makeSACBalanceKey(pair.pairContractID, toVal)); + // Pair LP token Balance[pair_contract] (MINIMUM_LIQUIDITY minted + // to pair itself during first deposit) + resources.footprint.readWrite.emplace_back( + makeSACBalanceKey(pair.pairContractID, pairAddrVal)); + + // Auth: root authorizes add_liquidity which sub-invokes + // token_a.transfer and token_b.transfer + SorobanAuthorizedInvocation rootInvocation; + rootInvocation.function.type( + SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + rootInvocation.function.contractFn() = ihf.invokeContract(); + + // Sub-invocation: token_a.transfer(root, pair, amount) + SorobanAuthorizedInvocation transferAInvocation; + transferAInvocation.function.type( + SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + transferAInvocation.function.contractFn().contractAddress = + mSoroswapState.sacInstances[ti].contractID; + transferAInvocation.function.contractFn().functionName = "transfer"; + transferAInvocation.function.contractFn().args = { + toVal, pairAddrVal, txtest::makeI128(desiredAmount)}; + + // Sub-invocation: token_b.transfer(root, pair, amount) + SorobanAuthorizedInvocation transferBInvocation; + transferBInvocation.function.type( + SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + transferBInvocation.function.contractFn().contractAddress = + mSoroswapState.sacInstances[tj].contractID; + transferBInvocation.function.contractFn().functionName = "transfer"; + transferBInvocation.function.contractFn().args = { + toVal, pairAddrVal, txtest::makeI128(desiredAmount)}; + + rootInvocation.subInvocations.push_back(transferAInvocation); + rootInvocation.subInvocations.push_back(transferBInvocation); + + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, + rootInvocation); + + auto resourceFee = + txtest::sorobanResourceFee(mApp, resources, 20000, 200); + resourceFee += 500'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *rootAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + closeLedger({tx}); + } + + // Initialize swap counters for alternating direction + mSoroswapSwapCounters.resize(numPairs, 0); + + int64_t totalSetupTxs = + mTxGenerator.getApplySorobanSuccess().count() - initialSuccessCount; + // N SAC creates + 3 Wasm uploads + factory create + factory init + // + router create + router init + numPairs create_pair + // + numPairs add_liquidity + int64_t expectedSorobanTxs = numTokens + 3 + 2 + 2 + 2 * numPairs; + CLOG_INFO(Perf, + "Soroswap setup complete: {} soroban txs (expected {}), {} " + "failures", + totalSetupTxs, expectedSorobanTxs, + mTxGenerator.getApplySorobanFailure().count()); + releaseAssert(mTxGenerator.getApplySorobanFailure().count() == 0); } + +void +ApplyLoad::generateSoroswapSwaps(std::vector& txs, + uint32_t count) +{ + auto& lm = mApp.getLedgerManager(); + uint32_t numPairs = mSoroswapState.pairs.size(); + releaseAssert(numPairs > 0); + + for (uint32_t i = 0; i < count; ++i) + { + // Round-robin across pairs for parallelism + uint32_t pairIndex = i % numPairs; + auto const& pair = mSoroswapState.pairs[pairIndex]; + + // Unique account per tx (skip account 0 = root/issuer) + uint32_t accountIdx = i + 1; + + // Alternate swap direction per pair to keep pools balanced + bool swapAForB = (mSoroswapSwapCounters[pairIndex] % 2 == 0); + mSoroswapSwapCounters[pairIndex]++; + + uint32_t tokenInIdx = swapAForB ? pair.tokenAIndex : pair.tokenBIndex; + uint32_t tokenOutIdx = swapAForB ? pair.tokenBIndex : pair.tokenAIndex; + + auto fromAccount = + mTxGenerator.findAccount(accountIdx, lm.getLastClosedLedgerNum()); + fromAccount->loadSequenceNumber(); + + auto fromVal = + makeAddressSCVal(makeAccountAddress(fromAccount->getPublicKey())); + + // Build path: [token_in, token_out] + auto tokenInVal = makeAddressSCVal( + mSoroswapState.sacInstances[tokenInIdx].contractID); + auto tokenOutVal = makeAddressSCVal( + mSoroswapState.sacInstances[tokenOutIdx].contractID); + + SCVal pathVec(SCV_VEC); + pathVec.vec().activate(); + pathVec.vec()->push_back(tokenInVal); + pathVec.vec()->push_back(tokenOutVal); + + int64_t swapAmount = 100; + SCVal deadlineVal(SCV_U64); + deadlineVal.u64() = UINT64_MAX; + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = mSoroswapState.routerContractID; + ihf.invokeContract().functionName = "swap_exact_tokens_for_tokens"; + ihf.invokeContract().args = { + txtest::makeI128(swapAmount), // amount_in + txtest::makeI128(0), // amount_out_min + pathVec, // path + fromVal, // to + deadlineVal // deadline + }; + + // Footprint + SorobanResources resources; + resources.instructions = TxGenerator::SOROSWAP_SWAP_TX_INSTRUCTIONS; + resources.diskReadBytes = 5000; + resources.writeBytes = 5000; + + // Read-only: router instance, token_in SAC instance, + // token_out SAC instance, router code, pair code + resources.footprint.readOnly.push_back( + mSoroswapState.routerInstanceKey); + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[tokenInIdx].readOnlyKeys.at(0)); + resources.footprint.readOnly.push_back( + mSoroswapState.sacInstances[tokenOutIdx].readOnlyKeys.at(0)); + resources.footprint.readOnly.push_back(mSoroswapState.routerCodeKey); + resources.footprint.readOnly.push_back(mSoroswapState.pairCodeKey); + + // Read-write: user trustline(A), user trustline(B), + // Balance[pair] for token_in, Balance[pair] for + // token_out, pair instance + resources.footprint.readWrite.emplace_back(makeTrustlineKey( + fromAccount->getPublicKey(), mSoroswapState.assets[tokenInIdx])); + resources.footprint.readWrite.emplace_back(makeTrustlineKey( + fromAccount->getPublicKey(), mSoroswapState.assets[tokenOutIdx])); + + auto pairAddrVal = makeAddressSCVal(pair.pairContractID); + // Balance[pair] for token_in + resources.footprint.readWrite.emplace_back(makeSACBalanceKey( + mSoroswapState.sacInstances[tokenInIdx].contractID, pairAddrVal)); + // Balance[pair] for token_out + resources.footprint.readWrite.emplace_back(makeSACBalanceKey( + mSoroswapState.sacInstances[tokenOutIdx].contractID, pairAddrVal)); + // Pair contract instance (RW - modified during swap) + resources.footprint.readWrite.emplace_back( + txtest::makeContractInstanceKey(pair.pairContractID)); + + // Auth: source_account authorizes swap_exact_tokens_for_tokens + // which sub-invokes token_in.transfer(user, pair, amount) + SorobanAuthorizedInvocation rootInvocation; + rootInvocation.function.type( + SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + rootInvocation.function.contractFn() = ihf.invokeContract(); + + SorobanAuthorizedInvocation transferInvocation; + transferInvocation.function.type( + SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + transferInvocation.function.contractFn().contractAddress = + mSoroswapState.sacInstances[tokenInIdx].contractID; + transferInvocation.function.contractFn().functionName = "transfer"; + transferInvocation.function.contractFn().args = { + fromVal, pairAddrVal, txtest::makeI128(swapAmount)}; + rootInvocation.subInvocations.push_back(transferInvocation); + + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, + rootInvocation); + + auto resourceFee = + txtest::sorobanResourceFee(mApp, resources, 1000, 200); + resourceFee += 5'000'000; + + auto tx = txtest::sorobanTransactionFrameFromOps( + mApp.getNetworkID(), *fromAccount, {op}, {}, resources, + mTxGenerator.generateFee(std::nullopt, 1), resourceFee); + txs.push_back(tx); + } + + LedgerReadView ls(mApp); + auto diag = DiagnosticEventManager::createDisabled(); + for (auto const& tx : txs) + { + releaseAssert(tx->checkValid(mApp.getAppConnector(), ls, 0, 0, 0, diag) + ->isSuccess()); + } } + +} // namespace stellar diff --git a/src/simulation/ApplyLoad.h b/src/simulation/ApplyLoad.h index fa460e9590..d16c200f44 100644 --- a/src/simulation/ApplyLoad.h +++ b/src/simulation/ApplyLoad.h @@ -6,30 +6,16 @@ #include "main/Application.h" #include "simulation/TxGenerator.h" -#include "test/TestAccount.h" - -#include "medida/meter.h" namespace stellar { -enum class ApplyLoadMode -{ - // Generate load within the configured ledger limits. - LIMIT_BASED, - // Generate load that finds max ledger limits for the 'model' transaction. - FIND_LIMITS_FOR_MODEL_TX, - // Generate load that only finds max TPS for the cheap operations (SAC - // transfers), ignoring ledger limits. - MAX_SAC_TPS -}; - class ApplyLoad { public: - ApplyLoad(Application& app, ApplyLoadMode mode); + explicit ApplyLoad(Application& app); - // Execute the benchmark according to the mode specified in the constructor. + // Execute the benchmark according to the mode specified in config. void execute(); // Returns the % of transactions that succeeded during apply time. The range @@ -61,18 +47,14 @@ class ApplyLoad static uint32_t calculateRequiredHotArchiveEntries(ApplyLoadMode mode, Config const& cfg); - // The target time to close a ledger when running in MAX_SAC_TPS mode must - // be a multiple of TARGET_CLOSE_TIME_STEP_MS. - static uint32_t const TARGET_CLOSE_TIME_STEP_MS = 50; - private: void setup(); - - void setupAccounts(); void setupUpgradeContract(); void setupLoadContract(); void setupXLMContract(); void setupBatchTransferContracts(); + void setupTokenContract(); + void setupSoroswapContracts(); void setupBucketList(); // Runs for `execute() in `ApplyLoadMode::LIMIT_BASED` mode. @@ -102,26 +84,54 @@ class ApplyLoad // APPLY_LOAD_TARGET_CLOSE_TIME_MS. void findMaxSacTps(); - // Run iterations at the given TPS. Reports average time over all runs, in - // milliseconds. - double benchmarkSacTps(uint32_t targetTps); + // Runs for `execute() in `ApplyLoadMode::BENCHMARK_MODEL_TX` mode. + // Benchmarks APPLY_LOAD_NUM_LEDGERS ledgers containing + // APPLY_LOAD_MAX_SOROBAN_TX_COUNT model transactions each and outputs + // close-time summary statistics. + void benchmarkModelTx(); + // Run a single ledger benchmark at the given TPS. Returns the close time + // in milliseconds for that ledger. + double benchmarkModelTxTpsSingleLedger(ApplyLoadModelTx modelTx, + uint32_t txsPerLedger); + + // Run a single ledger benchmark for the model transaction mode. Returns + // the close time in milliseconds for that ledger. // Fills up a list of transactions with // SOROBAN_TRANSACTION_QUEUE_SIZE_MULTIPLIER * the max ledger resources - // specified in the ApplyLoad constructor, create a TransactionSet out of + // specified in config, create a TransactionSet out of // those transactions, and then close a ledger with that TransactionSet. The // generated transactions are generated using the LOADGEN_* config // parameters. - void benchmarkLimitsIteration(); + double benchmarkLimitsIteration(); + + // Generates APPLY_LOAD_CLASSIC_TXS_PER_LEDGER classic payment TXs + // using accounts starting at startAccountIdx. + void generateClassicPayments(std::vector& txs, + uint32_t startAccountIdx); // Generates the given number of native asset SAC payment TXs with no // conflicts. void generateSacPayments(std::vector& txs, uint32_t count); + // Generates the given number of custom token transfer TXs between genesis + // accounts with no conflicts. + void generateTokenTransfers(std::vector& txs, + uint32_t count); + + // Generates the given number of Soroswap swap TXs across pairs with no + // conflicts. + void generateSoroswapSwaps(std::vector& txs, + uint32_t count); + // Calculate instructions per transaction based on batch size uint64_t calculateInstructionsPerTx() const; + // Convert benchmark model SAC transfer count into number of tx envelopes + // to execute, taking APPLY_LOAD_BATCH_SAC_COUNT into account. + uint32_t calculateBenchmarkModelTxCount() const; + // Iterate over all available accounts to make sure they are loaded into the // BucketListDB cache. Note that this should be run every time an account // entry is modified. @@ -147,7 +157,7 @@ class ApplyLoad Application& mApp; ApplyLoadMode mMode; - TxGenerator::TestAccountPtr mRoot; + ApplyLoadModelTx mModelTx; uint32_t mNumAccounts; uint32_t mTotalHotArchiveEntries; @@ -175,8 +185,51 @@ class ApplyLoad size_t mDataEntryCount = 0; size_t mDataEntrySize = 0; + // Used to generate custom token transfer transactions + TxGenerator::ContractInstance mTokenInstance; + + // Soroswap AMM benchmark state + struct SoroswapPairInfo + { + SCAddress pairContractID; + uint32_t tokenAIndex; + uint32_t tokenBIndex; + }; + + struct SoroswapState + { + SCAddress factoryContractID; + SCAddress routerContractID; + + std::vector pairs; + std::vector sacInstances; + + LedgerKey routerCodeKey; + LedgerKey pairCodeKey; + LedgerKey factoryCodeKey; + + LedgerKey routerInstanceKey; + LedgerKey factoryInstanceKey; + + std::vector assets; + uint32_t numTokens = 0; + }; + SoroswapState mSoroswapState; + + // Counter for alternating swap direction per pair + std::vector mSoroswapSwapCounters; + // Counter for generating unique destination addresses for SAC payments uint32_t mDestCounter = 0; }; +#ifdef BUILD_TESTS +std::pair noisyBinarySearch( + std::function const& f, double targetA, uint32_t xMin, + uint32_t xMax, double confidence, uint32_t xTolerance, + size_t maxSamplesPerPoint, + std::function const& prepareIteration = nullptr, + std::function const& iterationResult = nullptr); +#endif + } diff --git a/src/simulation/LoadGenerator.cpp b/src/simulation/LoadGenerator.cpp index d288e0c3b5..f9e107f9d6 100644 --- a/src/simulation/LoadGenerator.cpp +++ b/src/simulation/LoadGenerator.cpp @@ -1119,16 +1119,16 @@ LoadGenerator::checkSorobanStateSynced(Application& app, } std::vector result; - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); for (auto const& lk : mContractInstanceKeys) { - if (!lsg.load(lk)) + if (!lrv.load(lk)) { result.emplace_back(lk); } } - if (mCodeKey && !lsg.load(*mCodeKey)) + if (mCodeKey && !lrv.load(*mCodeKey)) { result.emplace_back(*mCodeKey); } @@ -1417,8 +1417,8 @@ LoadGenerator::execute(TransactionFrameBasePtr txf, LoadGenMode mode, // Skip certain checks for pregenerated transactions bool isPregeneratedTx = (mode == LoadGenMode::PAY_PREGENERATED); - auto addResult = - mApp.getHerder().recvTransaction(txf, true, isPregeneratedTx); + auto addResult = mApp.getHerder().recvTransaction( + txf, true, /*force=*/false, /*isLoadgenTx=*/isPregeneratedTx); if (addResult.code != TransactionQueue::AddResultCode::ADD_STATUS_PENDING) { @@ -1551,6 +1551,52 @@ GeneratedLoadConfig::copySorobanNetworkConfigToUpgradeConfig( updatedConfig.nominationTimeoutInitialMilliseconds(); upgradeCfg.nominationTimeoutIncrementMilliseconds = updatedConfig.nominationTimeoutIncrementMilliseconds(); + + // Compute frozen ledger keys delta + auto const& baseKeys = baseConfig.frozenLedgerKeys(); + auto const& updatedKeys = updatedConfig.frozenLedgerKeys(); + if (baseKeys != updatedKeys) + { + FrozenLedgerKeysDelta delta; + for (auto const& key : updatedKeys) + { + if (baseKeys.find(key) == baseKeys.end()) + { + delta.keysToFreeze.emplace_back(xdr::xdr_to_opaque(key)); + } + } + for (auto const& key : baseKeys) + { + if (updatedKeys.find(key) == updatedKeys.end()) + { + delta.keysToUnfreeze.emplace_back(xdr::xdr_to_opaque(key)); + } + } + upgradeCfg.frozenLedgerKeysDelta = delta; + } + + // Compute freeze bypass tx hashes delta + auto const& baseBypassTxs = baseConfig.freezeBypassTxs(); + auto const& updatedBypassTxs = updatedConfig.freezeBypassTxs(); + if (baseBypassTxs != updatedBypassTxs) + { + FreezeBypassTxsDelta delta; + for (auto const& txHash : updatedBypassTxs) + { + if (baseBypassTxs.find(txHash) == baseBypassTxs.end()) + { + delta.addTxs.emplace_back(txHash); + } + } + for (auto const& txHash : baseBypassTxs) + { + if (updatedBypassTxs.find(txHash) == updatedBypassTxs.end()) + { + delta.removeTxs.emplace_back(txHash); + } + } + upgradeCfg.freezeBypassTxsDelta = delta; + } } GeneratedLoadConfig diff --git a/src/simulation/TxGenerator.cpp b/src/simulation/TxGenerator.cpp index c909218edf..a5a5abb511 100644 --- a/src/simulation/TxGenerator.cpp +++ b/src/simulation/TxGenerator.cpp @@ -48,11 +48,11 @@ sampleDiscrete(std::vector const& values, uint64_t footprintSize(Application& app, xdr::xvector const& keys) { - LedgerSnapshot lsg(app); + LedgerReadView lrv(app); uint64_t total = 0; for (auto const& key : keys) { - auto entry = lsg.load(key); + auto entry = lrv.load(key); if (entry) { total += xdr::xdr_size(entry.current()); @@ -86,8 +86,8 @@ TxGenerator::updateMinBalance() bool TxGenerator::isLive(LedgerKey const& lk, uint32_t ledgerNum) const { - LedgerSnapshot lsg(mApp); - auto ttlEntryPtr = lsg.load(getTTLKey(lk)); + LedgerReadView lrv(mApp); + auto ttlEntryPtr = lrv.load(getTTLKey(lk)); return ttlEntryPtr && stellar::isLive(ttlEntryPtr.current(), ledgerNum); } @@ -127,8 +127,8 @@ TxGenerator::generateFee(std::optional maxGeneratedFeeRate, bool TxGenerator::loadAccount(TestAccount& account) { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.getAccount(account.getPublicKey()); + LedgerReadView lrv(mApp); + auto const entry = lrv.getAccount(account.getPublicKey()); if (!entry) { return false; @@ -811,6 +811,79 @@ TxGenerator::invokeSACPayment(uint32_t ledgerNum, uint64_t fromAccountId, return std::make_pair(fromAccount, tx); } +std::pair +TxGenerator::invokeTokenTransfer(uint32_t ledgerNum, uint64_t fromAccountId, + uint64_t toAccountId, + ContractInstance const& instance, + uint64_t amount, + std::optional maxGeneratedFeeRate) +{ + auto fromAccount = findAccount(fromAccountId, ledgerNum); + fromAccount->loadSequenceNumber(); + auto toAccount = findAccount(toAccountId, ledgerNum); + + SCVal fromVal(SCV_ADDRESS); + fromVal.address() = makeAccountAddress(fromAccount->getPublicKey()); + + SCVal toVal(SCV_ADDRESS); + toVal.address() = makeAccountAddress(toAccount->getPublicKey()); + + Operation op; + op.body.type(INVOKE_HOST_FUNCTION); + auto& ihf = op.body.invokeHostFunctionOp().hostFunction; + ihf.type(HOST_FUNCTION_TYPE_INVOKE_CONTRACT); + ihf.invokeContract().contractAddress = instance.contractID; + ihf.invokeContract().functionName = "transfer"; + + ihf.invokeContract().args = {fromVal, toVal, makeI128(amount)}; + + SorobanResources resources; + resources.writeBytes = 5000; + resources.diskReadBytes = 5000; + resources.instructions = CUSTOM_TOKEN_TX_INSTRUCTIONS; + resources.footprint.readOnly = instance.readOnlyKeys; + + // From's balance entry in token contract + { + LedgerKey balanceKey(CONTRACT_DATA); + balanceKey.contractData().contract = instance.contractID; + balanceKey.contractData().key = + makeVecSCVal({makeSymbolSCVal("Balance"), fromVal}); + balanceKey.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.emplace_back(balanceKey); + } + + // To's balance entry in token contract + { + LedgerKey balanceKey(CONTRACT_DATA); + balanceKey.contractData().contract = instance.contractID; + balanceKey.contractData().key = + makeVecSCVal({makeSymbolSCVal("Balance"), toVal}); + balanceKey.contractData().durability = + ContractDataDurability::PERSISTENT; + resources.footprint.readWrite.emplace_back(balanceKey); + } + + SorobanAuthorizedInvocation invocation; + invocation.function.type(SOROBAN_AUTHORIZED_FUNCTION_TYPE_CONTRACT_FN); + invocation.function.contractFn() = + op.body.invokeHostFunctionOp().hostFunction.invokeContract(); + + SorobanCredentials credentials(SOROBAN_CREDENTIALS_SOURCE_ACCOUNT); + op.body.invokeHostFunctionOp().auth.emplace_back(credentials, invocation); + + auto resourceFee = sorobanResourceFee(mApp, resources, 1000, 200); + resourceFee += 5'000'000; + + auto tx = sorobanTransactionFrameFromOps(mApp.getNetworkID(), *fromAccount, + {op}, {}, resources, + generateFee(maxGeneratedFeeRate, + /* opsCnt */ 1), + resourceFee); + return std::make_pair(fromAccount, tx); +} + std::map const& TxGenerator::getAccounts() { @@ -871,7 +944,7 @@ TxGenerator::getConfigUpgradeSetFromLoadConfig( { xdr::xvector updatedEntries; - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); for (auto t : xdr::xdr_traits::enum_values()) { auto type = static_cast(t); @@ -880,7 +953,37 @@ TxGenerator::getConfigUpgradeSetFromLoadConfig( continue; } - auto entryPtr = lsg.load(configSettingKey(type)); + // The delta has no stored ledger entry — construct it from the + // upgrade config if present, then move on. + if (type == CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA) + { + if (upgradeCfg.frozenLedgerKeysDelta.has_value()) + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID( + CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + deltaEntry.frozenLedgerKeysDelta() = + *upgradeCfg.frozenLedgerKeysDelta; + updatedEntries.emplace_back(deltaEntry); + } + continue; + } + + if (type == CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + if (upgradeCfg.freezeBypassTxsDelta.has_value()) + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID( + CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA); + deltaEntry.freezeBypassTxsDelta() = + *upgradeCfg.freezeBypassTxsDelta; + updatedEntries.emplace_back(deltaEntry); + } + continue; + } + + auto entryPtr = lrv.load(configSettingKey(type)); // This could happen if we have not yet upgraded if ((t == CONFIG_SETTING_CONTRACT_PARALLEL_COMPUTE_V0 || t == CONFIG_SETTING_CONTRACT_LEDGER_COST_EXT_V0 || diff --git a/src/simulation/TxGenerator.h b/src/simulation/TxGenerator.h index 9de4887a4e..dacd3d6743 100644 --- a/src/simulation/TxGenerator.h +++ b/src/simulation/TxGenerator.h @@ -87,6 +87,11 @@ struct SorobanUpgradeConfig std::optional nominationTimeoutIncrementMilliseconds{}; std::optional ballotTimeoutInitialMilliseconds{}; std::optional ballotTimeoutIncrementMilliseconds{}; + + // Frozen ledger keys delta + std::optional frozenLedgerKeysDelta{}; + // Freeze bypass tx hashes delta + std::optional freezeBypassTxsDelta{}; }; class TxGenerator @@ -95,6 +100,10 @@ class TxGenerator // Instructions per SAC transaction static constexpr uint64_t SAC_TX_INSTRUCTIONS = 250'000; static constexpr uint64_t BATCH_TRANSFER_TX_INSTRUCTIONS = 500'000; + // Instructions per custom token transfer transaction + static constexpr uint64_t CUSTOM_TOKEN_TX_INSTRUCTIONS = 5'000'000; + // Instructions per Soroswap swap transaction + static constexpr uint64_t SOROSWAP_SWAP_TX_INSTRUCTIONS = 5'000'000; static constexpr uint32_t SOROBAN_LOAD_V2_EVENT_SIZE_BYTES = 80; // Special account ID to represent the root account @@ -181,6 +190,12 @@ class TxGenerator ContractInstance const& instance, uint64_t amount, std::optional maxGeneratedFeeRate); + std::pair + invokeTokenTransfer(uint32_t ledgerNum, uint64_t fromAccountId, + uint64_t toAccountId, ContractInstance const& instance, + uint64_t amount, + std::optional maxGeneratedFeeRate); + std::pair invokeBatchTransfer(uint32_t ledgerNum, uint64_t fromAccountId, ContractInstance const& batchTransferInstance, diff --git a/src/simulation/test/LoadGeneratorTests.cpp b/src/simulation/test/LoadGeneratorTests.cpp index 148bcfd693..1d1bc7753b 100644 --- a/src/simulation/test/LoadGeneratorTests.cpp +++ b/src/simulation/test/LoadGeneratorTests.cpp @@ -6,8 +6,8 @@ #include "crypto/SHA.h" #include "crypto/SecretKey.h" #include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "main/Config.h" -#include "scp/QuorumSetUtils.h" #include "simulation/ApplyLoad.h" #include "simulation/LoadGenerator.h" #include "simulation/Topologies.h" @@ -17,7 +17,9 @@ #include "util/Math.h" #include "util/MetricsRegistry.h" #include "util/finally.h" +#include #include +#include using namespace stellar; @@ -880,11 +882,13 @@ TEST_CASE("Upgrade setup with metrics reset", "[loadgen]") TEST_CASE("apply load", "[loadgen][applyload][acceptance]") { auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::LIMIT_BASED; cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; cfg.USE_CONFIG_FOR_GENESIS = true; cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; cfg.MANUAL_CLOSE = true; cfg.ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 10000; cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; @@ -944,7 +948,7 @@ TEST_CASE("apply load", "[loadgen][applyload][acceptance]") VirtualClock clock(VirtualClock::REAL_TIME); auto app = createTestApplication(clock, cfg); - ApplyLoad al(*app, ApplyLoadMode::LIMIT_BASED); + ApplyLoad al(*app); // Sample a few indices to verify hot archive is properly initialized uint32_t expectedArchivedEntries = @@ -954,16 +958,14 @@ TEST_CASE("apply load", "[loadgen][applyload][acceptance]") expectedArchivedEntries - 1}; std::set sampleKeys; - auto hotArchive = app->getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto snap = app->getLedgerManager().copyLedgerStateSnapshot(); for (auto idx : sampleIndices) { sampleKeys.insert(ApplyLoad::getKeyForArchivedEntry(idx)); } - auto sampleEntries = hotArchive->loadKeys(sampleKeys); + auto sampleEntries = snap.loadArchiveKeys(sampleKeys); REQUIRE(sampleEntries.size() == sampleKeys.size()); al.execute(); @@ -975,17 +977,19 @@ TEST_CASE("apply load find max limits for model tx", "[loadgen][applyload][acceptance]") { auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX; cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; cfg.USE_CONFIG_FOR_GENESIS = true; cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; cfg.MANUAL_CLOSE = true; cfg.ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING = true; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 10000; // Also generate that many classic simple payments. cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; - // Close 3 ledgers per iteration. - cfg.APPLY_LOAD_NUM_LEDGERS = 3; + // Close 30 ledgers per iteration. + cfg.APPLY_LOAD_NUM_LEDGERS = 30; // The target close time is 500ms. cfg.APPLY_LOAD_TARGET_CLOSE_TIME_MS = 500; @@ -1026,35 +1030,38 @@ TEST_CASE("apply load find max limits for model tx", VirtualClock clock(VirtualClock::REAL_TIME); auto app = createTestApplication(clock, cfg); - ApplyLoad al(*app, ApplyLoadMode::FIND_LIMITS_FOR_MODEL_TX); + ApplyLoad al(*app); al.execute(); REQUIRE(1.0 - al.successRate() < std::numeric_limits::epsilon()); } -TEST_CASE("basic MAX_SAC_TPS functionality", +TEST_CASE("apply load find max SAC TPS", "[loadgen][applyload][soroban][acceptance]") { auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::MAX_SAC_TPS; cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; cfg.USE_CONFIG_FOR_GENESIS = true; cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; cfg.MANUAL_CLOSE = true; cfg.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 10000; // Configure test parameters for MAX_SAC_TPS mode cfg.APPLY_LOAD_TARGET_CLOSE_TIME_MS = 1500; cfg.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 2; cfg.APPLY_LOAD_MAX_SAC_TPS_MIN_TPS = 1; - cfg.APPLY_LOAD_MAX_SAC_TPS_MAX_TPS = 1000; - cfg.APPLY_LOAD_NUM_LEDGERS = 10; + cfg.APPLY_LOAD_MAX_SAC_TPS_MAX_TPS = 1500; + cfg.APPLY_LOAD_NUM_LEDGERS = 30; cfg.APPLY_LOAD_BATCH_SAC_COUNT = 2; + cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; VirtualClock clock(VirtualClock::REAL_TIME); auto app = createTestApplication(clock, cfg); - ApplyLoad al(*app, ApplyLoadMode::MAX_SAC_TPS); + ApplyLoad al(*app); // Run the MAX_SAC_TPS test al.execute(); @@ -1069,3 +1076,511 @@ TEST_CASE("basic MAX_SAC_TPS functionality", cfg.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS); REQUIRE(successCountMetric.count() > 200); } + +TEST_CASE("apply load benchmark model tx", + "[loadgen][applyload][soroban][acceptance]") +{ + auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::BENCHMARK_MODEL_TX; + cfg.APPLY_LOAD_MODEL_TX = ApplyLoadModelTx::SAC; + cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; + cfg.USE_CONFIG_FOR_GENESIS = true; + cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; + cfg.MANUAL_CLOSE = true; + cfg.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 2000; + + cfg.APPLY_LOAD_NUM_LEDGERS = 10; + cfg.APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 500; + cfg.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 2; + cfg.APPLY_LOAD_BATCH_SAC_COUNT = 2; + cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; + + VirtualClock clock(VirtualClock::REAL_TIME); + auto app = createTestApplication(clock, cfg); + + ApplyLoad al(*app); + + al.execute(); + + REQUIRE(1.0 - al.successRate() < std::numeric_limits::epsilon()); + + auto& successCountMetric = + app->getMetrics().NewCounter({"ledger", "apply-soroban", "success"}); + REQUIRE(successCountMetric.count() > 0); +} + +TEST_CASE("apply load benchmark custom token", + "[loadgen][applyload][soroban][acceptance]") +{ + auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::BENCHMARK_MODEL_TX; + cfg.APPLY_LOAD_MODEL_TX = ApplyLoadModelTx::CUSTOM_TOKEN; + cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = 1000; + cfg.USE_CONFIG_FOR_GENESIS = true; + cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; + cfg.MANUAL_CLOSE = true; + cfg.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 5000; + cfg.ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = true; + + cfg.APPLY_LOAD_NUM_LEDGERS = 10; + cfg.APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 500; + cfg.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 2; + cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; + + VirtualClock clock(VirtualClock::REAL_TIME); + auto app = createTestApplication(clock, cfg); + + ApplyLoad al(*app); + + al.execute(); + + REQUIRE(1.0 - al.successRate() < std::numeric_limits::epsilon()); + + auto& successCountMetric = + app->getMetrics().NewCounter({"ledger", "apply-soroban", "success"}); + REQUIRE(successCountMetric.count() > 0); +} + +TEST_CASE("apply load benchmark soroswap", + "[loadgen][applyload][soroban][acceptance]") +{ + auto cfg = getTestConfig(); + cfg.APPLY_LOAD_MODE = ApplyLoadMode::BENCHMARK_MODEL_TX; + cfg.APPLY_LOAD_MODEL_TX = ApplyLoadModelTx::SOROSWAP; + cfg.USE_CONFIG_FOR_GENESIS = true; + cfg.LEDGER_PROTOCOL_VERSION = Config::CURRENT_LEDGER_PROTOCOL_VERSION; + cfg.MANUAL_CLOSE = true; + cfg.IGNORE_MESSAGE_LIMITS_FOR_TESTING = true; + cfg.GENESIS_TEST_ACCOUNT_COUNT = 10000; + cfg.ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = true; + + cfg.APPLY_LOAD_NUM_LEDGERS = 10; + cfg.APPLY_LOAD_MAX_SOROBAN_TX_COUNT = 1000; + cfg.APPLY_LOAD_LEDGER_MAX_DEPENDENT_TX_CLUSTERS = 4; + cfg.APPLY_LOAD_CLASSIC_TXS_PER_LEDGER = 100; + + VirtualClock clock(VirtualClock::REAL_TIME); + auto app = createTestApplication(clock, cfg); + + ApplyLoad al(*app); + + al.execute(); + + REQUIRE(1.0 - al.successRate() < std::numeric_limits::epsilon()); + + auto& successCountMetric = + app->getMetrics().NewCounter({"ledger", "apply-soroban", "success"}); + REQUIRE(successCountMetric.count() > 0); +} + +TEST_CASE("noisy binary search", "[applyload]") +{ + std::mt19937 rng(12345); // Fixed seed for reproducibility + + // Helper to create a noisy monotone function with normally distributed + // noise. + // meanFunc: function that computes the true mean at x + // stddevFunc: function that computes the standard deviation at x + auto makeNoisyMonotone = [&rng](std::function meanFunc, + std::function stddevFunc) + -> std::function { + return [&rng, meanFunc, stddevFunc](uint32_t x) { + double mean = meanFunc(x); + double stddev = stddevFunc(x); + std::normal_distribution dist(mean, stddev); + return dist(rng); + }; + }; + + // Mean functions: linear, sqrt, x^2 + auto linearMean = [](uint32_t x) { return static_cast(x); }; + auto sqrtMean = [](uint32_t x) { + return std::sqrt(static_cast(x)); + }; + auto quadraticMean = [](uint32_t x) { + return static_cast(x) * static_cast(x); + }; + + // Variance functions: constant, proportional to x + auto constStddev = [](uint32_t) { return 50.0; }; + auto proportionalStddev = [](uint32_t x) { + return std::max(1.0, static_cast(x) * 0.1); + }; + + double const confidence = 0.99; + size_t const maxSamples = 1000; + + SECTION("linear mean, constant variance") + { + // Search for x where E[f(x)] = target + uint32_t const trueX = 500; + double const target = linearMean(trueX); + uint32_t const xMin = 100; + uint32_t const xMax = 1000; + uint32_t const tolerance = 50; + + auto f = makeNoisyMonotone(linearMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("linear mean, proportional variance") + { + uint32_t const trueX = 750; + double const target = linearMean(trueX); + uint32_t const xMin = 100; + uint32_t const xMax = 1000; + uint32_t const tolerance = 200; + + auto f = makeNoisyMonotone(linearMean, proportionalStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("sqrt mean, constant variance") + { + uint32_t const trueX = 2500; + double const target = sqrtMean(trueX); // sqrt(2500) = 50 + uint32_t const xMin = 100; + uint32_t const xMax = 10000; + uint32_t const tolerance = 100; + + // Use smaller stddev relative to the signal range (10..100) + auto smallConstStddev = [](uint32_t) { return 2.0; }; + auto f = makeNoisyMonotone(sqrtMean, smallConstStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("sqrt mean, proportional variance") + { + uint32_t const trueX = 4000; + double const target = sqrtMean(trueX); + uint32_t const xMin = 500; + uint32_t const xMax = 10000; + uint32_t const tolerance = 100; + + auto smallProportionalStddev = [](uint32_t x) { + return std::max(1.0, std::sqrt(static_cast(x)) * 0.05); + }; + auto f = makeNoisyMonotone(sqrtMean, smallProportionalStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("quadratic mean, constant variance") + { + uint32_t const trueX = 100; + double const target = quadraticMean(trueX); // 100^2 = 10000 + uint32_t const xMin = 10; + uint32_t const xMax = 500; + uint32_t const tolerance = 20; + + auto f = makeNoisyMonotone(quadraticMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("quadratic mean, proportional variance") + { + uint32_t const trueX = 200; + double const target = quadraticMean(trueX); + uint32_t const xMin = 50; + uint32_t const xMax = 500; + uint32_t const tolerance = 50; + + auto f = makeNoisyMonotone(quadraticMean, proportionalStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("narrow search range") + { + uint32_t const trueX = 55; + double const target = linearMean(trueX); + uint32_t const xMin = 50; + uint32_t const xMax = 60; + uint32_t const tolerance = 10; + + auto f = makeNoisyMonotone(linearMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(lo >= xMin); + REQUIRE(hi <= xMax); + } + + SECTION("tight tolerance") + { + uint32_t const trueX = 500; + double const target = linearMean(trueX); + uint32_t const xMin = 100; + uint32_t const xMax = 1000; + uint32_t const tolerance = 10; + + // Use lower noise for tight tolerance test + auto lowNoiseStddev = [](uint32_t) { return 1.0; }; + auto f = makeNoisyMonotone(linearMean, lowNoiseStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + } + + SECTION("target at boundary - near min") + { + uint32_t const trueX = 110; + double const target = linearMean(trueX); + uint32_t const xMin = 100; + uint32_t const xMax = 1000; + uint32_t const tolerance = 50; + + auto f = makeNoisyMonotone(linearMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(lo >= xMin); + } + + SECTION("target at boundary - near max") + { + uint32_t const trueX = 950; + double const target = linearMean(trueX); + uint32_t const xMin = 100; + uint32_t const xMax = 1000; + uint32_t const tolerance = 100; + + auto f = makeNoisyMonotone(linearMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi <= xMax); + } + + SECTION("single point range") + { + uint32_t const xMin = 500; + uint32_t const xMax = 500; + double const target = linearMean(xMin); + uint32_t const tolerance = 0; + + auto f = makeNoisyMonotone(linearMean, constStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + REQUIRE(lo == xMin); + REQUIRE(hi == xMax); + } + SECTION("benchmark-like: tx count to execution time") + { + auto benchmarkMean = [](uint32_t x) { + double xd = static_cast(x); + // Model partially parallel execution with sequential stages that + // scale up slowly as x increases. + return 10.0 + 0.1 * xd + 0.5 * std::sqrt(xd); + }; + + // Variance is proportional to apply time (mean). + auto benchmarkStddev = [&](uint32_t x) { + return 0.01 * benchmarkMean(x); + }; + + uint32_t const trueX = 3500; + uint32_t const targetTimeMs = benchmarkMean(trueX); + double const target = static_cast(targetTimeMs); + + uint32_t const xMin = 1000; + uint32_t const xMax = 10000; + uint32_t const tolerance = 200; + + auto f = makeNoisyMonotone(benchmarkMean, benchmarkStddev); + auto [lo, hi] = noisyBinarySearch(f, target, xMin, xMax, confidence, + tolerance, maxSamples); + + // Verify the interval contains the true value + REQUIRE(lo <= trueX); + REQUIRE(hi >= trueX); + REQUIRE(hi - lo <= tolerance); + + // Also verify the mean at the found interval is close to target + double loTime = benchmarkMean(lo); + double hiTime = benchmarkMean(hi); + REQUIRE(loTime <= target + 50); + REQUIRE(hiTime >= target - 50); + } + SECTION("randomized test") + { + // Test many random combinations of parameters + std::mt19937 paramRng(42); // Different seed for parameter generation + + // Mean function types + enum class MeanType + { + LINEAR, + SQRT, + QUADRATIC, + LOG + }; + + // Variance function types + enum class VarianceType + { + CONSTANT, + PROPORTIONAL + }; + + auto getMeanFunc = + [](MeanType type) -> std::function { + switch (type) + { + case MeanType::LINEAR: + return [](uint32_t x) { return static_cast(x); }; + case MeanType::SQRT: + return [](uint32_t x) { + return std::sqrt(static_cast(x)) * 100.0; + }; + case MeanType::QUADRATIC: + return [](uint32_t x) { + return static_cast(x) * static_cast(x) / + 1000.0; + }; + case MeanType::LOG: + return [](uint32_t x) { + return std::log(static_cast(x) + 1.0) * 100.0; + }; + default: + return [](uint32_t x) { return static_cast(x); }; + } + }; + + // Stddev functions based on the mean value, not x + // This gives us direct control over signal-to-noise ratio + auto getStddevFunc = [](VarianceType type, double noiseRatio, + std::function const& meanFunc) + -> std::function { + switch (type) + { + case VarianceType::CONSTANT: + // Constant stddev as a fraction of the mean at x + return [noiseRatio, meanFunc](uint32_t x) { + return std::max(0.1, std::abs(meanFunc(x)) * noiseRatio); + }; + case VarianceType::PROPORTIONAL: + // Stddev proportional to sqrt of mean (like Poisson-ish) + return [noiseRatio, meanFunc](uint32_t x) { + double m = std::abs(meanFunc(x)); + return std::max(0.1, std::sqrt(m) * noiseRatio); + }; + default: + return [](uint32_t) { return 1.0; }; + } + }; + + size_t const numTests = 200; + size_t passed = 0; + + for (size_t testIdx = 0; testIdx < numTests; ++testIdx) + { + // Generate random parameters within sane bounds + MeanType meanType = static_cast( + stellar::uniform_int_distribution(0, 3)(paramRng)); + VarianceType varType = static_cast( + stellar::uniform_int_distribution(0, 1)(paramRng)); + + // Range parameters + uint32_t xMin = + stellar::uniform_int_distribution(10, 500)(paramRng); + uint32_t rangeSize = stellar::uniform_int_distribution( + 100, 5000)(paramRng); + uint32_t xMax = xMin + rangeSize; + + // True x* somewhere in the range (not too close to edges) + uint32_t margin = rangeSize / 10; + uint32_t trueX = stellar::uniform_int_distribution( + xMin + margin, xMax - margin)(paramRng); + + // Get the mean function and compute target + auto meanFunc = getMeanFunc(meanType); + double target = meanFunc(trueX); + + // Tolerance: between 1% and 20% of range + uint32_t tolerance = stellar::uniform_int_distribution( + rangeSize / 100 + 1, rangeSize / 5 + 1)(paramRng); + + // Confidence level: 0.90 to 0.99 + double testConfidence = + std::uniform_real_distribution(0.90, 0.99)(paramRng); + + // Noise ratio: stddev as fraction of mean, kept reasonable (1-10%) + double noiseRatio = + std::uniform_real_distribution(0.01, 0.10)(paramRng); + + auto stddevFunc = getStddevFunc(varType, noiseRatio, meanFunc); + + // Create the noisy function with a fresh RNG for each test + std::mt19937 testRng(testIdx * 1000 + 12345); + auto noisyFunc = [&testRng, meanFunc, + stddevFunc](uint32_t x) -> double { + double mean = meanFunc(x); + double stddev = stddevFunc(x); + std::normal_distribution dist(mean, stddev); + return dist(testRng); + }; + + // Run the search + auto [lo, hi] = + noisyBinarySearch(noisyFunc, target, xMin, xMax, testConfidence, + tolerance, maxSamples); + + // Check if the result is valid + bool containsTrueX = (lo <= trueX && hi >= trueX); + bool withinTolerance = (hi - lo <= tolerance); + bool withinBounds = (lo >= xMin && hi <= xMax); + + if (containsTrueX && withinTolerance && withinBounds) + { + passed++; + } + } + + // We expect at least 90% of tests to pass + double passRate = static_cast(passed) / numTests; + INFO("Passed " << passed << "/" << numTests << " tests (" + << (passRate * 100) << "%)"); + REQUIRE(passRate >= 0.90); + } +} diff --git a/src/test/FuzzerImpl.cpp b/src/test/FuzzerImpl.cpp index 3b5ab2fd5a..85bbaeff06 100644 --- a/src/test/FuzzerImpl.cpp +++ b/src/test/FuzzerImpl.cpp @@ -936,7 +936,7 @@ class FuzzTransactionFrame : public TransactionFrame // Do not track metrics related to background signature verification in // the fuzzer. signatureChecker.disableCacheMetricsTracking(); - LedgerSnapshot ltxStmt(ltx); + LedgerReadView ltxStmt(ltx); // if any ill-formed Operations, do not attempt transaction application auto isInvalidOperation = [&](auto const& op, auto& opResult) { auto diagnostics = diff --git a/src/test/TestAccount.cpp b/src/test/TestAccount.cpp index 6f225ce4af..22d8472cc4 100644 --- a/src/test/TestAccount.cpp +++ b/src/test/TestAccount.cpp @@ -33,8 +33,8 @@ TestAccount::updateSequenceNumber() { if (mSn == 0) { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.load(accountKey(getPublicKey())); + LedgerReadView lrv(mApp); + auto const entry = lrv.load(accountKey(getPublicKey())); if (entry) { mSn = entry.current().data.account().seqNum; @@ -45,8 +45,8 @@ TestAccount::updateSequenceNumber() uint32_t TestAccount::getTrustlineFlags(Asset const& asset) const { - LedgerSnapshot lsg(mApp); - auto const trust = lsg.load(trustlineKey(getPublicKey(), asset)); + LedgerReadView lrv(mApp); + auto const trust = lrv.load(trustlineKey(getPublicKey(), asset)); REQUIRE(trust); return trust.current().data.trustLine().flags; } @@ -63,10 +63,10 @@ TestAccount::getTrustlineBalance(Asset const& asset) const int64_t TestAccount::getTrustlineBalance(PoolID const& poolID) const { - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); TrustLineAsset asset(ASSET_TYPE_POOL_SHARE); asset.liquidityPoolID() = poolID; - auto const trustLine = lsg.load(trustlineKey(getPublicKey(), asset)); + auto const trustLine = lrv.load(trustlineKey(getPublicKey(), asset)); REQUIRE(trustLine); return trustLine.current().data.trustLine().balance; } @@ -74,25 +74,25 @@ TestAccount::getTrustlineBalance(PoolID const& poolID) const int64_t TestAccount::getBalance() const { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.getAccount(getPublicKey()); + LedgerReadView lrv(mApp); + auto const entry = lrv.getAccount(getPublicKey()); return entry.current().data.account().balance; } int64_t TestAccount::getAvailableBalance() const { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.getAccount(getPublicKey()); - return stellar::getAvailableBalance(lsg.getLedgerHeader().current(), + LedgerReadView lrv(mApp); + auto const entry = lrv.getAccount(getPublicKey()); + return stellar::getAvailableBalance(lrv.getLedgerHeader().current(), entry.current()); } uint32_t TestAccount::getNumSubEntries() const { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.getAccount(getPublicKey()); + LedgerReadView lrv(mApp); + auto const entry = lrv.getAccount(getPublicKey()); return entry.current().data.account().numSubEntries; } @@ -146,8 +146,8 @@ TestAccount::create(SecretKey const& secretKey, uint64_t initialBalance) std::unique_ptr destBefore; { - LedgerSnapshot lsg(mApp); - auto const entry = lsg.getAccount(publicKey); + LedgerReadView lrv(mApp); + auto const entry = lrv.getAccount(publicKey); if (entry) { destBefore = std::make_unique(entry.current()); @@ -160,8 +160,8 @@ TestAccount::create(SecretKey const& secretKey, uint64_t initialBalance) } catch (...) { - LedgerSnapshot lsg(mApp); - auto const destAfter = lsg.getAccount(publicKey); + LedgerReadView lrv(mApp); + auto const destAfter = lrv.getAccount(publicKey); // check that the target account didn't change REQUIRE(!!destBefore == !!destAfter); if (destBefore && destAfter) @@ -172,8 +172,8 @@ TestAccount::create(SecretKey const& secretKey, uint64_t initialBalance) } { - LedgerSnapshot lsg(mApp); - REQUIRE(lsg.getAccount(publicKey)); + LedgerReadView lrv(mApp); + REQUIRE(lrv.getAccount(publicKey)); } return TestAccount{mApp, secretKey}; } @@ -190,10 +190,10 @@ TestAccount::createBatch(std::vector const& secretKeys, } applyOpsBatch(ops); std::vector accounts; - LedgerSnapshot ls(mApp); + LedgerReadView lrv(mApp); for (auto const& secretKey : secretKeys) { - REQUIRE(ls.getAccount(secretKey.getPublicKey())); + REQUIRE(lrv.getAccount(secretKey.getPublicKey())); accounts.emplace_back(mApp, secretKey); } return accounts; @@ -222,9 +222,9 @@ TestAccount::merge(PublicKey const& into) { applyTx(tx({accountMerge(into)}), mApp); - LedgerSnapshot lsg(mApp); - REQUIRE(lsg.getAccount(into)); - REQUIRE(!lsg.getAccount(getPublicKey())); + LedgerReadView lrv(mApp); + REQUIRE(lrv.getAccount(into)); + REQUIRE(!lrv.getAccount(getPublicKey())); } void @@ -339,11 +339,11 @@ TestAccount::loadTrustLine(Asset const& asset) const TrustLineEntry TestAccount::loadTrustLine(TrustLineAsset const& asset) const { - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); LedgerKey key(TRUSTLINE); key.trustLine().accountID = getPublicKey(); key.trustLine().asset = asset; - return lsg.load(key).current().data.trustLine(); + return lrv.load(key).current().data.trustLine(); } bool @@ -355,11 +355,11 @@ TestAccount::hasTrustLine(Asset const& asset) const bool TestAccount::hasTrustLine(TrustLineAsset const& asset) const { - LedgerSnapshot lsg(mApp); + LedgerReadView lrv(mApp); LedgerKey key(TRUSTLINE); key.trustLine().accountID = getPublicKey(); key.trustLine().asset = asset; - return static_cast(lsg.load(key)); + return static_cast(lrv.load(key)); } void @@ -373,8 +373,8 @@ TestAccount::manageData(std::string const& name, DataValue* value) { applyTx(tx({txtest::manageData(name, value)}), mApp); - LedgerTxn ls(mApp.getLedgerTxnRoot()); - auto data = stellar::loadData(ls, getPublicKey(), name); + LedgerTxn lrv(mApp.getLedgerTxnRoot()); + auto data = stellar::loadData(lrv, getPublicKey(), name); if (value) { REQUIRE(data); @@ -391,18 +391,18 @@ TestAccount::bumpSequence(SequenceNumber to) { applyTx(tx({txtest::bumpSequence(to)}), mApp, false); - LedgerSnapshot lsg(mApp); - if (protocolVersionStartsFrom(lsg.getLedgerHeader().current().ledgerVersion, + LedgerReadView lrv(mApp); + if (protocolVersionStartsFrom(lrv.getLedgerHeader().current().ledgerVersion, ProtocolVersion::V_19)) { - auto const account = lsg.getAccount(getPublicKey()); + auto const account = lrv.getAccount(getPublicKey()); REQUIRE(account); auto const& v3 = getAccountEntryExtensionV3(account.current().data.account()); - REQUIRE(v3.seqLedger == lsg.getLedgerHeader().current().ledgerSeq); + REQUIRE(v3.seqLedger == lrv.getLedgerHeader().current().ledgerSeq); REQUIRE(v3.seqTime == - lsg.getLedgerHeader().current().scpValue.closeTime); + lrv.getLedgerHeader().current().scpValue.closeTime); } } @@ -502,8 +502,8 @@ TestAccount::pay(PublicKey const& destination, int64_t amount) { std::unique_ptr toAccount; { - LedgerSnapshot lsg(mApp); - auto const toAccountEntry = lsg.getAccount(destination); + LedgerReadView lrv(mApp); + auto const toAccountEntry = lrv.getAccount(destination); toAccount = toAccountEntry ? std::make_unique(toAccountEntry.current()) @@ -514,7 +514,7 @@ TestAccount::pay(PublicKey const& destination, int64_t amount) } else { - REQUIRE(lsg.getAccount(getPublicKey())); + REQUIRE(lrv.getAccount(getPublicKey())); } } @@ -526,8 +526,8 @@ TestAccount::pay(PublicKey const& destination, int64_t amount) } catch (...) { - LedgerSnapshot lsg(mApp); - auto const toAccountAfter = lsg.getAccount(destination); + LedgerReadView lrv(mApp); + auto const toAccountAfter = lrv.getAccount(destination); // check that the target account didn't change REQUIRE(!!toAccount == !!toAccountAfter); if (toAccount && toAccountAfter && @@ -539,8 +539,8 @@ TestAccount::pay(PublicKey const& destination, int64_t amount) throw; } - LedgerSnapshot lsg(mApp); - auto const toAccountAfter = lsg.getAccount(destination); + LedgerReadView lrv(mApp); + auto const toAccountAfter = lrv.getAccount(destination); REQUIRE(toAccount); REQUIRE(toAccountAfter); } diff --git a/src/test/TestExceptions.cpp b/src/test/TestExceptions.cpp index 8d28035158..d1c710dcb9 100644 --- a/src/test/TestExceptions.cpp +++ b/src/test/TestExceptions.cpp @@ -399,6 +399,8 @@ throwIf(ClaimClaimableBalanceResult const& result) throw ex_CLAIM_CLAIMABLE_BALANCE_NOT_AUTHORIZED{}; case CLAIM_CLAIMABLE_BALANCE_NO_TRUST: throw ex_CLAIM_CLAIMABLE_BALANCE_NO_TRUST{}; + case CLAIM_CLAIMABLE_BALANCE_TRUSTLINE_FROZEN: + throw ex_CLAIM_CLAIMABLE_BALANCE_TRUSTLINE_FROZEN{}; case CLAIM_CLAIMABLE_BALANCE_SUCCESS: break; default: @@ -483,6 +485,8 @@ throwIf(LiquidityPoolDepositResult const& result) throw ex_LIQUIDITY_POOL_DEPOSIT_BAD_PRICE{}; case LIQUIDITY_POOL_DEPOSIT_POOL_FULL: throw ex_LIQUIDITY_POOL_DEPOSIT_POOL_FULL{}; + case LIQUIDITY_POOL_DEPOSIT_TRUSTLINE_FROZEN: + throw ex_LIQUIDITY_POOL_DEPOSIT_TRUSTLINE_FROZEN{}; case LIQUIDITY_POOL_DEPOSIT_SUCCESS: break; default: @@ -505,6 +509,8 @@ throwIf(LiquidityPoolWithdrawResult const& result) throw ex_LIQUIDITY_POOL_WITHDRAW_LINE_FULL{}; case LIQUIDITY_POOL_WITHDRAW_UNDER_MINIMUM: throw ex_LIQUIDITY_POOL_WITHDRAW_UNDER_MINIMUM{}; + case LIQUIDITY_POOL_WITHDRAW_TRUSTLINE_FROZEN: + throw ex_LIQUIDITY_POOL_WITHDRAW_TRUSTLINE_FROZEN{}; case LIQUIDITY_POOL_WITHDRAW_SUCCESS: break; default: @@ -581,6 +587,8 @@ throwIf(TransactionResult const& result) throw ex_txINSUFFICIENT_BALANCE{}; case txBAD_AUTH: throw ex_txBAD_AUTH{}; + case txFROZEN_KEY_ACCESSED: + throw ex_txFROZEN_KEY_ACCESSED{}; default: throw ex_UNKNOWN{}; } diff --git a/src/test/TestExceptions.h b/src/test/TestExceptions.h index 8b2308a350..8daaa60296 100644 --- a/src/test/TestExceptions.h +++ b/src/test/TestExceptions.h @@ -30,6 +30,7 @@ TEST_EXCEPTION(ex_txNO_ACCOUNT) TEST_EXCEPTION(ex_txINTERNAL_ERROR) TEST_EXCEPTION(ex_txINSUFFICIENT_BALANCE) TEST_EXCEPTION(ex_txBAD_AUTH) +TEST_EXCEPTION(ex_txFROZEN_KEY_ACCESSED) TEST_EXCEPTION(ex_opBAD_AUTH) TEST_EXCEPTION(ex_opNO_ACCOUNT) @@ -161,6 +162,7 @@ TEST_EXCEPTION(ex_CLAIM_CLAIMABLE_BALANCE_CANNOT_CLAIM) TEST_EXCEPTION(ex_CLAIM_CLAIMABLE_BALANCE_LINE_FULL) TEST_EXCEPTION(ex_CLAIM_CLAIMABLE_BALANCE_NOT_AUTHORIZED) TEST_EXCEPTION(ex_CLAIM_CLAIMABLE_BALANCE_NO_TRUST) +TEST_EXCEPTION(ex_CLAIM_CLAIMABLE_BALANCE_TRUSTLINE_FROZEN) TEST_EXCEPTION(ex_CLAWBACK_MALFORMED) TEST_EXCEPTION(ex_CLAWBACK_NO_TRUST) @@ -183,12 +185,14 @@ TEST_EXCEPTION(ex_LIQUIDITY_POOL_DEPOSIT_UNDERFUNDED) TEST_EXCEPTION(ex_LIQUIDITY_POOL_DEPOSIT_LINE_FULL) TEST_EXCEPTION(ex_LIQUIDITY_POOL_DEPOSIT_BAD_PRICE) TEST_EXCEPTION(ex_LIQUIDITY_POOL_DEPOSIT_POOL_FULL) +TEST_EXCEPTION(ex_LIQUIDITY_POOL_DEPOSIT_TRUSTLINE_FROZEN) TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_MALFORMED) TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_NO_TRUST) TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_UNDERFUNDED) TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_LINE_FULL) TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_UNDER_MINIMUM) +TEST_EXCEPTION(ex_LIQUIDITY_POOL_WITHDRAW_TRUSTLINE_FROZEN) TEST_EXCEPTION(ex_INVOKE_HOST_FUNCTION_MALFORMED) TEST_EXCEPTION(ex_INVOKE_HOST_FUNCTION_TRAPPED) diff --git a/src/test/TestUtils.cpp b/src/test/TestUtils.cpp index c4a59ec325..52c122d833 100644 --- a/src/test/TestUtils.cpp +++ b/src/test/TestUtils.cpp @@ -417,6 +417,8 @@ modifySorobanNetworkConfig(Application& app, {upgrade}); app.getRoot()->loadSequenceNumber(); + txtest::captureLastClosedLedgerLcm(app); + // Check that the upgrade was actually applied. auto postUpgradeCfg = app.getLedgerManager().getLastClosedSorobanNetworkConfig(); diff --git a/src/test/TxTests.cpp b/src/test/TxTests.cpp index f29b9f9f26..34e331ae80 100644 --- a/src/test/TxTests.cpp +++ b/src/test/TxTests.cpp @@ -8,6 +8,7 @@ #include "database/Database.h" #include "herder/Herder.h" #include "invariant/InvariantManager.h" +#include "ledger/LedgerCloseMetaFrame.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -24,10 +25,12 @@ #include "transactions/TransactionBridge.h" #include "transactions/TransactionFrame.h" #include "transactions/TransactionUtils.h" +#include "util/Fs.h" #include "util/GlobalChecks.h" #include "util/Logging.h" #include "util/ProtocolVersion.h" #include "util/XDROperators.h" +#include "util/XDRStream.h" #include "util/types.h" #include "xdrpp/autocheck.h" @@ -43,6 +46,44 @@ namespace stellar namespace txtest { +static std::vector gAccumulatedLcm; + +std::vector const& +getAccumulatedLcm() +{ + return gAccumulatedLcm; +} + +void +clearAccumulatedLcm() +{ + gAccumulatedLcm.clear(); +} + +void +appendToAccumulatedLcm(LedgerCloseMeta const& lcm) +{ + gAccumulatedLcm.emplace_back(lcm); +} + +void +captureLastClosedLedgerLcm(Application& app) +{ + // TODO: In-memory mode uses applyCheck which closes an empty ledger + // then applies the tx directly, so txs never appear in LCM. Fix this + // by restructuring applyCheck to use closeLedger(app, {tx}) when + // capturing LCM. + if (isLcmCaptureEnabled() && !app.getConfig().MODE_USES_IN_MEMORY_LEDGER) + { + auto const& closeMeta = + app.getLedgerManager().getLastClosedLedgerCloseMeta(); + if (closeMeta.has_value()) + { + appendToAccumulatedLcm(closeMeta->getXDR()); + } + } +} + ExpectedOpResult::ExpectedOpResult(OperationResultCode code) { mOperationResult.code(code); @@ -291,7 +332,8 @@ applyCheck(TransactionTestFramePtr tx, Application& app, bool checkSeqNum) bool earlyFailure = (code == txMISSING_OPERATION || code == txTOO_EARLY || code == txTOO_LATE || code == txINSUFFICIENT_FEE || - code == txBAD_SEQ || code == txMALFORMED); + code == txBAD_SEQ || code == txMALFORMED || + code == txFROZEN_KEY_ACCESSED); // verify that the sequence number changed (v10+) // do not perform the check if there was a failure before // or during the sequence number processing @@ -545,6 +587,9 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, // Ensure that parallelSorobanOrder is only used with strictOrder releaseAssert((parallelSorobanOrder.empty() || strictOrder)); + // Ensure we're not trying to close a ledger that's already closed + releaseAssert(ledgerSeq > app.getLedgerManager().getLastClosedLedgerNum()); + auto lastCloseTime = app.getLedgerManager() .getLastClosedLedgerHeader() .header.scpValue.closeTime; @@ -599,6 +644,7 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, } releaseAssert(app.getLedgerManager().getLastClosedLedgerNum() == ledgerSeq); auto& lm = static_cast(app.getLedgerManager()); + captureLastClosedLedgerLcm(app); return lm.mLatestTxResultSet; } @@ -624,6 +670,8 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, time_t closeTime, REQUIRE(app.getLedgerManager().getLastClosedLedgerNum() == ledgerSeq); + captureLastClosedLedgerLcm(app); + return z1; } @@ -663,14 +711,14 @@ loadAccount(AbstractLedgerTxn& ltx, PublicKey const& k, bool mustExist) bool doesAccountExist(Application& app, PublicKey const& k) { - LedgerSnapshot lss(app); + LedgerReadView lss(app); return (bool)lss.getAccount(k); } xdr::xvector getAccountSigners(PublicKey const& k, Application& app) { - LedgerSnapshot lss(app); + LedgerReadView lss(app); auto account = lss.getAccount(k); return account.current().data.account().signers; } @@ -1937,6 +1985,9 @@ executeUpgrades(Application& app, xdr::xvector const& upgrades, auto lastCloseTime = lcl.header.scpValue.closeTime; app.getHerder().externalizeValue(txSet, lcl.header.ledgerSeq + 1, lastCloseTime, upgrades); + + captureLastClosedLedgerLcm(app); + if (upgradesIgnored) { auto const& newHeader = lm.getLastClosedLedgerHeader().header; @@ -1997,8 +2048,8 @@ makeConfigUpgradeSet(AbstractLedgerTxn& ltx, ConfigUpgradeSet configUpgradeSet, ltx.create(InternalLedgerEntry(ttl)); auto upgradeKey = ConfigUpgradeSetKey{contractID, hashOfUpgradeSet}; - LedgerSnapshot lsg(ltx); - return ConfigUpgradeSetFrame::makeFromKey(lsg, upgradeKey); + LedgerReadView lrv(ltx); + return ConfigUpgradeSetFrame::makeFromKey(lrv, upgradeKey); } LedgerUpgrade @@ -2121,7 +2172,7 @@ isSuccessResult(TransactionResult const& res) TestAccount getGenesisAccount(Application& app, uint32_t accountIndex) { - REQUIRE(accountIndex < app.getConfig().GENESIS_TEST_ACCOUNT_COUNT); + releaseAssert(accountIndex < app.getConfig().GENESIS_TEST_ACCOUNT_COUNT); return TestAccount( app, getAccount("TestAccount-" + std::to_string(accountIndex))); } diff --git a/src/test/TxTests.h b/src/test/TxTests.h index 2889f137e4..7da49448d9 100644 --- a/src/test/TxTests.h +++ b/src/test/TxTests.h @@ -380,5 +380,14 @@ bool isSuccessResult(TransactionResult const& res); TestAccount getGenesisAccount(Application& app, uint32_t accountIndex); +// Accumulated LedgerCloseMeta from closeLedger/closeLedgerOn calls. +// Only accumulates when --capture-lcm is passed on the test command line. +// Note: LCM capture does not cover BucketTestUtils::closeLedger or direct +// externalizeValue calls (e.g. genesis ledger from app->start()). +std::vector const& getAccumulatedLcm(); +void clearAccumulatedLcm(); +void appendToAccumulatedLcm(LedgerCloseMeta const& lcm); +void captureLastClosedLedgerLcm(Application& app); + } // end txtest namespace } diff --git a/src/test/check-nondet b/src/test/check-nondet index 1b8e739144..8d8c1b3244 100755 --- a/src/test/check-nondet +++ b/src/test/check-nondet @@ -39,3 +39,10 @@ then echo "to calls to std::uniform_int_distribution, which varies between compilers." exit 1 fi + +if git grep 'SecretKey::random' '**/test/*.h' '**/test/*.cpp' +then + echo + echo "please use SecretKey::pseudoRandomForTesting() instead of SecretKey::random() in tests" + exit 1 +fi diff --git a/src/test/selftest-nopg b/src/test/selftest-nopg index ef297b0cdd..ce8d8eca75 100755 --- a/src/test/selftest-nopg +++ b/src/test/selftest-nopg @@ -4,4 +4,5 @@ # under the Apache License, Version 2.0. See the COPYING file at the root # of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 -exec "${top_srcdir}/src/test/selftest-parallel" "${top_srcdir}/src/test/run-selftest-nopg" +"${top_srcdir}/src/test/selftest-parallel" "${top_srcdir}/src/test/run-selftest-nopg" \ + && exec "${top_srcdir}/src/test/check-sorobans" diff --git a/src/test/selftest-pg b/src/test/selftest-pg index c99a178cb4..44c7c5ddfe 100755 --- a/src/test/selftest-pg +++ b/src/test/selftest-pg @@ -4,4 +4,5 @@ # under the Apache License, Version 2.0. See the COPYING file at the root # of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 -exec "${top_srcdir}/src/test/selftest-parallel" "${top_srcdir}/src/test/run-selftest-pg" +"${top_srcdir}/src/test/selftest-parallel" "${top_srcdir}/src/test/run-selftest-pg" \ + && exec "${top_srcdir}/src/test/check-sorobans" diff --git a/src/test/test.cpp b/src/test/test.cpp index 3c49c304df..deedcb9e83 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -2,10 +2,13 @@ // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 +#include "crypto/Hex.h" +#include "crypto/SHA.h" #include "crypto/ShortHash.h" #include "util/Decoder.h" #include "util/GlobalChecks.h" #include +#include #include #include #define CATCH_CONFIG_RUNNER @@ -20,14 +23,18 @@ #include "main/dumpxdr.h" #include "test.h" #include "test/TestUtils.h" +#include "test/TxTests.h" +#include "util/Fs.h" #include "util/Logging.h" #include "util/Math.h" #include "util/MetaUtils.h" #include "util/TmpDir.h" #include "util/XDRCereal.h" +#include "util/XDRStream.h" #include #include +#include #include #include @@ -83,7 +90,225 @@ enum class TestTxMetaMode META_TEST_CHECK }; -static TestTxMetaMode gTestTxMetaMode{TestTxMetaMode::META_TEST_IGNORE}; +namespace +{ + +TestTxMetaMode gTestTxMetaMode{TestTxMetaMode::META_TEST_IGNORE}; +bool gLcmCaptureEnabled{false}; + +// State tracked per section for automatic LCM capture. +struct SectionLcmState +{ + Catch::SectionInfo info; + size_t startIndex; // index into gAccumulatedLcm at section entry + bool hasChildSection; // true if any child section was entered +}; + +bool +needTestCtxTracking() +{ + return gTestTxMetaMode != TestTxMetaMode::META_TEST_IGNORE || + gLcmCaptureEnabled; +} + +std::string +sanitizeForFilename(std::string const& s) +{ + std::string out; + out.reserve(s.size()); + for (char c : s) + { + if (c == ' ') + out += '_'; + else if (c == '/' || c == '\\' || c == ':' || c == '*' || c == '?' || + c == '"' || c == '<' || c == '>' || c == '|') + out += '-'; + else + out += c; + } + return out; +} + +std::string +buildLcmHumanName(Catch::TestCaseInfo const& tc, + std::vector const& sectionStack) +{ + std::string name = sanitizeForFilename(tc.name); + // Skip the first section — Catch2 always creates an implicit root + // section with the same name as the test case. + for (size_t i = 1; i < sectionStack.size(); ++i) + { + name += "-"; + name += sanitizeForFilename(sectionStack[i].info.name); + } + return name; +} + +std::string +buildLcmOutputDir(Catch::TestCaseInfo const& tc) +{ + std::filesystem::path file(tc.lineInfo.file); + return "test-lcm/" + file.filename().stem().string(); +} + +int32_t +lcmLedgerSeq(LedgerCloseMeta const& lcm) +{ + switch (lcm.v()) + { + case 0: + return lcm.v0().ledgerHeader.header.ledgerSeq; + case 1: + return lcm.v1().ledgerHeader.header.ledgerSeq; + case 2: + return lcm.v2().ledgerHeader.header.ledgerSeq; + default: + releaseAssert(false); + } +} + +void +checkLcmSequenceContiguity(std::vector const& metas, + size_t startIndex, std::string const& path) +{ + if (startIndex + 1 >= metas.size()) + { + // Zero or one entry — nothing to check for contiguity. + return; + } + for (size_t i = startIndex + 1; i < metas.size(); ++i) + { + auto prevSeq = lcmLedgerSeq(metas[i - 1]); + auto curSeq = lcmLedgerSeq(metas[i]); + REQUIRE(curSeq == prevSeq + 1); + } +} + +// Read all LedgerCloseMeta entries from an existing XDR file. +std::vector +readLcmFromFile(std::string const& path) +{ + std::vector result; + XDRInputFileStream in; + in.open(path); + LedgerCloseMeta lcm; + while (in.readOne(lcm)) + { + result.emplace_back(std::move(lcm)); + } + return result; +} + +// Compare two LCM vectors for semantic equality by normalizing copies of each +// entry. This allows us to skip writing when the only differences are due to +// non-deterministic ordering from unordered map iteration. +bool +lcmSemanticallyEqual(std::vector const& a, + std::vector const& b) +{ + if (a.size() != b.size()) + { + return false; + } + for (size_t i = 0; i < a.size(); ++i) + { + LedgerCloseMeta na = a[i]; + LedgerCloseMeta nb = b[i]; + normalizeMeta(na); + normalizeMeta(nb); + zeroNonDeterministicDiagnostics(na); + zeroNonDeterministicDiagnostics(nb); + if (na != nb) + { + return false; + } + } + return true; +} + +void +updateLcmIndex(std::string const& dir, std::string const& hashHex, + std::string const& humanName) +{ + std::string indexPath = dir + "/index.json"; + Json::Value root(Json::objectValue); + if (std::filesystem::exists(indexPath)) + { + std::ifstream in(indexPath); + in >> root; + } + root[hashHex] = humanName; + + // Json::Value keeps keys sorted, so output is deterministic. + Json::StyledWriter writer; + std::ofstream out(indexPath); + out << writer.write(root); +} + +void +writeLcmToFile(std::string const& path, std::string const& dir, + std::string const& hashHex, std::string const& humanName, + size_t startIndex) +{ + auto const& allMetas = txtest::getAccumulatedLcm(); + if (startIndex >= allMetas.size()) + { + LOG_WARNING(DEFAULT_LOG, + "LCM auto-capture: no LedgerCloseMeta entries for '{}'. " + "This test may use tx->apply() instead of closeLedger().", + path); + return; + } + + checkLcmSequenceContiguity(allMetas, startIndex, path); + + // Build the new entries with zeroed diagnostics but without + // normalization: some restoration ledger-entry changes must remain in + // their original order for downstream consumers. + std::vector newEntries; + newEntries.reserve(allMetas.size() - startIndex); + for (size_t i = startIndex; i < allMetas.size(); ++i) + { + newEntries.push_back(allMetas[i]); + zeroNonDeterministicDiagnostics(newEntries.back()); + } + + // Always ensure directory exists and update the index so it stays in sync + // even when the XDR write is skipped. + fs::mkpath(dir); + updateLcmIndex(dir, hashHex, humanName); + + // If an existing file is present, compare normalized versions. Skip the + // write if the entries are semantically identical — this avoids noisy + // diffs caused by non-deterministic unordered map iteration order. + if (std::filesystem::exists(path)) + { + auto oldEntries = readLcmFromFile(path); + if (lcmSemanticallyEqual(oldEntries, newEntries)) + { + return; + } + } + + // Remove any existing file (XDROutputFileStream uses O_APPEND on + // POSIX, so we must remove first to avoid appending to stale data) + if (!fs::removeWithLog(path)) + { + throw std::runtime_error(fmt::format( + "LCM auto-capture: failed to remove existing file '{}'", path)); + } + + asio::io_context ioc; + XDROutputFileStream out(ioc, /*fsyncOnClose=*/false); + out.open(path); + + for (auto const& entry : newEntries) + { + out.writeOne(entry); + } +} + +} // namespace struct TestContextListener : Catch::TestEventListenerBase { @@ -92,20 +317,43 @@ struct TestContextListener : Catch::TestEventListenerBase static std::optional sTestCtx; static std::vector sSectCtx; + // LCM auto-capture state + static std::vector sLcmSectStack; + static size_t sTestCaseStartIndex; + static bool sTestCaseHasSection; + void testCaseStarting(Catch::TestCaseInfo const& testInfo) override { - if (gTestTxMetaMode != TestTxMetaMode::META_TEST_IGNORE) + if (needTestCtxTracking()) { releaseAssert(threadIsMain()); releaseAssert(!sTestCtx.has_value()); sTestCtx.emplace(testInfo); } + if (gLcmCaptureEnabled) + { + txtest::clearAccumulatedLcm(); + sLcmSectStack.clear(); + sTestCaseStartIndex = 0; + sTestCaseHasSection = false; + } } void testCaseEnded(Catch::TestCaseStats const& testCaseStats) override { - if (gTestTxMetaMode != TestTxMetaMode::META_TEST_IGNORE) + if (gLcmCaptureEnabled && !sTestCaseHasSection) + { + releaseAssert(sTestCtx.has_value()); + auto const& tc = sTestCtx.value(); + auto humanName = buildLcmHumanName(tc, sLcmSectStack); + auto hash = sha256(humanName); + auto hashHex = binToHex(hash).substr(0, 16); + auto dir = buildLcmOutputDir(tc); + auto path = dir + "/" + hashHex + ".xdr"; + writeLcmToFile(path, dir, hashHex, humanName, sTestCaseStartIndex); + } + if (needTestCtxTracking()) { releaseAssert(threadIsMain()); releaseAssert(sTestCtx.has_value()); @@ -116,16 +364,52 @@ struct TestContextListener : Catch::TestEventListenerBase void sectionStarting(Catch::SectionInfo const& sectionInfo) override { - if (gTestTxMetaMode != TestTxMetaMode::META_TEST_IGNORE) + if (needTestCtxTracking()) { releaseAssert(threadIsMain()); sSectCtx.emplace_back(sectionInfo); } + if (gLcmCaptureEnabled) + { + sTestCaseHasSection = true; + if (!sLcmSectStack.empty()) + { + sLcmSectStack.back().hasChildSection = true; + } + sLcmSectStack.push_back( + {sectionInfo, txtest::getAccumulatedLcm().size(), false}); + } } void sectionEnded(Catch::SectionStats const& sectionStats) override { - if (gTestTxMetaMode != TestTxMetaMode::META_TEST_IGNORE) + if (gLcmCaptureEnabled && !sLcmSectStack.empty()) + { + auto state = sLcmSectStack.back(); + if (!state.hasChildSection) + { + // Build path before popping so the leaf section name + // is included in sLcmSectStack. + releaseAssert(sTestCtx.has_value()); + auto const& tc = sTestCtx.value(); + auto humanName = buildLcmHumanName(tc, sLcmSectStack); + auto hash = sha256(humanName); + auto hashHex = binToHex(hash).substr(0, 16); + auto dir = buildLcmOutputDir(tc); + auto path = dir + "/" + hashHex + ".xdr"; + // Use the root section's startIndex so we capture all + // LCM for this test run, including setup code that + // ran before any SECTION was entered. + auto runStart = sLcmSectStack.front().startIndex; + sLcmSectStack.pop_back(); + writeLcmToFile(path, dir, hashHex, humanName, runStart); + } + else + { + sLcmSectStack.pop_back(); + } + } + if (needTestCtxTracking()) { releaseAssert(threadIsMain()); sSectCtx.pop_back(); @@ -138,6 +422,9 @@ CATCH_REGISTER_LISTENER(TestContextListener) namespace stdfs = std::filesystem; std::optional TestContextListener::sTestCtx; std::vector TestContextListener::sSectCtx; +std::vector TestContextListener::sLcmSectStack; +size_t TestContextListener::sTestCaseStartIndex = 0; +bool TestContextListener::sTestCaseHasSection = false; static std::map>>> @@ -181,6 +468,12 @@ test_versions_wrapper(std::function f) bool force_sqlite = (std::getenv("STELLAR_FORCE_SQLITE") != nullptr); +bool +isLcmCaptureEnabled() +{ + return gLcmCaptureEnabled; +} + static void saveTestTxMeta(stdfs::path const& dir); static void loadTestTxMeta(stdfs::path const& dir); static void reportTestTxMeta(); @@ -316,8 +609,6 @@ getTestConfig(int instanceNumber, Config::TestDbMode mode) thisConfig.DATABASE = SecretValue{dbname.str()}; thisConfig.REPORT_METRICS = gTestMetrics; - // disable maintenance - thisConfig.AUTOMATIC_MAINTENANCE_COUNT = 0; // disable self-check thisConfig.AUTOMATIC_SELF_CHECK_PERIOD = std::chrono::seconds(0); // only spin up a small number of worker threads @@ -409,6 +700,9 @@ runTest(CommandLineArgs const& args) "dump full TxMeta from all tests to FILENAME"); parser |= Catch::clara::Opt( Catch::SimpleTestReporter::gDisableDots)["--disable-dots"]; + parser |= Catch::clara::Opt(gLcmCaptureEnabled)["--capture-lcm"]( + "automatically capture LedgerCloseMeta to binary XDR files " + "in test-lcm/ at leaf section boundaries"); session.cli(parser); diff --git a/src/test/test.h b/src/test/test.h index 89aefa6cc7..fc4fa2ed95 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -35,6 +35,15 @@ int runTest(CommandLineArgs const& args); extern int gBaseInstance; extern bool force_sqlite; +// Returns true if --capture-lcm was passed to the test command. +// When enabled, LedgerCloseMeta from closeLedger/closeLedgerOn is +// automatically written to binary XDR files in test-lcm// +// at leaf section boundaries (or test case end for tests without +// sections). File names are SHA-256 hashes of the human-readable test +// name; each directory also contains an index.json mapping hashes to +// test names. +bool isLcmCaptureEnabled(); + void test_versions_wrapper(std::function f); #define TEST_BODY_NAME_INT2(line) testInternalBody##line diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26-soroban.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26-soroban.json index 37c04915b6..690b11c82a 100644 --- a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26-soroban.json +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26-soroban.json @@ -6,24 +6,24 @@ "v": 0 }, "ledgerHeader": { - "hash": "f8e249ac924d72fe4b2a5bd6b28717b1d164fe0b5c7d32d64d7c27b63d7f70d7", + "hash": "059f74d286f715f5cb199115afe231ae62c98a665cbe6223eca865f6e03e4711", "header": { "ledgerVersion": 26, - "previousLedgerHash": "c5be64a7ce74a1a5d2950fb12c1542cb6cc2d69dfa0af500d84751a1812a36e7", + "previousLedgerHash": "7584ec52c748b8c4ad78730fe47b3e2528e47fd95dad346ca3c1eb61248a55ab", "scpValue": { - "txSetHash": "8fc7e93ed2170bf10afa649c59868ab3a4a9c6511b9e21d9a69a3c973d7ba0b5", + "txSetHash": "7eeacd54ebfb80905aab2931876c09b5da9324d7d2d704245c0a90189ef52cfd", "closeTime": 1451692801, "upgrades": [], "ext": { "v": "STELLAR_VALUE_SIGNED", "lcValueSignature": { "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "c0fe7e296a63c47976c65d0443ffe293df794f83243b02954011e2073b20213f5bcff79a1ee67d9a7ae8d18db2dbc7a9059831547fd7c8f1c3a53910f8304f07" + "signature": "43c151074ef7c010bc6ed7b78e93251370144d39c694f4f2b7d8cb35df87729b97cd3957b42bc541cb2f4c0401974bb563f8e1fc189b5057327f5e6e9773cb04" } } }, - "txSetResultHash": "d3bde14b15428d27136e8ce2b0f86cf9c84b9cacfd3258317e382187b5e2f08e", - "bucketListHash": "3e9b4cc079d0fdf987005647ac5b891aa0c313eb95f2d5f3c5ef4c711477fae9", + "txSetResultHash": "7f990d484919d1099f8d79eaf2780b3d19363dc01f7a15bb4f8b0881c5db9bcf", + "bucketListHash": "bafbb8761cb8d2dca18ad3eada232def91a210823c3b10d7ca29773bd3b64297", "ledgerSeq": 31, "totalCoins": 1000000000000000000, "feePool": 9167489, @@ -49,7 +49,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "c5be64a7ce74a1a5d2950fb12c1542cb6cc2d69dfa0af500d84751a1812a36e7", + "previousLedgerHash": "7584ec52c748b8c4ad78730fe47b3e2528e47fd95dad346ca3c1eb61248a55ab", "phases": [ { "v": 0, @@ -505,18 +505,19 @@ "v": 0 }, "result": { - "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", "result": { - "feeCharged": 54107, + "feeCharged": 94335, "result": { "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "RESTORE_FOOTPRINT", - "restoreFootprintResult": { - "code": "RESTORE_FOOTPRINT_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_SUCCESS", + "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" } } } @@ -531,13 +532,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 11, + "lastModifiedLedgerSeq": 13, "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", "balance": 400000000, - "seqNum": 47244640256, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -561,9 +562,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -595,9 +596,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -621,9 +622,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -672,9 +673,9 @@ }, "changes": [ { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 10, + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, "data": { "type": "CONTRACT_DATA", "contractData": { @@ -684,7 +685,7 @@ "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", "key": { "type": "SCV_SYMBOL", - "sym": "archived" + "sym": "key" }, "durability": "PERSISTENT", "val": { @@ -699,13 +700,13 @@ } }, { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { + "type": "LEDGER_ENTRY_CREATED", + "created": { "lastModifiedLedgerSeq": 31, "data": { "type": "TTL", "ttl": { - "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", "liveUntilLedgerSeq": 50 } }, @@ -723,7 +724,9 @@ "ext": { "v": 0 }, - "returnValue": null + "returnValue": { + "type": "SCV_VOID" + } }, "events": [ { @@ -744,14 +747,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1000100 + "lo": 114167 } } } @@ -776,14 +779,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708605623 + "lo": 18446744073709531784 } } } @@ -802,9 +805,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -852,9 +855,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399945893, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399905665, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -902,18 +905,18 @@ "v": 0 }, "result": { - "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", "result": { - "feeCharged": 51269, + "feeCharged": 54053, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "EXTEND_FOOTPRINT_TTL", - "extendFootprintTTLResult": { - "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" } } } @@ -928,13 +931,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 12, + "lastModifiedLedgerSeq": 14, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", "balance": 400000000, - "seqNum": 51539607552, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -958,9 +961,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -992,9 +995,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1018,9 +1021,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1062,87 +1065,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -1162,14 +1087,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1000100 + "lo": 94053 } } } @@ -1194,14 +1119,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708602785 + "lo": 18446744073709511616 } } } @@ -1220,9 +1145,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1270,9 +1195,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399948731, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1320,9 +1245,9 @@ "v": 0 }, "result": { - "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", "result": { - "feeCharged": 54053, + "feeCharged": 45161, "result": { "code": "txFAILED", "results": [ @@ -1331,7 +1256,7 @@ "tr": { "type": "INVOKE_HOST_FUNCTION", "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_TRAPPED" + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" } } } @@ -1346,13 +1271,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 14, + "lastModifiedLedgerSeq": 15, "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", "balance": 400000000, - "seqNum": 60129542144, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1376,9 +1301,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1410,9 +1335,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1436,9 +1361,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1502,14 +1427,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 94053 + "lo": 1046162 } } } @@ -1534,14 +1459,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073709511616 + "lo": 18446744073708550615 } } } @@ -1560,9 +1485,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1610,9 +1535,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399945947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1660,18 +1585,18 @@ "v": 0 }, "result": { - "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", "result": { - "feeCharged": 45161, + "feeCharged": 51269, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" } } } @@ -1686,13 +1611,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 15, + "lastModifiedLedgerSeq": 12, "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", "balance": 400000000, - "seqNum": 64424509440, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1716,9 +1641,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1750,9 +1675,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1776,9 +1701,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1820,9 +1745,87 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -1842,14 +1845,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1046162 + "lo": 1000100 } } } @@ -1874,14 +1877,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708550615 + "lo": 18446744073708602785 } } } @@ -1900,9 +1903,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1950,9 +1953,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 399954839, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2000,19 +2003,18 @@ "v": 0 }, "result": { - "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", "result": { - "feeCharged": 94335, + "feeCharged": 54107, "result": { "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_SUCCESS", - "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" } } } @@ -2027,13 +2029,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 13, + "lastModifiedLedgerSeq": 11, "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", "balance": 400000000, - "seqNum": 55834574848, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2057,9 +2059,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574848, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2091,9 +2093,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574848, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2117,9 +2119,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2168,9 +2170,9 @@ }, "changes": [ { - "type": "LEDGER_ENTRY_CREATED", - "created": { - "lastModifiedLedgerSeq": 31, + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, "data": { "type": "CONTRACT_DATA", "contractData": { @@ -2180,7 +2182,7 @@ "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", "key": { "type": "SCV_SYMBOL", - "sym": "key" + "sym": "archived" }, "durability": "PERSISTENT", "val": { @@ -2195,13 +2197,13 @@ } }, { - "type": "LEDGER_ENTRY_CREATED", - "created": { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { "lastModifiedLedgerSeq": 31, "data": { "type": "TTL", "ttl": { - "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", "liveUntilLedgerSeq": 50 } }, @@ -2219,9 +2221,7 @@ "ext": { "v": 0 }, - "returnValue": { - "type": "SCV_VOID" - } + "returnValue": null }, "events": [ { @@ -2242,14 +2242,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 114167 + "lo": 1000100 } } } @@ -2274,14 +2274,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073709531784 + "lo": 18446744073708605623 } } } @@ -2300,9 +2300,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2350,9 +2350,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399905665, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26.json index 1945d07ffa..1e1fd24a98 100644 --- a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26.json +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-26.json @@ -6,24 +6,24 @@ "v": 0 }, "ledgerHeader": { - "hash": "49f60c4293eda65a3c1835406896cf6f01e6b1432a2e51183e18c1da57c15856", + "hash": "83d6e4f873f0336d83d32db3485f6ead2073ed35784ed6493860bea412c245db", "header": { "ledgerVersion": 26, - "previousLedgerHash": "a570dae70759517a0679eadb3c0725f6b1bc168bba6375eeea33b4ab40f51636", + "previousLedgerHash": "77172844c966b469aed8619a331b85d995590d352de312e9f6ccf80a56d2a427", "scpValue": { - "txSetHash": "3ef32e66de0ec1a08474e8e4b29aa6895464d634553f6b8d27386c0a78f1d045", + "txSetHash": "4e7c372203401e64ae7968d66e6ed6fbfca758dd416d8599bc121ef109d787ff", "closeTime": 1451692801, "upgrades": [], "ext": { "v": "STELLAR_VALUE_SIGNED", "lcValueSignature": { "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "1d555e1369037e6f5290b3fc7a185bebd7ee7ec1b5e7442fa2a5057c2505977e6b7a515e57ceb35efcf1458d74fff773621e45329c667e15c2eb18aff167e404" + "signature": "174c749e9f54febf519f85b3266d6da33001356b2d17c1975c69a797d9777d141d4075445f9fc4ded298b2dc2a426d33db857148b73e6c960e7f598a2ae5a90b" } } }, "txSetResultHash": "fd6fb3b06784653ffa2057ae36184c8d9ee185c4ae35f0ba9e076059746fb659", - "bucketListHash": "8fac2c03cca5f9f6b335f75e724b66800b8ce29f9949795793baa24b3fcb7ccb", + "bucketListHash": "29b124ff2c559a17e620a1d2bc6a183c45c59be84cce8c9a5c5348a2afb76c2a", "ledgerSeq": 10, "totalCoins": 1000000000000000000, "feePool": 8198834, @@ -49,7 +49,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "a570dae70759517a0679eadb3c0725f6b1bc168bba6375eeea33b4ab40f51636", + "previousLedgerHash": "77172844c966b469aed8619a331b85d995590d352de312e9f6ccf80a56d2a427", "phases": [ { "v": 0, diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27-soroban.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27-soroban.json new file mode 100644 index 0000000000..d8a4f3dc6e --- /dev/null +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27-soroban.json @@ -0,0 +1,2405 @@ +{ + "LedgerCloseMeta": { + "v": 2, + "v2": { + "ext": { + "v": 0 + }, + "ledgerHeader": { + "hash": "ed981cfd30c258332e48a147884050dfabc6a649d07abc534beb6674f083cba9", + "header": { + "ledgerVersion": 27, + "previousLedgerHash": "c5bdc38330819689457c18ae819c0f46afaea87d10dde12803defe48f5036d36", + "scpValue": { + "txSetHash": "9c2ff9d54bb33b65eb0b5e3f31e4a3807432030f2d8b5b1ebb2ca746616fde55", + "closeTime": 1451692801, + "upgrades": [], + "ext": { + "v": "STELLAR_VALUE_SIGNED", + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "c818c18ec18de2bb9b62f0f5e44ab1211ee8724c50c39cf832630f0ea2647a140a3e865a9a2928aa5509c68f80ead8224a820bfff78b1824e95e90879e4dea00" + } + } + }, + "txSetResultHash": "fc6de71aa5fddf71e9e02fc24863156b9427337e7e5a03f4918bf5d062cf9633", + "bucketListHash": "701471dc92688289cb2862c3b4eacd408cf1d7b8a7d0e4dfa66a5c743ea18c06", + "ledgerSeq": 31, + "totalCoins": 1000000000000000000, + "feePool": 9167489, + "inflationSeq": 0, + "idPool": 0, + "baseFee": 100, + "baseReserve": 100000000, + "maxTxSetSize": 50, + "skipList": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "ext": { + "v": 0 + } + }, + "ext": { + "v": 0 + } + }, + "txSet": { + "v": 1, + "v1TxSet": { + "previousLedgerHash": "c5bdc38330819689457c18ae819c0f46afaea87d10dde12803defe48f5036d36", + "phases": [ + { + "v": 0, + "v0Components": [] + }, + { + "v": 1, + "parallelTxsComponent": { + "baseFee": 100, + "executionStages": [ + [ + [ + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "fee": 115067, + "seqNum": 55834574849, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_INVOKE_CONTRACT", + "invokeContract": { + "contractAddress": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "functionName": "put_persistent", + "args": [ + { + "type": "SCV_SYMBOL", + "sym": "key" + }, + { + "type": "SCV_U64", + "u64": 42 + } + ] + } + }, + "auth": [] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "key" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 4000000, + "diskReadBytes": 10000, + "writeBytes": 1000 + }, + "resourceFee": 114067 + } + } + }, + "signatures": [ + { + "hint": "e189b409", + "signature": "007eac869b9a851452dec85b4362aa9b54630b2f0d19c33ddbb1442e1077b5bf1861f32b6178baca0ece4bf6c0dfa42518242d603094c9cd01ca05e61e53550c" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "fee": 1001000, + "seqNum": 47244640257, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "RESTORE_FOOTPRINT", + "restoreFootprintOp": { + "ext": { + "v": 0 + } + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 0, + "diskReadBytes": 5000, + "writeBytes": 1000 + }, + "resourceFee": 1000000 + } + } + }, + "signatures": [ + { + "hint": "5099a12e", + "signature": "9d780400d1862cedac6d6668b979c13e48ad55f9efcb248d6861f78f5ecbf9ffe63555d3d6f0550fc06e817f6320824dcc67eb2958a5f0b71e08d0c09cd3fe09" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "fee": 1001000, + "seqNum": 51539607553, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLOp": { + "ext": { + "v": 0 + }, + "extendTo": 10000 + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [] + }, + "instructions": 0, + "diskReadBytes": 10000, + "writeBytes": 0 + }, + "resourceFee": 1000000 + } + } + }, + "signatures": [ + { + "hint": "f7f60229", + "signature": "ba601bc5dfef9bcb5f76af4bd5ef1761f4d7c187b7e939361f0b61d72483417aa3a5546475773c332d58df6754f448dd0ebce054f33e058ca9922f2e3fbd5404" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "fee": 1047062, + "seqNum": 64424509441, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_CREATE_CONTRACT", + "createContract": { + "contractIDPreimage": { + "type": "CONTRACT_ID_PREIMAGE_FROM_ADDRESS", + "fromAddress": { + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "salt": "63479ad69a090b258277ec8fba6f99419a2ffb248981510657c944ccd1148e97" + } + }, + "executable": { + "type": "CONTRACT_EXECUTABLE_WASM", + "wasm_hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + } + }, + "auth": [ + { + "credentials": { + "type": "SOROBAN_CREDENTIALS_SOURCE_ACCOUNT" + }, + "rootInvocation": { + "function": { + "type": "SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN", + "createContractV2HostFn": { + "contractIDPreimage": { + "type": "CONTRACT_ID_PREIMAGE_FROM_ADDRESS", + "fromAddress": { + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "salt": "63479ad69a090b258277ec8fba6f99419a2ffb248981510657c944ccd1148e97" + } + }, + "executable": { + "type": "CONTRACT_EXECUTABLE_WASM", + "wasm_hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + }, + "constructorArgs": [] + } + }, + "subInvocations": [] + } + } + ] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + } + ], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CCOKSYPZJ2B3244CEMLBGUGWPMQ3BLES6AKHRQCX2XF27K4HDBW2LKDF", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 200000, + "diskReadBytes": 5000, + "writeBytes": 5000 + }, + "resourceFee": 1046062 + } + } + }, + "signatures": [ + { + "hint": "4b80097b", + "signature": "ac47fe57439d26f7dde2af6b212a6ecd21c9d87e041a05e87b2e1fc6f204fee2880f782d794d1e157b38116d3000958ee9b8cae617383d88330e406d5a98ed06" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "fee": 94953, + "seqNum": 60129542145, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_INVOKE_CONTRACT", + "invokeContract": { + "contractAddress": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "functionName": "put_persistent", + "args": [ + { + "type": "SCV_SYMBOL", + "sym": "key" + }, + { + "type": "SCV_U64", + "u64": 42 + } + ] + } + }, + "auth": [] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [] + }, + "instructions": 4000000, + "diskReadBytes": 10000, + "writeBytes": 1000 + }, + "resourceFee": 93953 + } + } + }, + "signatures": [ + { + "hint": "477df904", + "signature": "2c9522eed2f7a214dfd2efb589ba51e1a91d37cef037453fb7ccbc565bf29b48b395632a8bb3ee104ca59caffe55d03863cf005173b3ba1076d593520eda560c" + } + ] + } + } + ] + ] + ] + } + } + ] + } + }, + "txProcessing": [ + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "result": { + "feeCharged": 51269, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 12, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 1000100 + } + } + } + } + } + }, + { + "stage": "TRANSACTION_EVENT_STAGE_AFTER_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": -1, + "lo": 18446744073708602785 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "result": { + "feeCharged": 54107, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 11, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 400000000, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 1000100 + } + } + } + } + } + }, + { + "stage": "TRANSACTION_EVENT_STAGE_AFTER_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": -1, + "lo": 18446744073708605623 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "result": { + "feeCharged": 54053, + "result": { + "code": "txFAILED", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 14, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 400000000, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 94053 + } + } + } + } + } + }, + { + "stage": "TRANSACTION_EVENT_STAGE_AFTER_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": -1, + "lo": 18446744073709511616 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "result": { + "feeCharged": 45161, + "result": { + "code": "txFAILED", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 15, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 400000000, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 1046162 + } + } + } + } + } + }, + { + "stage": "TRANSACTION_EVENT_STAGE_AFTER_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": -1, + "lo": 18446744073708550615 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", + "result": { + "feeCharged": 94335, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_SUCCESS", + "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 13, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 400000000, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "key" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": { + "type": "SCV_VOID" + } + }, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 114167 + } + } + } + } + } + }, + { + "stage": "TRANSACTION_EVENT_STAGE_AFTER_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": -1, + "lo": 18446744073709531784 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399905665, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + } + ], + "upgradesProcessing": [], + "scpInfo": [], + "totalByteSizeOfLiveSorobanState": 0, + "evictedKeys": [] + } + } +} \ No newline at end of file diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27.json new file mode 100644 index 0000000000..d13dbf45f2 --- /dev/null +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-27.json @@ -0,0 +1,1187 @@ +{ + "LedgerCloseMeta": { + "v": 2, + "v2": { + "ext": { + "v": 0 + }, + "ledgerHeader": { + "hash": "08a3c518dda13b7af3857bb044a5811fff26a38842a9cd96b718d650109208c3", + "header": { + "ledgerVersion": 27, + "previousLedgerHash": "f2539eb5d342e57a950726eabb330b523cee5bd2ed428a0fa4356dc83469717a", + "scpValue": { + "txSetHash": "9fdbfdf338235f2cf9fdce939511b9e47f155bac1e3e1d10048d95613778e686", + "closeTime": 1451692801, + "upgrades": [], + "ext": { + "v": "STELLAR_VALUE_SIGNED", + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "5014311eab4efd357b837e7ce73862352c47032b3aaf958c14a29822b2d52773bf7071ba1c35dbccc82ba3e03b9303cd52097d6c252ef56718acc83a85ab000c" + } + } + }, + "txSetResultHash": "7f284d6f6089dcf4f3b44a28922ac95858dcbfc529cadb03e4ebc4d20a558dea", + "bucketListHash": "8b20f3a53f1a02bbfeda4cf3cc7bab13460e950467a0017e821a840697f33aa2", + "ledgerSeq": 10, + "totalCoins": 1000000000000000000, + "feePool": 8198834, + "inflationSeq": 0, + "idPool": 0, + "baseFee": 100, + "baseReserve": 100000000, + "maxTxSetSize": 50, + "skipList": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "ext": { + "v": 0 + } + }, + "ext": { + "v": 0 + } + }, + "txSet": { + "v": 1, + "v1TxSet": { + "previousLedgerHash": "f2539eb5d342e57a950726eabb330b523cee5bd2ed428a0fa4356dc83469717a", + "phases": [ + { + "v": 0, + "v0Components": [ + { + "type": "TXSET_COMP_TXS_MAYBE_DISCOUNTED_FEE", + "txsMaybeDiscountedFee": { + "baseFee": 100, + "txs": [ + { + "type": "ENVELOPE_TYPE_TX_FEE_BUMP", + "feeBump": { + "tx": { + "feeSource": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "fee": 5000, + "innerTx": { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "fee": 200, + "seqNum": 34359738369, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "amount": 50 + } + } + }, + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "amount": 50 + } + } + } + ], + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "eaf6bc36", + "signature": "f7c361e026d4e87c6382e0944853435f4824baed351fd8505bf99f3b8c388f27af01cb6fecca27464c9209931b4c54928309b254dc76e2517d0ab765c834d40b" + } + ] + } + }, + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "f7f60229", + "signature": "cc1309e69fcb4d1fb4cd6574f85d19d11fe618b5092bead7a6dba1e7389424ac70af253ff9b9710509be1440492eafed20d88b7dba22b9a179c4a8756dc3880c" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "fee": 100, + "seqNum": 7, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": "NATIVE", + "amount": 1000 + } + } + } + ], + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "b57ff246", + "signature": "fbfe70497b6dc60186c656f4da460bb2c457be53a8e779b1764b45cb59bbe19bd0e1ef7a7aa6219b662e93cefdf1b4b944c420990bb56718a6198ddad7b9a001" + } + ] + } + } + ] + } + } + ] + }, + { + "v": 1, + "parallelTxsComponent": { + "baseFee": null, + "executionStages": [] + } + } + ] + } + }, + "txProcessing": [ + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", + "result": { + "feeCharged": 100, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 8, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791666, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399999900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 400000900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991790566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [ + { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "transfer" + }, + { + "type": "SCV_ADDRESS", + "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + }, + { + "type": "SCV_STRING", + "str": "native" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + } + ] + } + ], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 100 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", + "result": { + "feeCharged": 300, + "result": { + "code": "txFEE_BUMP_INNER_SUCCESS", + "innerResultPair": { + "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", + "result": { + "feeCharged": 0, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + }, + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 7, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 8, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738368, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738369, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 0, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [ + { + "ext": { + "v": 0 + }, + "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "mint" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + }, + { + "type": "SCV_STRING", + "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 50 + } + } + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 100, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [ + { + "ext": { + "v": 0 + }, + "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "mint" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + }, + { + "type": "SCV_STRING", + "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 50 + } + } + } + } + } + ] + } + ], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [ + { + "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", + "event": { + "ext": { + "v": 0 + }, + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "fee" + }, + { + "type": "SCV_ADDRESS", + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 300 + } + } + } + } + } + } + ], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [] + } + ], + "upgradesProcessing": [], + "scpInfo": [], + "totalByteSizeOfLiveSorobanState": 5644, + "evictedKeys": [] + } + } +} \ No newline at end of file diff --git a/src/testdata/ledger-close-meta-v2-protocol-26-soroban.json b/src/testdata/ledger-close-meta-v2-protocol-26-soroban.json index 4122f751f9..1aeafc0a09 100644 --- a/src/testdata/ledger-close-meta-v2-protocol-26-soroban.json +++ b/src/testdata/ledger-close-meta-v2-protocol-26-soroban.json @@ -6,24 +6,24 @@ "v": 0 }, "ledgerHeader": { - "hash": "f8e249ac924d72fe4b2a5bd6b28717b1d164fe0b5c7d32d64d7c27b63d7f70d7", + "hash": "059f74d286f715f5cb199115afe231ae62c98a665cbe6223eca865f6e03e4711", "header": { "ledgerVersion": 26, - "previousLedgerHash": "c5be64a7ce74a1a5d2950fb12c1542cb6cc2d69dfa0af500d84751a1812a36e7", + "previousLedgerHash": "7584ec52c748b8c4ad78730fe47b3e2528e47fd95dad346ca3c1eb61248a55ab", "scpValue": { - "txSetHash": "8fc7e93ed2170bf10afa649c59868ab3a4a9c6511b9e21d9a69a3c973d7ba0b5", + "txSetHash": "7eeacd54ebfb80905aab2931876c09b5da9324d7d2d704245c0a90189ef52cfd", "closeTime": 1451692801, "upgrades": [], "ext": { "v": "STELLAR_VALUE_SIGNED", "lcValueSignature": { "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "c0fe7e296a63c47976c65d0443ffe293df794f83243b02954011e2073b20213f5bcff79a1ee67d9a7ae8d18db2dbc7a9059831547fd7c8f1c3a53910f8304f07" + "signature": "43c151074ef7c010bc6ed7b78e93251370144d39c694f4f2b7d8cb35df87729b97cd3957b42bc541cb2f4c0401974bb563f8e1fc189b5057327f5e6e9773cb04" } } }, - "txSetResultHash": "d3bde14b15428d27136e8ce2b0f86cf9c84b9cacfd3258317e382187b5e2f08e", - "bucketListHash": "3e9b4cc079d0fdf987005647ac5b891aa0c313eb95f2d5f3c5ef4c711477fae9", + "txSetResultHash": "7f990d484919d1099f8d79eaf2780b3d19363dc01f7a15bb4f8b0881c5db9bcf", + "bucketListHash": "bafbb8761cb8d2dca18ad3eada232def91a210823c3b10d7ca29773bd3b64297", "ledgerSeq": 31, "totalCoins": 1000000000000000000, "feePool": 9167489, @@ -49,7 +49,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "c5be64a7ce74a1a5d2950fb12c1542cb6cc2d69dfa0af500d84751a1812a36e7", + "previousLedgerHash": "7584ec52c748b8c4ad78730fe47b3e2528e47fd95dad346ca3c1eb61248a55ab", "phases": [ { "v": 0, @@ -505,18 +505,19 @@ "v": 0 }, "result": { - "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", "result": { - "feeCharged": 54107, + "feeCharged": 94335, "result": { "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "RESTORE_FOOTPRINT", - "restoreFootprintResult": { - "code": "RESTORE_FOOTPRINT_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_SUCCESS", + "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" } } } @@ -531,13 +532,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 11, + "lastModifiedLedgerSeq": 13, "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", "balance": 400000000, - "seqNum": 47244640256, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -561,9 +562,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -595,9 +596,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -621,9 +622,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -672,9 +673,9 @@ }, "changes": [ { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 10, + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, "data": { "type": "CONTRACT_DATA", "contractData": { @@ -684,7 +685,7 @@ "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", "key": { "type": "SCV_SYMBOL", - "sym": "archived" + "sym": "key" }, "durability": "PERSISTENT", "val": { @@ -699,13 +700,13 @@ } }, { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { + "type": "LEDGER_ENTRY_CREATED", + "created": { "lastModifiedLedgerSeq": 31, "data": { "type": "TTL", "ttl": { - "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", "liveUntilLedgerSeq": 50 } }, @@ -723,7 +724,9 @@ "ext": { "v": 0 }, - "returnValue": null + "returnValue": { + "type": "SCV_VOID" + } }, "events": [], "diagnosticEvents": [] @@ -737,9 +740,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -787,9 +790,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399945893, - "seqNum": 47244640257, + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399905665, + "seqNum": 55834574849, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -837,18 +840,18 @@ "v": 0 }, "result": { - "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", "result": { - "feeCharged": 51269, + "feeCharged": 54053, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "EXTEND_FOOTPRINT_TTL", - "extendFootprintTTLResult": { - "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" } } } @@ -863,13 +866,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 12, + "lastModifiedLedgerSeq": 14, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", "balance": 400000000, - "seqNum": 51539607552, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -893,9 +896,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -927,9 +930,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -953,9 +956,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -997,87 +1000,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [], "diagnosticEvents": [] } @@ -1090,9 +1015,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1140,9 +1065,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399948731, - "seqNum": 51539607553, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1190,9 +1115,9 @@ "v": 0 }, "result": { - "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", "result": { - "feeCharged": 54053, + "feeCharged": 45161, "result": { "code": "txFAILED", "results": [ @@ -1201,7 +1126,7 @@ "tr": { "type": "INVOKE_HOST_FUNCTION", "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_TRAPPED" + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" } } } @@ -1216,13 +1141,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 14, + "lastModifiedLedgerSeq": 15, "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", "balance": 400000000, - "seqNum": 60129542144, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1246,9 +1171,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1280,9 +1205,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1306,9 +1231,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1365,9 +1290,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1415,9 +1340,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399945947, - "seqNum": 60129542145, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1465,18 +1390,18 @@ "v": 0 }, "result": { - "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", "result": { - "feeCharged": 45161, + "feeCharged": 51269, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" } } } @@ -1491,13 +1416,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 15, + "lastModifiedLedgerSeq": 12, "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", "balance": 400000000, - "seqNum": 64424509440, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1521,9 +1446,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1555,9 +1480,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1581,9 +1506,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1625,9 +1550,87 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [], "diagnosticEvents": [] } @@ -1640,9 +1643,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1690,9 +1693,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 399954839, - "seqNum": 64424509441, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1740,19 +1743,18 @@ "v": 0 }, "result": { - "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", "result": { - "feeCharged": 94335, + "feeCharged": 54107, "result": { "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_SUCCESS", - "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" } } } @@ -1767,13 +1769,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 13, + "lastModifiedLedgerSeq": 11, "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", "balance": 400000000, - "seqNum": 55834574848, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1797,9 +1799,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574848, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1831,9 +1833,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574848, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1857,9 +1859,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1908,9 +1910,9 @@ }, "changes": [ { - "type": "LEDGER_ENTRY_CREATED", - "created": { - "lastModifiedLedgerSeq": 31, + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, "data": { "type": "CONTRACT_DATA", "contractData": { @@ -1920,7 +1922,7 @@ "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", "key": { "type": "SCV_SYMBOL", - "sym": "key" + "sym": "archived" }, "durability": "PERSISTENT", "val": { @@ -1935,13 +1937,13 @@ } }, { - "type": "LEDGER_ENTRY_CREATED", - "created": { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { "lastModifiedLedgerSeq": 31, "data": { "type": "TTL", "ttl": { - "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", "liveUntilLedgerSeq": 50 } }, @@ -1959,9 +1961,7 @@ "ext": { "v": 0 }, - "returnValue": { - "type": "SCV_VOID" - } + "returnValue": null }, "events": [], "diagnosticEvents": [] @@ -1975,9 +1975,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399885833, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -2025,9 +2025,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", - "balance": 399905665, - "seqNum": 55834574849, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, diff --git a/src/testdata/ledger-close-meta-v2-protocol-26.json b/src/testdata/ledger-close-meta-v2-protocol-26.json index 3d25288e3f..4258ad42c7 100644 --- a/src/testdata/ledger-close-meta-v2-protocol-26.json +++ b/src/testdata/ledger-close-meta-v2-protocol-26.json @@ -6,24 +6,24 @@ "v": 0 }, "ledgerHeader": { - "hash": "49f60c4293eda65a3c1835406896cf6f01e6b1432a2e51183e18c1da57c15856", + "hash": "83d6e4f873f0336d83d32db3485f6ead2073ed35784ed6493860bea412c245db", "header": { "ledgerVersion": 26, - "previousLedgerHash": "a570dae70759517a0679eadb3c0725f6b1bc168bba6375eeea33b4ab40f51636", + "previousLedgerHash": "77172844c966b469aed8619a331b85d995590d352de312e9f6ccf80a56d2a427", "scpValue": { - "txSetHash": "3ef32e66de0ec1a08474e8e4b29aa6895464d634553f6b8d27386c0a78f1d045", + "txSetHash": "4e7c372203401e64ae7968d66e6ed6fbfca758dd416d8599bc121ef109d787ff", "closeTime": 1451692801, "upgrades": [], "ext": { "v": "STELLAR_VALUE_SIGNED", "lcValueSignature": { "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "1d555e1369037e6f5290b3fc7a185bebd7ee7ec1b5e7442fa2a5057c2505977e6b7a515e57ceb35efcf1458d74fff773621e45329c667e15c2eb18aff167e404" + "signature": "174c749e9f54febf519f85b3266d6da33001356b2d17c1975c69a797d9777d141d4075445f9fc4ded298b2dc2a426d33db857148b73e6c960e7f598a2ae5a90b" } } }, "txSetResultHash": "fd6fb3b06784653ffa2057ae36184c8d9ee185c4ae35f0ba9e076059746fb659", - "bucketListHash": "8fac2c03cca5f9f6b335f75e724b66800b8ce29f9949795793baa24b3fcb7ccb", + "bucketListHash": "29b124ff2c559a17e620a1d2bc6a183c45c59be84cce8c9a5c5348a2afb76c2a", "ledgerSeq": 10, "totalCoins": 1000000000000000000, "feePool": 8198834, @@ -49,7 +49,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "a570dae70759517a0679eadb3c0725f6b1bc168bba6375eeea33b4ab40f51636", + "previousLedgerHash": "77172844c966b469aed8619a331b85d995590d352de312e9f6ccf80a56d2a427", "phases": [ { "v": 0, diff --git a/src/testdata/ledger-close-meta-v2-protocol-27-soroban.json b/src/testdata/ledger-close-meta-v2-protocol-27-soroban.json new file mode 100644 index 0000000000..22cba8ca09 --- /dev/null +++ b/src/testdata/ledger-close-meta-v2-protocol-27-soroban.json @@ -0,0 +1,2080 @@ +{ + "LedgerCloseMeta": { + "v": 2, + "v2": { + "ext": { + "v": 0 + }, + "ledgerHeader": { + "hash": "ed981cfd30c258332e48a147884050dfabc6a649d07abc534beb6674f083cba9", + "header": { + "ledgerVersion": 27, + "previousLedgerHash": "c5bdc38330819689457c18ae819c0f46afaea87d10dde12803defe48f5036d36", + "scpValue": { + "txSetHash": "9c2ff9d54bb33b65eb0b5e3f31e4a3807432030f2d8b5b1ebb2ca746616fde55", + "closeTime": 1451692801, + "upgrades": [], + "ext": { + "v": "STELLAR_VALUE_SIGNED", + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "c818c18ec18de2bb9b62f0f5e44ab1211ee8724c50c39cf832630f0ea2647a140a3e865a9a2928aa5509c68f80ead8224a820bfff78b1824e95e90879e4dea00" + } + } + }, + "txSetResultHash": "fc6de71aa5fddf71e9e02fc24863156b9427337e7e5a03f4918bf5d062cf9633", + "bucketListHash": "701471dc92688289cb2862c3b4eacd408cf1d7b8a7d0e4dfa66a5c743ea18c06", + "ledgerSeq": 31, + "totalCoins": 1000000000000000000, + "feePool": 9167489, + "inflationSeq": 0, + "idPool": 0, + "baseFee": 100, + "baseReserve": 100000000, + "maxTxSetSize": 50, + "skipList": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "ext": { + "v": 0 + } + }, + "ext": { + "v": 0 + } + }, + "txSet": { + "v": 1, + "v1TxSet": { + "previousLedgerHash": "c5bdc38330819689457c18ae819c0f46afaea87d10dde12803defe48f5036d36", + "phases": [ + { + "v": 0, + "v0Components": [] + }, + { + "v": 1, + "parallelTxsComponent": { + "baseFee": 100, + "executionStages": [ + [ + [ + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "fee": 115067, + "seqNum": 55834574849, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_INVOKE_CONTRACT", + "invokeContract": { + "contractAddress": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "functionName": "put_persistent", + "args": [ + { + "type": "SCV_SYMBOL", + "sym": "key" + }, + { + "type": "SCV_U64", + "u64": 42 + } + ] + } + }, + "auth": [] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "key" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 4000000, + "diskReadBytes": 10000, + "writeBytes": 1000 + }, + "resourceFee": 114067 + } + } + }, + "signatures": [ + { + "hint": "e189b409", + "signature": "007eac869b9a851452dec85b4362aa9b54630b2f0d19c33ddbb1442e1077b5bf1861f32b6178baca0ece4bf6c0dfa42518242d603094c9cd01ca05e61e53550c" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "fee": 1001000, + "seqNum": 47244640257, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "RESTORE_FOOTPRINT", + "restoreFootprintOp": { + "ext": { + "v": 0 + } + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 0, + "diskReadBytes": 5000, + "writeBytes": 1000 + }, + "resourceFee": 1000000 + } + } + }, + "signatures": [ + { + "hint": "5099a12e", + "signature": "9d780400d1862cedac6d6668b979c13e48ad55f9efcb248d6861f78f5ecbf9ffe63555d3d6f0550fc06e817f6320824dcc67eb2958a5f0b71e08d0c09cd3fe09" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "fee": 1001000, + "seqNum": 51539607553, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLOp": { + "ext": { + "v": 0 + }, + "extendTo": 10000 + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [] + }, + "instructions": 0, + "diskReadBytes": 10000, + "writeBytes": 0 + }, + "resourceFee": 1000000 + } + } + }, + "signatures": [ + { + "hint": "f7f60229", + "signature": "ba601bc5dfef9bcb5f76af4bd5ef1761f4d7c187b7e939361f0b61d72483417aa3a5546475773c332d58df6754f448dd0ebce054f33e058ca9922f2e3fbd5404" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "fee": 1047062, + "seqNum": 64424509441, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_CREATE_CONTRACT", + "createContract": { + "contractIDPreimage": { + "type": "CONTRACT_ID_PREIMAGE_FROM_ADDRESS", + "fromAddress": { + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "salt": "63479ad69a090b258277ec8fba6f99419a2ffb248981510657c944ccd1148e97" + } + }, + "executable": { + "type": "CONTRACT_EXECUTABLE_WASM", + "wasm_hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + } + }, + "auth": [ + { + "credentials": { + "type": "SOROBAN_CREDENTIALS_SOURCE_ACCOUNT" + }, + "rootInvocation": { + "function": { + "type": "SOROBAN_AUTHORIZED_FUNCTION_TYPE_CREATE_CONTRACT_V2_HOST_FN", + "createContractV2HostFn": { + "contractIDPreimage": { + "type": "CONTRACT_ID_PREIMAGE_FROM_ADDRESS", + "fromAddress": { + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "salt": "63479ad69a090b258277ec8fba6f99419a2ffb248981510657c944ccd1148e97" + } + }, + "executable": { + "type": "CONTRACT_EXECUTABLE_WASM", + "wasm_hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + }, + "constructorArgs": [] + } + }, + "subInvocations": [] + } + } + ] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + } + ], + "readWrite": [ + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CCOKSYPZJ2B3244CEMLBGUGWPMQ3BLES6AKHRQCX2XF27K4HDBW2LKDF", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ] + }, + "instructions": 200000, + "diskReadBytes": 5000, + "writeBytes": 5000 + }, + "resourceFee": 1046062 + } + } + }, + "signatures": [ + { + "hint": "4b80097b", + "signature": "ac47fe57439d26f7dde2af6b212a6ecd21c9d87e041a05e87b2e1fc6f204fee2880f782d794d1e157b38116d3000958ee9b8cae617383d88330e406d5a98ed06" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "fee": 94953, + "seqNum": 60129542145, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionOp": { + "hostFunction": { + "type": "HOST_FUNCTION_TYPE_INVOKE_CONTRACT", + "invokeContract": { + "contractAddress": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "functionName": "put_persistent", + "args": [ + { + "type": "SCV_SYMBOL", + "sym": "key" + }, + { + "type": "SCV_U64", + "u64": 42 + } + ] + } + }, + "auth": [] + } + } + } + ], + "ext": { + "v": 1, + "sorobanData": { + "ext": { + "v": 0 + }, + "resources": { + "footprint": { + "readOnly": [ + { + "type": "CONTRACT_CODE", + "contractCode": { + "hash": "fc644715caaead746e6145f4331ff75c427c965c20d2995a9942b01247515962" + } + }, + { + "type": "CONTRACT_DATA", + "contractData": { + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_LEDGER_KEY_CONTRACT_INSTANCE" + }, + "durability": "PERSISTENT" + } + } + ], + "readWrite": [] + }, + "instructions": 4000000, + "diskReadBytes": 10000, + "writeBytes": 1000 + }, + "resourceFee": 93953 + } + } + }, + "signatures": [ + { + "hint": "477df904", + "signature": "2c9522eed2f7a214dfd2efb589ba51e1a91d37cef037453fb7ccbc565bf29b48b395632a8bb3ee104ca59caffe55d03863cf005173b3ba1076d593520eda560c" + } + ] + } + } + ] + ] + ] + } + } + ] + } + }, + "txProcessing": [ + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "result": { + "feeCharged": 51269, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 12, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "result": { + "feeCharged": 54107, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 11, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 400000000, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "result": { + "feeCharged": 54053, + "result": { + "code": "txFAILED", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 14, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 400000000, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "result": { + "feeCharged": 45161, + "result": { + "code": "txFAILED", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 15, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 400000000, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "d9d747111c25cd7e829c819f13fbfe771849c9a994dcc2dc554ac20841322f01", + "result": { + "feeCharged": 94335, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_SUCCESS", + "success": "cbbc48750debb8535093b3deaf88ac7f4cff87425576a58de2bac754acdb4616" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 13, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 400000000, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574848, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "key" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_CREATED", + "created": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "764f4e59e20ac1a357f9f26ab0eaf46d196ab74822db44f039353a6f114864aa", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": { + "type": "SCV_VOID" + } + }, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399885833, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GDWWCIR2FIWTY2D3CEDXZYRTRNTFZCC5PBCGC6XPMKCLUV7BRG2AT3RD", + "balance": 399905665, + "seqNum": 55834574849, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 31, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ] + } + ], + "upgradesProcessing": [], + "scpInfo": [], + "totalByteSizeOfLiveSorobanState": 0, + "evictedKeys": [] + } + } +} \ No newline at end of file diff --git a/src/testdata/ledger-close-meta-v2-protocol-27.json b/src/testdata/ledger-close-meta-v2-protocol-27.json new file mode 100644 index 0000000000..b64950ada6 --- /dev/null +++ b/src/testdata/ledger-close-meta-v2-protocol-27.json @@ -0,0 +1,1015 @@ +{ + "LedgerCloseMeta": { + "v": 2, + "v2": { + "ext": { + "v": 0 + }, + "ledgerHeader": { + "hash": "08a3c518dda13b7af3857bb044a5811fff26a38842a9cd96b718d650109208c3", + "header": { + "ledgerVersion": 27, + "previousLedgerHash": "f2539eb5d342e57a950726eabb330b523cee5bd2ed428a0fa4356dc83469717a", + "scpValue": { + "txSetHash": "9fdbfdf338235f2cf9fdce939511b9e47f155bac1e3e1d10048d95613778e686", + "closeTime": 1451692801, + "upgrades": [], + "ext": { + "v": "STELLAR_VALUE_SIGNED", + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "5014311eab4efd357b837e7ce73862352c47032b3aaf958c14a29822b2d52773bf7071ba1c35dbccc82ba3e03b9303cd52097d6c252ef56718acc83a85ab000c" + } + } + }, + "txSetResultHash": "7f284d6f6089dcf4f3b44a28922ac95858dcbfc529cadb03e4ebc4d20a558dea", + "bucketListHash": "8b20f3a53f1a02bbfeda4cf3cc7bab13460e950467a0017e821a840697f33aa2", + "ledgerSeq": 10, + "totalCoins": 1000000000000000000, + "feePool": 8198834, + "inflationSeq": 0, + "idPool": 0, + "baseFee": 100, + "baseReserve": 100000000, + "maxTxSetSize": 50, + "skipList": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "ext": { + "v": 0 + } + }, + "ext": { + "v": 0 + } + }, + "txSet": { + "v": 1, + "v1TxSet": { + "previousLedgerHash": "f2539eb5d342e57a950726eabb330b523cee5bd2ed428a0fa4356dc83469717a", + "phases": [ + { + "v": 0, + "v0Components": [ + { + "type": "TXSET_COMP_TXS_MAYBE_DISCOUNTED_FEE", + "txsMaybeDiscountedFee": { + "baseFee": 100, + "txs": [ + { + "type": "ENVELOPE_TYPE_TX_FEE_BUMP", + "feeBump": { + "tx": { + "feeSource": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "fee": 5000, + "innerTx": { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "fee": 200, + "seqNum": 34359738369, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "amount": 50 + } + } + }, + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "amount": 50 + } + } + } + ], + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "eaf6bc36", + "signature": "f7c361e026d4e87c6382e0944853435f4824baed351fd8505bf99f3b8c388f27af01cb6fecca27464c9209931b4c54928309b254dc76e2517d0ab765c834d40b" + } + ] + } + }, + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "f7f60229", + "signature": "cc1309e69fcb4d1fb4cd6574f85d19d11fe618b5092bead7a6dba1e7389424ac70af253ff9b9710509be1440492eafed20d88b7dba22b9a179c4a8756dc3880c" + } + ] + } + }, + { + "type": "ENVELOPE_TYPE_TX", + "v1": { + "tx": { + "sourceAccount": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "fee": 100, + "seqNum": 7, + "cond": { + "type": "PRECOND_NONE" + }, + "memo": { + "type": "MEMO_NONE" + }, + "operations": [ + { + "sourceAccount": null, + "body": { + "type": "PAYMENT", + "paymentOp": { + "destination": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": "NATIVE", + "amount": 1000 + } + } + } + ], + "ext": { + "v": 0 + } + }, + "signatures": [ + { + "hint": "b57ff246", + "signature": "fbfe70497b6dc60186c656f4da460bb2c457be53a8e779b1764b45cb59bbe19bd0e1ef7a7aa6219b662e93cefdf1b4b944c420990bb56718a6198ddad7b9a001" + } + ] + } + } + ] + } + } + ] + }, + { + "v": 1, + "parallelTxsComponent": { + "baseFee": null, + "executionStages": [] + } + } + ] + } + }, + "txProcessing": [ + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", + "result": { + "feeCharged": 100, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 8, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791666, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399999900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 400000900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991790566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [] + }, + { + "ext": { + "v": 0 + }, + "result": { + "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", + "result": { + "feeCharged": 300, + "result": { + "code": "txFEE_BUMP_INNER_SUCCESS", + "innerResultPair": { + "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", + "result": { + "feeCharged": 0, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + }, + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 + } + } + } + }, + "ext": { + "v": 0 + } + } + }, + "feeProcessing": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 7, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 8, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738368, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738369, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 0, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + }, + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 100, + "limit": 100, + "flags": 1, + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], + "txChangesAfter": [], + "sorobanMeta": null, + "events": [], + "diagnosticEvents": [] + } + }, + "postTxApplyFeeProcessing": [] + } + ], + "upgradesProcessing": [], + "scpInfo": [], + "totalByteSizeOfLiveSorobanState": 5644, + "evictedKeys": [] + } + } +} \ No newline at end of file diff --git a/src/transactions/AllowTrustOpFrame.cpp b/src/transactions/AllowTrustOpFrame.cpp index 22d2c3c932..0c4d0aed3f 100644 --- a/src/transactions/AllowTrustOpFrame.cpp +++ b/src/transactions/AllowTrustOpFrame.cpp @@ -189,4 +189,11 @@ AllowTrustOpFrame::doCheckValid(uint32_t ledgerVersion, return true; } + +bool +AllowTrustOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return sorobanConfig.isKeyFrozen(trustlineKey(mAllowTrust.trustor, mAsset)); +} } diff --git a/src/transactions/AllowTrustOpFrame.h b/src/transactions/AllowTrustOpFrame.h index 74f5fa8f80..a9bca0f38c 100644 --- a/src/transactions/AllowTrustOpFrame.h +++ b/src/transactions/AllowTrustOpFrame.h @@ -49,6 +49,9 @@ class AllowTrustOpFrame : public TrustFlagsOpFrameBase bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static AllowTrustResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/BeginSponsoringFutureReservesOpFrame.cpp b/src/transactions/BeginSponsoringFutureReservesOpFrame.cpp index 328b66a03e..7d47be534b 100644 --- a/src/transactions/BeginSponsoringFutureReservesOpFrame.cpp +++ b/src/transactions/BeginSponsoringFutureReservesOpFrame.cpp @@ -113,4 +113,11 @@ BeginSponsoringFutureReservesOpFrame::doCheckValid(uint32_t ledgerVersion, } return true; } + +bool +BeginSponsoringFutureReservesOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; } +} \ No newline at end of file diff --git a/src/transactions/BeginSponsoringFutureReservesOpFrame.h b/src/transactions/BeginSponsoringFutureReservesOpFrame.h index 5979bd9c7e..82a72da304 100644 --- a/src/transactions/BeginSponsoringFutureReservesOpFrame.h +++ b/src/transactions/BeginSponsoringFutureReservesOpFrame.h @@ -33,6 +33,9 @@ class BeginSponsoringFutureReservesOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static BeginSponsoringFutureReservesResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/BumpSequenceOpFrame.cpp b/src/transactions/BumpSequenceOpFrame.cpp index 140202afce..335f79b60a 100644 --- a/src/transactions/BumpSequenceOpFrame.cpp +++ b/src/transactions/BumpSequenceOpFrame.cpp @@ -79,4 +79,11 @@ BumpSequenceOpFrame::doCheckValid(uint32_t ledgerVersion, } return true; } + +bool +BumpSequenceOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; } +} \ No newline at end of file diff --git a/src/transactions/BumpSequenceOpFrame.h b/src/transactions/BumpSequenceOpFrame.h index beddc077fa..c0f512a05f 100644 --- a/src/transactions/BumpSequenceOpFrame.h +++ b/src/transactions/BumpSequenceOpFrame.h @@ -32,6 +32,9 @@ class BumpSequenceOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static BumpSequenceResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ChangeTrustOpFrame.cpp b/src/transactions/ChangeTrustOpFrame.cpp index b9482a33ba..b2c5736d21 100644 --- a/src/transactions/ChangeTrustOpFrame.cpp +++ b/src/transactions/ChangeTrustOpFrame.cpp @@ -3,6 +3,7 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "ChangeTrustOpFrame.h" +#include "crypto/SHA.h" #include "database/Database.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" @@ -339,4 +340,30 @@ ChangeTrustOpFrame::doCheckValid(uint32_t ledgerVersion, } return true; } + +bool +ChangeTrustOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + auto const& ct = mChangeTrust; + if (ct.line.type() == ASSET_TYPE_CREDIT_ALPHANUM4 || + ct.line.type() == ASSET_TYPE_CREDIT_ALPHANUM12) + { + Asset asset; + asset.type(ct.line.type()); + if (ct.line.type() == ASSET_TYPE_CREDIT_ALPHANUM4) + { + asset.alphaNum4() = ct.line.alphaNum4(); + } + else + { + asset.alphaNum12() = ct.line.alphaNum12(); + } + if (sorobanConfig.isKeyFrozen(trustlineKey(getSourceID(), asset))) + { + return true; + } + } + return false; +} } diff --git a/src/transactions/ChangeTrustOpFrame.h b/src/transactions/ChangeTrustOpFrame.h index 654f04b6c7..8ca610cb50 100644 --- a/src/transactions/ChangeTrustOpFrame.h +++ b/src/transactions/ChangeTrustOpFrame.h @@ -36,6 +36,9 @@ class ChangeTrustOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static ChangeTrustResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ClaimClaimableBalanceOpFrame.cpp b/src/transactions/ClaimClaimableBalanceOpFrame.cpp index fec0d4c458..456ab923e9 100644 --- a/src/transactions/ClaimClaimableBalanceOpFrame.cpp +++ b/src/transactions/ClaimClaimableBalanceOpFrame.cpp @@ -7,15 +7,17 @@ #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" +#include "ledger/NetworkConfig.h" #include "ledger/TrustLineWrapper.h" #include "transactions/SponsorshipUtils.h" #include "transactions/TransactionUtils.h" #include "util/ProtocolVersion.h" #include +#include +#include namespace stellar { - ClaimClaimableBalanceOpFrame::ClaimClaimableBalanceOpFrame( Operation const& op, TransactionFrame const& parentTx) : OperationFrame(op, parentTx) @@ -23,6 +25,32 @@ ClaimClaimableBalanceOpFrame::ClaimClaimableBalanceOpFrame( { } +bool +ClaimClaimableBalanceOpFrame::accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + Asset const& asset, OperationResult& res) const +{ + if (!sorobanConfig || !sorobanConfig->hasFrozenKeys()) + { + return false; + } + LedgerKey keyToCheck; + if (asset.type() == ASSET_TYPE_NATIVE) + { + keyToCheck = accountKey(getSourceID()); + } + else + { + keyToCheck = trustlineKey(getSourceID(), asset); + } + if (sorobanConfig->isKeyFrozen(keyToCheck)) + { + innerResult(res).code(CLAIM_CLAIMABLE_BALANCE_TRUSTLINE_FROZEN); + return true; + } + return false; +} + ThresholdLevel ClaimClaimableBalanceOpFrame::getThresholdLevel() const { @@ -73,12 +101,22 @@ bool ClaimClaimableBalanceOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("ClaimClaimableBalanceOp may only be applied with " + "doApply overload accepting sorobanConfig"); +} + +bool +ClaimClaimableBalanceOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "ClaimClaimableBalanceOpFrame apply", true); auto claimableBalanceLtxEntry = stellar::loadClaimableBalance(ltx, mClaimClaimableBalance.balanceID); - if (!claimableBalanceLtxEntry) + if (!static_cast(claimableBalanceLtxEntry)) { innerResult(res).code(CLAIM_CLAIMABLE_BALANCE_DOES_NOT_EXIST); return false; @@ -103,7 +141,14 @@ ClaimClaimableBalanceOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, } auto const& asset = claimableBalance.asset; + // CAP-77: Check if the relevant key is frozen before claiming. + if (accessesFrozenKeyAtApplyTime(sorobanConfig, asset, res)) + { + return false; + } + auto amount = claimableBalance.amount; + if (asset.type() == ASSET_TYPE_NATIVE) { auto sourceAccount = loadSourceAccount(ltx, header); @@ -161,4 +206,13 @@ ClaimClaimableBalanceOpFrame::insertLedgerKeysToPrefetch( { keys.emplace(claimableBalanceKey(mClaimClaimableBalance.balanceID)); } + +bool +ClaimClaimableBalanceOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Checks for the frozen keys are done at apply time in + // accessesFrozenKeyAtApplyTime, we can't check anything at validation time. + return false; +} } diff --git a/src/transactions/ClaimClaimableBalanceOpFrame.h b/src/transactions/ClaimClaimableBalanceOpFrame.h index c5b5e29074..ed932851ef 100644 --- a/src/transactions/ClaimClaimableBalanceOpFrame.h +++ b/src/transactions/ClaimClaimableBalanceOpFrame.h @@ -22,6 +22,10 @@ class ClaimClaimableBalanceOpFrame : public OperationFrame ClaimClaimableBalanceOp const& mClaimClaimableBalance; + bool accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + Asset const& asset, OperationResult& res) const; + public: ClaimClaimableBalanceOpFrame(Operation const& op, TransactionFrame const& parentTx); @@ -31,11 +35,18 @@ class ClaimClaimableBalanceOpFrame : public OperationFrame bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static ClaimClaimableBalanceResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ClawbackClaimableBalanceOpFrame.cpp b/src/transactions/ClawbackClaimableBalanceOpFrame.cpp index e2c639c104..8dd33f7308 100644 --- a/src/transactions/ClawbackClaimableBalanceOpFrame.cpp +++ b/src/transactions/ClawbackClaimableBalanceOpFrame.cpp @@ -96,4 +96,11 @@ ClawbackClaimableBalanceOpFrame::insertLedgerKeysToPrefetch( { keys.emplace(claimableBalanceKey(mClawbackClaimableBalance.balanceID)); } + +bool +ClawbackClaimableBalanceOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; +} } diff --git a/src/transactions/ClawbackClaimableBalanceOpFrame.h b/src/transactions/ClawbackClaimableBalanceOpFrame.h index df489dd29f..41c197bc65 100644 --- a/src/transactions/ClawbackClaimableBalanceOpFrame.h +++ b/src/transactions/ClawbackClaimableBalanceOpFrame.h @@ -35,6 +35,9 @@ class ClawbackClaimableBalanceOpFrame : public OperationFrame void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static ClawbackClaimableBalanceResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ClawbackOpFrame.cpp b/src/transactions/ClawbackOpFrame.cpp index 1c4984ebe6..d8784f979d 100644 --- a/src/transactions/ClawbackOpFrame.cpp +++ b/src/transactions/ClawbackOpFrame.cpp @@ -106,4 +106,12 @@ ClawbackOpFrame::insertLedgerKeysToPrefetch(UnorderedSet& keys) const trustlineKey(toAccountID(mClawback.from), mClawback.asset)); } } + +bool +ClawbackOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return sorobanConfig.isKeyFrozen( + trustlineKey(toAccountID(mClawback.from), mClawback.asset)); +} } diff --git a/src/transactions/ClawbackOpFrame.h b/src/transactions/ClawbackOpFrame.h index 84682cdc12..39fc779a80 100644 --- a/src/transactions/ClawbackOpFrame.h +++ b/src/transactions/ClawbackOpFrame.h @@ -34,6 +34,9 @@ class ClawbackOpFrame : public OperationFrame void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static ClawbackResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/CreateAccountOpFrame.cpp b/src/transactions/CreateAccountOpFrame.cpp index b8f38af991..31882c8ce9 100644 --- a/src/transactions/CreateAccountOpFrame.cpp +++ b/src/transactions/CreateAccountOpFrame.cpp @@ -198,4 +198,11 @@ CreateAccountOpFrame::insertLedgerKeysToPrefetch( { keys.emplace(accountKey(mCreateAccount.destination)); } + +bool +CreateAccountOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return sorobanConfig.isKeyFrozen(accountKey(mCreateAccount.destination)); +} } diff --git a/src/transactions/CreateAccountOpFrame.h b/src/transactions/CreateAccountOpFrame.h index e4514be8ac..2fc0a6d9d5 100644 --- a/src/transactions/CreateAccountOpFrame.h +++ b/src/transactions/CreateAccountOpFrame.h @@ -35,6 +35,9 @@ class CreateAccountOpFrame : public OperationFrame void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static CreateAccountResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/CreateClaimableBalanceOpFrame.cpp b/src/transactions/CreateClaimableBalanceOpFrame.cpp index cf6953017a..adb7dcbb49 100644 --- a/src/transactions/CreateClaimableBalanceOpFrame.cpp +++ b/src/transactions/CreateClaimableBalanceOpFrame.cpp @@ -319,4 +319,13 @@ CreateClaimableBalanceOpFrame::getBalanceID() const return xdrSha256(hashPreimage); } + +bool +CreateClaimableBalanceOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return mCreateClaimableBalance.asset.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen( + trustlineKey(getSourceID(), mCreateClaimableBalance.asset)); +} } diff --git a/src/transactions/CreateClaimableBalanceOpFrame.h b/src/transactions/CreateClaimableBalanceOpFrame.h index 64057d0352..659e711fc0 100644 --- a/src/transactions/CreateClaimableBalanceOpFrame.h +++ b/src/transactions/CreateClaimableBalanceOpFrame.h @@ -39,6 +39,9 @@ class CreateClaimableBalanceOpFrame : public OperationFrame void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static CreateClaimableBalanceResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/EndSponsoringFutureReservesOpFrame.cpp b/src/transactions/EndSponsoringFutureReservesOpFrame.cpp index 3664ea96b8..e0d96b45b8 100644 --- a/src/transactions/EndSponsoringFutureReservesOpFrame.cpp +++ b/src/transactions/EndSponsoringFutureReservesOpFrame.cpp @@ -73,4 +73,11 @@ EndSponsoringFutureReservesOpFrame::doCheckValid(uint32_t ledgerVersion, { return true; } + +bool +EndSponsoringFutureReservesOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; +} } diff --git a/src/transactions/EndSponsoringFutureReservesOpFrame.h b/src/transactions/EndSponsoringFutureReservesOpFrame.h index 9d5ef61a8f..87e1ddf723 100644 --- a/src/transactions/EndSponsoringFutureReservesOpFrame.h +++ b/src/transactions/EndSponsoringFutureReservesOpFrame.h @@ -29,6 +29,9 @@ class EndSponsoringFutureReservesOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static EndSponsoringFutureReservesResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ExtendFootprintTTLOpFrame.cpp b/src/transactions/ExtendFootprintTTLOpFrame.cpp index 17fe609a20..a1e960b0de 100644 --- a/src/transactions/ExtendFootprintTTLOpFrame.cpp +++ b/src/transactions/ExtendFootprintTTLOpFrame.cpp @@ -253,20 +253,14 @@ class ExtendFootprintTTLParallelApplyHelper return true; } - ParallelTxReturnVal - takeSuccess() + std::optional + takeResult(bool success) { - return mTxState.takeSuccess(); - } - - ParallelTxReturnVal - takeFailure() - { - return mTxState.takeFailure(); + return mTxState.takeResult(success); } }; -ParallelTxReturnVal +std::optional ExtendFootprintTTLOpFrame::doParallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& _txPrngSeed, @@ -281,14 +275,7 @@ ExtendFootprintTTLOpFrame::doParallelApply( PARALLEL_SOROBAN_PHASE_PROTOCOL_VERSION)); ExtendFootprintTTLParallelApplyHelper helper( app, threadState, ledgerInfo, res, refundableFeeTracker, opMeta, *this); - if (helper.apply()) - { - return helper.takeSuccess(); - } - else - { - return helper.takeFailure(); - } + return helper.takeResult(helper.apply()); } bool @@ -393,4 +380,13 @@ ExtendFootprintTTLOpFrame::getThresholdLevel() const return ThresholdLevel::LOW; } +bool +ExtendFootprintTTLOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Soroban footprint checks happen at transaction level, so we can safely + // say that the operation itself doesn't access frozen keys. + return false; +} + } diff --git a/src/transactions/ExtendFootprintTTLOpFrame.h b/src/transactions/ExtendFootprintTTLOpFrame.h index 9830365239..72138d2837 100644 --- a/src/transactions/ExtendFootprintTTLOpFrame.h +++ b/src/transactions/ExtendFootprintTTLOpFrame.h @@ -40,7 +40,7 @@ class ExtendFootprintTTLOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; - ParallelTxReturnVal + std::optional doParallelApply(AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -62,6 +62,9 @@ class ExtendFootprintTTLOpFrame : public OperationFrame ThresholdLevel getThresholdLevel() const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + friend class ExtendFootprintTTLApplyHelper; friend class ExtendFootprintTTLPreV23ApplyHelper; friend class ExtendFootprintTTLParallelApplyHelper; diff --git a/src/transactions/FeeBumpTransactionFrame.cpp b/src/transactions/FeeBumpTransactionFrame.cpp index e2985bcc5f..02f0647098 100644 --- a/src/transactions/FeeBumpTransactionFrame.cpp +++ b/src/transactions/FeeBumpTransactionFrame.cpp @@ -22,6 +22,7 @@ #include "transactions/TransactionUtils.h" #include "util/GlobalChecks.h" #include "util/ProtocolVersion.h" +#include "util/numeric.h" #include "util/numeric128.h" #include "xdrpp/depth_checker.h" #include "xdrpp/marshal.h" @@ -106,7 +107,7 @@ FeeBumpTransactionFrame::preParallelApply( try { mInnerTx->preParallelApply(/*chargeFee=*/false, app, ltx, meta, - txResult, sorobanConfig); + txResult, sorobanConfig, getContentsHash()); } catch (std::exception& e) { @@ -118,7 +119,7 @@ FeeBumpTransactionFrame::preParallelApply( } } -ParallelTxReturnVal +std::optional FeeBumpTransactionFrame::parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, @@ -132,10 +133,9 @@ FeeBumpTransactionFrame::parallelApply( // Note that even after updateResult is called here, feeCharged will not // be accurate for Soroban transactions until // FeeBumpTransactionFrame::processPostApply is called. - auto res = mInnerTx->parallelApply(app, threadState, config, ledgerInfo, - txResult, sorobanMetrics, txPrngSeed, - effects); - return res; + return mInnerTx->parallelApply(app, threadState, config, ledgerInfo, + txResult, sorobanMetrics, txPrngSeed, + effects); } catch (std::exception& e) { @@ -180,7 +180,7 @@ FeeBumpTransactionFrame::apply( // If this throws, then we may not have the correct TransactionResult so // we must crash. return mInnerTx->apply(false, app, ltx, meta, txResult, sorobanConfig, - sorobanBasePrngSeed); + sorobanBasePrngSeed, getContentsHash()); } catch (std::exception& e) { @@ -245,7 +245,7 @@ FeeBumpTransactionFrame::checkSignature(SignatureChecker& signatureChecker, bool FeeBumpTransactionFrame::checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const { // Fee bumps do not contain explicit operations, so this check trivially @@ -270,9 +270,10 @@ FeeBumpTransactionFrame::checkAllTransactionSignatures( MutableTxResultPtr FeeBumpTransactionFrame::checkValid( - AppConnector& app, LedgerSnapshot const& ls, SequenceNumber current, + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { if (!xdr::check_xdr_depth(mEnvelope, 500) || !XDRProvidesValidFee()) { @@ -283,20 +284,38 @@ FeeBumpTransactionFrame::checkValid( // the fees that would end up being applied. However, this is what Core // used to return for a while, and some users may rely on this, so we // maintain this logic for the time being. - int64_t minBaseFee = ls.getLedgerHeader().current().baseFee; - auto feeCharged = getFee(ls.getLedgerHeader().current(), minBaseFee, false); + int64_t minBaseFee = lrv.getLedgerHeader().current().baseFee; + auto feeCharged = + getFee(lrv.getLedgerHeader().current(), minBaseFee, false); auto txResult = FeeBumpMutableTransactionResult::createSuccess( *mInnerTx, feeCharged, 0); - SignatureChecker signatureChecker{ - ls.getLedgerHeader().current().ledgerVersion, getContentsHash(), - mEnvelope.feeBump().signatures}; - if (commonValid(signatureChecker, ls, false, *txResult) != + auto ledgerVersion = lrv.getLedgerHeader().current().ledgerVersion; + SignatureChecker signatureChecker{ledgerVersion, getContentsHash(), + mEnvelope.feeBump().signatures}; + if (commonValid(signatureChecker, lrv, false, *txResult) != ValidationType::kFullyValid) { return txResult; } + if (protocolVersionStartsFrom(ledgerVersion, SOROBAN_PROTOCOL_VERSION)) + { + // CAP-77: Check if fee bump source account is frozen + auto const& sorobanConfig = + app.getLedgerManager().getLastClosedSorobanNetworkConfig(); + if (sorobanConfig.hasFrozenKeys()) + { + auto feeAcctKey = accountKey(getFeeSourceID()); + if (sorobanConfig.isKeyFrozen(feeAcctKey) && + !sorobanConfig.isFreezeBypassTx(getContentsHash())) + { + txResult->setError(txFROZEN_KEY_ACCESSED); + return txResult; + } + } + } + if (!signatureChecker.checkAllSignaturesUsed()) { txResult->setError(txBAD_AUTH_EXTRA); @@ -304,8 +323,9 @@ FeeBumpTransactionFrame::checkValid( } mInnerTx->checkValidWithOptionallyChargedFee( - app, ls, current, false, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, *txResult, diagnosticEvents); + app, lrv, current, false, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset, getContentsHash(), *txResult, + diagnosticEvents, validationLedgerSeq); return txResult; } @@ -321,12 +341,12 @@ FeeBumpTransactionFrame::checkSorobanResources( std::optional FeeBumpTransactionFrame::commonValidPreSeqNum( - LedgerSnapshot const& ls, MutableTransactionResultBase& txResult) const + LedgerReadView const& lrv, MutableTransactionResultBase& txResult) const { // this function does validations that are independent of the account state // (stay true regardless of other side effects) - auto header = ls.getLedgerHeader(); + auto header = lrv.getLedgerHeader(); if (protocolVersionIsBefore(header.current().ledgerVersion, ProtocolVersion::V_13)) { @@ -387,7 +407,7 @@ FeeBumpTransactionFrame::commonValidPreSeqNum( } } - auto feeSource = ls.getAccount(getFeeSourceID()); + auto feeSource = lrv.getAccount(getFeeSourceID()); if (!feeSource) { txResult.setError(txNO_ACCOUNT); @@ -399,14 +419,14 @@ FeeBumpTransactionFrame::commonValidPreSeqNum( FeeBumpTransactionFrame::ValidationType FeeBumpTransactionFrame::commonValid( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, bool applying, - MutableTransactionResultBase& txResult) const + SignatureChecker& signatureChecker, LedgerReadView const& lrv, + bool applying, MutableTransactionResultBase& txResult) const { ValidationType res = ValidationType::kInvalid; // Get the fee source account during commonValidPreSeqNum to avoid redundant // account loading - auto feeSource = commonValidPreSeqNum(ls, txResult); + auto feeSource = commonValidPreSeqNum(lrv, txResult); if (!feeSource) { return res; @@ -414,7 +434,7 @@ FeeBumpTransactionFrame::commonValid( if (!checkAllTransactionSignatures( signatureChecker, *feeSource, - ls.getLedgerHeader().current().ledgerVersion)) + lrv.getLedgerHeader().current().ledgerVersion)) { txResult.setError(txBAD_AUTH); return res; @@ -422,7 +442,7 @@ FeeBumpTransactionFrame::commonValid( res = ValidationType::kInvalidPostAuth; - auto header = ls.getLedgerHeader(); + auto header = lrv.getLedgerHeader(); // if we are in applying mode fee was already deduced from signing account // balance, if not, we need to check if after that deduction this account // will still have minimum balance @@ -468,6 +488,24 @@ FeeBumpTransactionFrame::validateSorobanTxForFlooding( return mInnerTx->validateSorobanTxForFlooding(keysToFilter); } +bool +FeeBumpTransactionFrame::validateAccountFilterForFlooding( + std::set const& filteredAccounts) const +{ + if (filteredAccounts.empty()) + { + return true; + } + + // Check fee-bump fee source account + if (filteredAccounts.find(getFeeSourceID()) != filteredAccounts.end()) + { + return false; + } + + return mInnerTx->validateAccountFilterForFlooding(filteredAccounts); +} + bool FeeBumpTransactionFrame::validateSorobanMemo() const { @@ -532,14 +570,16 @@ FeeBumpTransactionFrame::getFee(LedgerHeader const& header, { flatFee = mInnerTx->declaredSorobanResourceFee(); } - int64_t adjustedFee = *baseFee * std::max(1, getNumOperations()); + int64_t adjustedFee = + saturatingMultiply(*baseFee, std::max(1, getNumOperations())); if (applying) { - return flatFee + std::min(getInclusionFee(), adjustedFee); + return saturatingAdd(flatFee, + std::min(getInclusionFee(), adjustedFee)); } else { - return flatFee + adjustedFee; + return saturatingAdd(flatFee, adjustedFee); } } diff --git a/src/transactions/FeeBumpTransactionFrame.h b/src/transactions/FeeBumpTransactionFrame.h index 419de4ffd4..d71cd7834f 100644 --- a/src/transactions/FeeBumpTransactionFrame.h +++ b/src/transactions/FeeBumpTransactionFrame.h @@ -34,7 +34,7 @@ class FeeBumpTransactionFrame : public TransactionFrameBase int32_t neededWeight) const override; bool checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const override; bool checkAllTransactionSignatures(SignatureChecker& signatureChecker, @@ -44,7 +44,7 @@ class FeeBumpTransactionFrame : public TransactionFrameBase // If check passes, returns the fee source account. Otherwise returns // nullopt. std::optional - commonValidPreSeqNum(LedgerSnapshot const& ls, + commonValidPreSeqNum(LedgerReadView const& lrv, MutableTransactionResultBase& txResult) const; enum ValidationType @@ -56,7 +56,7 @@ class FeeBumpTransactionFrame : public TransactionFrameBase }; ValidationType commonValid(SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, bool applying, + LedgerReadView const& lrv, bool applying, MutableTransactionResultBase& txResult) const; void removeOneTimeSignerKeyFromFeeSource(AbstractLedgerTxn& ltx) const; @@ -87,7 +87,7 @@ class FeeBumpTransactionFrame : public TransactionFrameBase MutableTransactionResultBase& txResult, SorobanNetworkConfig const& sorobanConfig) const override; - ParallelTxReturnVal parallelApply( + std::optional parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, MutableTransactionResultBase& resPayload, @@ -109,11 +109,13 @@ class FeeBumpTransactionFrame : public TransactionFrameBase MutableTransactionResultBase& txResult, TxEventManager& txEventManager) const override; - MutableTxResultPtr - checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const override; + MutableTxResultPtr checkValid(AppConnector& app, LedgerReadView const& lrv, + SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq = + std::nullopt) const override; bool checkSorobanResources( SorobanNetworkConfig const& cfg, uint32_t ledgerVersion, DiagnosticEventManager& diagnosticEvents) const override; @@ -127,6 +129,8 @@ class FeeBumpTransactionFrame : public TransactionFrameBase bool validateSorobanTxForFlooding( UnorderedSet const& keysToFilter) const override; + bool validateAccountFilterForFlooding( + std::set const& filteredAccounts) const override; bool validateSorobanMemo() const override; bool validateHostFn() const override; diff --git a/src/transactions/InflationOpFrame.cpp b/src/transactions/InflationOpFrame.cpp index 37639b1eec..4d623fc7d0 100644 --- a/src/transactions/InflationOpFrame.cpp +++ b/src/transactions/InflationOpFrame.cpp @@ -145,4 +145,11 @@ InflationOpFrame::getThresholdLevel() const { return ThresholdLevel::LOW; } + +bool +InflationOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; } +} \ No newline at end of file diff --git a/src/transactions/InflationOpFrame.h b/src/transactions/InflationOpFrame.h index 610f52d67e..9cc1dbdf38 100644 --- a/src/transactions/InflationOpFrame.h +++ b/src/transactions/InflationOpFrame.h @@ -30,6 +30,9 @@ class InflationOpFrame : public OperationFrame OperationResult& res) const override; bool isOpSupported(LedgerHeader const& header) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static InflationResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/InvokeHostFunctionOpFrame.cpp b/src/transactions/InvokeHostFunctionOpFrame.cpp index 411247666f..7aa68bdc4d 100644 --- a/src/transactions/InvokeHostFunctionOpFrame.cpp +++ b/src/transactions/InvokeHostFunctionOpFrame.cpp @@ -271,7 +271,8 @@ class InvokeHostFunctionApplyHelper : virtual LedgerAccessHelper rust::Vec mTtlEntryCxxBufs; rust::Vec mAutoRestoredRwEntryIndices; HostFunctionMetrics mMetrics; - SearchableHotArchiveSnapshotConstPtr mHotArchive; + // Used for hot archive access only + ApplyLedgerStateSnapshot mStateSnapshot; rust::Box const& mModuleCache; DiagnosticEventManager& mDiagnosticEvents; @@ -285,7 +286,7 @@ class InvokeHostFunctionApplyHelper : virtual LedgerAccessHelper std::optional& refundableFeeTracker, OperationMetaBuilder& opMeta, InvokeHostFunctionOpFrame const& opFrame, SorobanNetworkConfig const& sorobanConfig, - SearchableHotArchiveSnapshotConstPtr hotArchive, + ApplyLedgerStateSnapshot stateSnapshot, rust::Box const& moduleCache) : mApp(app) , mRes(res) @@ -298,7 +299,7 @@ class InvokeHostFunctionApplyHelper : virtual LedgerAccessHelper , mAppConfig(app.getConfig()) , mMetrics(app.getSorobanMetrics(), app.getConfig().DISABLE_SOROBAN_METRICS_FOR_TESTING) - , mHotArchive(hotArchive) + , mStateSnapshot(std::move(stateSnapshot)) , mModuleCache(moduleCache) , mDiagnosticEvents(mOpMeta.getDiagnosticEventManager()) { @@ -425,8 +426,7 @@ class InvokeHostFunctionApplyHelper : virtual LedgerAccessHelper continue; } - releaseAssertOrThrow(mHotArchive); - auto archiveEntry = mHotArchive->load(lk); + auto archiveEntry = mStateSnapshot.loadArchiveEntry(lk); if (archiveEntry) { releaseAssertOrThrow( @@ -989,11 +989,10 @@ class InvokeHostFunctionPreV23ApplyHelper OperationMetaBuilder& opMeta, InvokeHostFunctionOpFrame const& opFrame, SorobanNetworkConfig const& sorobanConfig, rust::Box const& moduleCache) - : InvokeHostFunctionApplyHelper(app, sorobanBasePrngSeed, res, - refundableFeeTracker, opMeta, opFrame, - sorobanConfig, - nullptr, // No hot archive before p23 - moduleCache) + : InvokeHostFunctionApplyHelper( + app, sorobanBasePrngSeed, res, refundableFeeTracker, opMeta, + opFrame, sorobanConfig, app.copyApplyLedgerStateSnapshot(), + moduleCache) , PreV23LedgerAccessHelper(ltx) { } @@ -1178,7 +1177,7 @@ class InvokeHostFunctionParallelApplyHelper : InvokeHostFunctionApplyHelper( app, sorobanBasePrngSeed, res, refundableFeeTracker, opMeta, opFrame, threadState.getSorobanConfig(), - threadState.getHotArchiveSnapshot(), threadState.getModuleCache()) + threadState.getSnapshot(), threadState.getModuleCache()) , ParallelLedgerAccessHelper(threadState, ledgerInfo) { ZoneScoped; @@ -1205,17 +1204,10 @@ class InvokeHostFunctionParallelApplyHelper } } - ParallelTxReturnVal - takeResults(bool applySucceeded) + std::optional + takeResult(bool success) { - if (applySucceeded) - { - return mTxState.takeSuccess(); - } - else - { - return mTxState.takeFailure(); - } + return mTxState.takeResult(success); } }; @@ -1264,7 +1256,7 @@ InvokeHostFunctionOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, "InvokeHostFunctionOpFrame may only be applied via doApplyForSoroban"); } -ParallelTxReturnVal +std::optional InvokeHostFunctionOpFrame::doParallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -1283,8 +1275,7 @@ InvokeHostFunctionOpFrame::doParallelApply( app, threadState, ledgerInfo, txPrngSeed, res, refundableFeeTracker, opMeta, *this); - bool success = helper.apply(); - return helper.takeResults(success); + return helper.takeResult(helper.apply()); } bool @@ -1338,4 +1329,13 @@ InvokeHostFunctionOpFrame::isSoroban() const { return true; } + +bool +InvokeHostFunctionOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Soroban footprint checks happen at transaction level, so we can safely + // say that the operation itself doesn't access frozen keys. + return false; +} } diff --git a/src/transactions/InvokeHostFunctionOpFrame.h b/src/transactions/InvokeHostFunctionOpFrame.h index 670187f86f..c1538f4661 100644 --- a/src/transactions/InvokeHostFunctionOpFrame.h +++ b/src/transactions/InvokeHostFunctionOpFrame.h @@ -55,7 +55,7 @@ class InvokeHostFunctionOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; - ParallelTxReturnVal + std::optional doParallelApply(AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -75,6 +75,9 @@ class InvokeHostFunctionOpFrame : public OperationFrame virtual bool isSoroban() const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + friend class InvokeHostFunctionApplyHelper; friend class InvokeHostFunctionPreV23ApplyHelper; friend class InvokeHostFunctionParallelApplyHelper; diff --git a/src/transactions/LiquidityPoolDepositOpFrame.cpp b/src/transactions/LiquidityPoolDepositOpFrame.cpp index d0cf8d59d9..ba22ce4666 100644 --- a/src/transactions/LiquidityPoolDepositOpFrame.cpp +++ b/src/transactions/LiquidityPoolDepositOpFrame.cpp @@ -5,6 +5,7 @@ #include "transactions/LiquidityPoolDepositOpFrame.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" +#include "ledger/NetworkConfig.h" #include "ledger/TrustLineWrapper.h" #include "transactions/TransactionUtils.h" #include "util/ProtocolVersion.h" @@ -13,6 +14,65 @@ namespace stellar { +namespace +{ +bool +isBadPrice(int64_t amountA, int64_t amountB, Price const& minPrice, + Price const& maxPrice) +{ + // a * d < b * n is equivalent to a/b < n/d but avoids rounding. + if (amountA == 0 || amountB == 0 || + bigMultiply(amountA, minPrice.d) < bigMultiply(amountB, minPrice.n) || + bigMultiply(amountA, maxPrice.d) > bigMultiply(amountB, maxPrice.n)) + { + return true; + } + return false; +} + +bool +minAmongValid(int64_t& res, int64_t x, bool xValid, int64_t y, bool yValid) +{ + if (xValid && yValid) + { + res = std::min(x, y); + } + else if (xValid) + { + res = x; + } + else if (yValid) + { + res = y; + } + else + { + return false; + } + return true; +} + +void +updateBalance(LedgerTxnHeader& header, TrustLineWrapper& tl, + LedgerTxnEntry& acc, int64_t delta) +{ + if (tl) + { + if (!tl.addBalance(header, delta)) + { + throw std::runtime_error("insufficient balance"); + } + } + else + { + if (!stellar::addBalance(header, acc, delta)) + { + throw std::runtime_error("insufficient balance"); + } + } +} + +} // namespace LiquidityPoolDepositOpFrame::LiquidityPoolDepositOpFrame( Operation const& op, TransactionFrame const& parentTx) @@ -29,20 +89,6 @@ LiquidityPoolDepositOpFrame::isOpSupported(LedgerHeader const& header) const !isPoolDepositDisabled(header); } -static bool -isBadPrice(int64_t amountA, int64_t amountB, Price const& minPrice, - Price const& maxPrice) -{ - // a * d < b * n is equivalent to a/b < n/d but avoids rounding. - if (amountA == 0 || amountB == 0 || - bigMultiply(amountA, minPrice.d) < bigMultiply(amountB, minPrice.n) || - bigMultiply(amountA, maxPrice.d) > bigMultiply(amountB, maxPrice.n)) - { - return true; - } - return false; -} - bool LiquidityPoolDepositOpFrame::depositIntoEmptyPool( int64_t& amountA, int64_t& amountB, int64_t& amountPoolShares, @@ -75,26 +121,30 @@ LiquidityPoolDepositOpFrame::depositIntoEmptyPool( return true; } -static bool -minAmongValid(int64_t& res, int64_t x, bool xValid, int64_t y, bool yValid) +bool +LiquidityPoolDepositOpFrame::accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + LiquidityPoolConstantProductParameters const& cpp) const { - if (xValid && yValid) - { - res = std::min(x, y); - } - else if (xValid) + if (!sorobanConfig || !sorobanConfig->hasFrozenKeys()) { - res = x; + return false; } - else if (yValid) + // Check asset A trustline (if non-native, otherwise account freezing + // would apply) + if (cpp.assetA.type() != ASSET_TYPE_NATIVE && + sorobanConfig->isKeyFrozen(trustlineKey(getSourceID(), cpp.assetA))) { - res = y; + return true; } - else + // Check asset B trustline (if non-native, otherwise account freezing + // would apply) + if (cpp.assetB.type() != ASSET_TYPE_NATIVE && + sorobanConfig->isKeyFrozen(trustlineKey(getSourceID(), cpp.assetB))) { - return false; + return true; } - return true; + return false; } bool @@ -168,30 +218,20 @@ LiquidityPoolDepositOpFrame::depositIntoNonEmptyPool( return true; } -static void -updateBalance(LedgerTxnHeader& header, TrustLineWrapper& tl, - LedgerTxnEntry& acc, int64_t delta) -{ - if (tl) - { - if (!tl.addBalance(header, delta)) - { - throw std::runtime_error("insufficient balance"); - } - } - else - { - if (!stellar::addBalance(header, acc, delta)) - { - throw std::runtime_error("insufficient balance"); - } - } -} - bool LiquidityPoolDepositOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("LiquidityPoolDepositOp may only be applied with " + "doApply overload accepting sorobanConfig"); +} + +bool +LiquidityPoolDepositOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "LiquidityPoolDepositOpFrame apply", true); @@ -232,6 +272,14 @@ LiquidityPoolDepositOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, return false; } + // CAP-77: Check if any of the relevant trustlines are frozen. + auto header = ltx.loadHeader(); + if (accessesFrozenKeyAtApplyTime(sorobanConfig, cpp())) + { + innerResult(res).code(LIQUIDITY_POOL_DEPOSIT_TRUSTLINE_FROZEN); + return false; + } + // If one of the assets is native, we'll also need the source account LedgerTxnEntry source; if (cpp().assetA.type() == ASSET_TYPE_NATIVE || @@ -242,8 +290,6 @@ LiquidityPoolDepositOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, source = loadAccount(ltx, getSourceID()); } - auto header = ltx.loadHeader(); - int64_t amountA = 0; int64_t amountB = 0; int64_t amountPoolShares = 0; @@ -375,4 +421,13 @@ LiquidityPoolDepositOpFrame::insertLedgerKeysToPrefetch( keys.emplace(poolShareTrustLineKey(getSourceID(), mLiquidityPoolDeposit.liquidityPoolID)); } + +bool +LiquidityPoolDepositOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Checks for the frozen keys are done at apply time in + // accessesFrozenKeyAtApplyTime, we can't check anything at validation time. + return false; +} } diff --git a/src/transactions/LiquidityPoolDepositOpFrame.h b/src/transactions/LiquidityPoolDepositOpFrame.h index 31ba4d1135..e9ac3ad9dc 100644 --- a/src/transactions/LiquidityPoolDepositOpFrame.h +++ b/src/transactions/LiquidityPoolDepositOpFrame.h @@ -35,6 +35,10 @@ class LiquidityPoolDepositOpFrame : public OperationFrame LiquidityPoolConstantProduct const& cp, OperationResult& res) const; + bool accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + LiquidityPoolConstantProductParameters const& cpp) const; + LiquidityPoolDepositOp const& mLiquidityPoolDeposit; public: @@ -46,11 +50,18 @@ class LiquidityPoolDepositOpFrame : public OperationFrame bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static LiquidityPoolDepositResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/LiquidityPoolWithdrawOpFrame.cpp b/src/transactions/LiquidityPoolWithdrawOpFrame.cpp index 8ab2ba3275..df6992cdce 100644 --- a/src/transactions/LiquidityPoolWithdrawOpFrame.cpp +++ b/src/transactions/LiquidityPoolWithdrawOpFrame.cpp @@ -5,6 +5,7 @@ #include "transactions/LiquidityPoolWithdrawOpFrame.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" +#include "ledger/NetworkConfig.h" #include "ledger/TrustLineWrapper.h" #include "transactions/TransactionUtils.h" #include "util/ProtocolVersion.h" @@ -28,10 +29,49 @@ LiquidityPoolWithdrawOpFrame::isOpSupported(LedgerHeader const& header) const !isPoolWithdrawalDisabled(header); } +bool +LiquidityPoolWithdrawOpFrame::accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + LiquidityPoolEntry const& pool) const +{ + if (!sorobanConfig || !sorobanConfig->hasFrozenKeys()) + { + return false; + } + auto const& constantProduct = pool.body.constantProduct(); + // Check asset A trustline (if non-native, otherwise account freezing + // would apply) + if (constantProduct.params.assetA.type() != ASSET_TYPE_NATIVE && + sorobanConfig->isKeyFrozen( + trustlineKey(getSourceID(), constantProduct.params.assetA))) + { + return true; + } + // Check asset B trustline (if non-native, otherwise account freezing + // would apply) + if (constantProduct.params.assetB.type() != ASSET_TYPE_NATIVE && + sorobanConfig->isKeyFrozen( + trustlineKey(getSourceID(), constantProduct.params.assetB))) + { + return true; + } + return false; +} + bool LiquidityPoolWithdrawOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("LiquidityPoolWithdrawOp may only be applied with " + "doApply overload accepting sorobanConfig"); +} + +bool +LiquidityPoolWithdrawOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "LiquidityPoolWithdrawOpFrame apply", true); @@ -56,10 +96,18 @@ LiquidityPoolWithdrawOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, // use a lambda so we don't hold a reference to the internals of // LiquidityPoolEntry - auto constantProduct = [&]() -> auto& { + auto constantProduct = [&poolEntry]() -> auto& { return poolEntry.current().data.liquidityPool().body.constantProduct(); }; + // CAP-77: Check if any of the relevant trustlines are frozen. + if (accessesFrozenKeyAtApplyTime(sorobanConfig, + poolEntry.current().data.liquidityPool())) + { + innerResult(res).code(LIQUIDITY_POOL_WITHDRAW_TRUSTLINE_FROZEN); + return false; + } + auto amountA = getPoolWithdrawalAmount(mLiquidityPoolWithdraw.amount, constantProduct().totalPoolShares, constantProduct().reserveA); @@ -173,4 +221,12 @@ LiquidityPoolWithdrawOpFrame::tryAddAssetBalance( return true; } +bool +LiquidityPoolWithdrawOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Checks for the frozen keys are done at apply time in + // accessesFrozenKeyAtApplyTime, we can't check anything at validation time. + return false; +} } diff --git a/src/transactions/LiquidityPoolWithdrawOpFrame.h b/src/transactions/LiquidityPoolWithdrawOpFrame.h index 394213bd55..77dc512c9e 100644 --- a/src/transactions/LiquidityPoolWithdrawOpFrame.h +++ b/src/transactions/LiquidityPoolWithdrawOpFrame.h @@ -24,6 +24,10 @@ class LiquidityPoolWithdrawOpFrame : public OperationFrame LedgerTxnHeader const& header, Asset const& asset, int64_t minAmount, int64_t amount) const; + bool accessesFrozenKeyAtApplyTime( + std::optional const& sorobanConfig, + LiquidityPoolEntry const& pool) const; + public: LiquidityPoolWithdrawOpFrame(Operation const& op, TransactionFrame const& parentTx); @@ -33,11 +37,18 @@ class LiquidityPoolWithdrawOpFrame : public OperationFrame bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static LiquidityPoolWithdrawResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ManageDataOpFrame.cpp b/src/transactions/ManageDataOpFrame.cpp index 7c8c6076e0..7fcb6cf482 100644 --- a/src/transactions/ManageDataOpFrame.cpp +++ b/src/transactions/ManageDataOpFrame.cpp @@ -127,4 +127,11 @@ ManageDataOpFrame::insertLedgerKeysToPrefetch( { keys.emplace(dataKey(getSourceID(), mManageData.dataName)); } + +bool +ManageDataOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; +} } diff --git a/src/transactions/ManageDataOpFrame.h b/src/transactions/ManageDataOpFrame.h index 2410ede468..26793db82c 100644 --- a/src/transactions/ManageDataOpFrame.h +++ b/src/transactions/ManageDataOpFrame.h @@ -32,6 +32,9 @@ class ManageDataOpFrame : public OperationFrame void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static ManageDataResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/ManageOfferOpFrameBase.cpp b/src/transactions/ManageOfferOpFrameBase.cpp index 9255b580bf..6069415bda 100644 --- a/src/transactions/ManageOfferOpFrameBase.cpp +++ b/src/transactions/ManageOfferOpFrameBase.cpp @@ -6,6 +6,7 @@ #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" +#include "ledger/NetworkConfig.h" #include "ledger/TrustLineWrapper.h" #include "transactions/OfferExchange.h" #include "transactions/SponsorshipUtils.h" @@ -215,6 +216,16 @@ bool ManageOfferOpFrameBase::doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("ManageOfferOp may only be applied with doApply " + "overload accepting sorobanConfig"); +} + +bool +ManageOfferOpFrameBase::doApply( + AppConnector& app, AbstractLedgerTxn& ltxOuter, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "ManageOfferOp apply", true); std::string pairStr = assetToString(mSheep); @@ -335,9 +346,9 @@ ManageOfferOpFrameBase::doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, } int64_t maxOffersToCross = INT64_MAX; + auto ledgerVersion = ltx.loadHeader().current().ledgerVersion; if (protocolVersionStartsFrom( - ltx.loadHeader().current().ledgerVersion, - FIRST_PROTOCOL_SUPPORTING_OPERATION_LIMITS)) + ledgerVersion, FIRST_PROTOCOL_SUPPORTING_OPERATION_LIMITS)) { maxOffersToCross = getMaxOffersToCross(); } @@ -348,7 +359,8 @@ ManageOfferOpFrameBase::doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, ConvertResult r = convertWithOffersAndPools( ltx, mSheep, maxSheepSend, sheepSent, mWheat, maxWheatReceive, wheatReceived, RoundingType::NORMAL, - [this, passive, &maxWheatPrice](LedgerTxnEntry const& entry) { + [this, passive, &maxWheatPrice, + sorobanConfig](LedgerTxnEntry const& entry) { auto const& o = entry.current().data.offer(); releaseAssertOrThrow(o.offerID != mOfferID); if ((passive && (o.price >= maxWheatPrice)) || @@ -361,6 +373,12 @@ ManageOfferOpFrameBase::doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, // we are crossing our own offer return OfferFilterResult::eStopCrossSelf; } + // CAP-77: Skip offers with frozen seller account or + // trustlines + if (sorobanConfig && offerAccessesFrozenKey(o, *sorobanConfig)) + { + return OfferFilterResult::eSkipFrozen; + } return OfferFilterResult::eKeep; }, offerTrail, maxOffersToCross); @@ -644,4 +662,22 @@ ManageOfferOpFrameBase::insertLedgerKeysToPrefetch( addIssuerAndTrustline(mSheep); addIssuerAndTrustline(mWheat); } + +bool +ManageOfferOpFrameBase::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + if (mSheep.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen(trustlineKey(getSourceID(), mSheep))) + { + return true; + } + if (mWheat.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen(trustlineKey(getSourceID(), mWheat))) + { + return true; + } + + return false; +} } diff --git a/src/transactions/ManageOfferOpFrameBase.h b/src/transactions/ManageOfferOpFrameBase.h index cbab7d5006..9d4f8d250e 100644 --- a/src/transactions/ManageOfferOpFrameBase.h +++ b/src/transactions/ManageOfferOpFrameBase.h @@ -46,12 +46,19 @@ class ManageOfferOpFrameBase : public OperationFrame bool doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltxOuter, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool isDexOperation() const override; void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + virtual bool isAmountValid() const = 0; virtual bool isDeleteOffer() const = 0; diff --git a/src/transactions/MergeOpFrame.cpp b/src/transactions/MergeOpFrame.cpp index 55e7820298..89df1cd309 100644 --- a/src/transactions/MergeOpFrame.cpp +++ b/src/transactions/MergeOpFrame.cpp @@ -285,4 +285,12 @@ MergeOpFrame::doCheckValid(uint32_t ledgerVersion, OperationResult& res) const } return true; } + +bool +MergeOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return sorobanConfig.isKeyFrozen( + accountKey(toAccountID(mOperation.body.destination()))); +} } diff --git a/src/transactions/MergeOpFrame.h b/src/transactions/MergeOpFrame.h index 80fb11b4c7..8f766b6692 100644 --- a/src/transactions/MergeOpFrame.h +++ b/src/transactions/MergeOpFrame.h @@ -39,6 +39,9 @@ class MergeOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static AccountMergeResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/OfferExchange.cpp b/src/transactions/OfferExchange.cpp index ce514622e3..f55476103c 100644 --- a/src/transactions/OfferExchange.cpp +++ b/src/transactions/OfferExchange.cpp @@ -1543,6 +1543,20 @@ convertWithOffers( return ConvertResult::eFilterStopBadPrice; case OfferFilterResult::eStopCrossSelf: return ConvertResult::eFilterStopCrossSelf; + case OfferFilterResult::eSkipFrozen: + { + // CAP-77: Remove the frozen offer, release liabilities, + // and continue matching with subsequent offers. + auto& offer = wheatOffer.current().data.offer(); + auto header = ltx.loadHeader(); + releaseLiabilities(ltx, header, wheatOffer); + auto accountB = stellar::loadAccount(ltx, offer.sellerID); + removeEntryWithPossibleSponsorship( + ltx, header, wheatOffer.current(), accountB); + wheatOffer.erase(); + ltx.commit(); + continue; + } default: throw std::runtime_error("unexpected filter result"); } diff --git a/src/transactions/OfferExchange.h b/src/transactions/OfferExchange.h index a3ebc13249..715fc2f4ed 100644 --- a/src/transactions/OfferExchange.h +++ b/src/transactions/OfferExchange.h @@ -292,7 +292,8 @@ enum class OfferFilterResult { eKeep, eStopBadPrice, - eStopCrossSelf + eStopCrossSelf, + eSkipFrozen }; enum class ConvertResult diff --git a/src/transactions/OperationFrame.cpp b/src/transactions/OperationFrame.cpp index 5942b871b4..a6e762bee6 100644 --- a/src/transactions/OperationFrame.cpp +++ b/src/transactions/OperationFrame.cpp @@ -148,7 +148,7 @@ OperationFrame::apply( ZoneScoped; CLOG_TRACE(Tx, "{}", xdrToCerealString(mOperation, "Operation")); - LedgerSnapshot ltxState(ltx); + LedgerReadView ltxState(ltx); bool applyRes = checkValid( app, signatureChecker, sorobanConfig ? &sorobanConfig.value() : nullptr, ltxState, true, res, opMeta.getDiagnosticEventManager()); @@ -163,7 +163,7 @@ OperationFrame::apply( } else { - applyRes = doApply(app, ltx, res, opMeta); + applyRes = doApply(app, ltx, sorobanConfig, res, opMeta); } CLOG_TRACE(Tx, "{}", xdrToCerealString(res, "OperationResult")); @@ -172,7 +172,7 @@ OperationFrame::apply( return applyRes; } -ParallelTxReturnVal +std::optional OperationFrame::parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, @@ -188,7 +188,7 @@ OperationFrame::parallelApply( sorobanMetrics, res, refundableFeeTracker, opMeta); } -ParallelTxReturnVal +std::optional OperationFrame::doParallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -215,12 +215,12 @@ OperationFrame::isOpSupported(LedgerHeader const&) const bool OperationFrame::checkSignature(SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, OperationResult* res, + LedgerReadView const& lrv, OperationResult* res, bool forApply) const { ZoneScoped; - auto header = ls.getLedgerHeader(); - auto sourceAccount = ls.getAccount(header, mParentTx, getSourceID()); + auto header = lrv.getLedgerHeader(); + auto sourceAccount = lrv.getAccount(header, mParentTx, getSourceID()); if (sourceAccount) { auto neededThreshold = @@ -282,7 +282,7 @@ bool OperationFrame::checkValid(AppConnector& app, SignatureChecker& signatureChecker, SorobanNetworkConfig const* cfg, - LedgerSnapshot const& ls, bool forApply, + LedgerReadView const& lrv, bool forApply, OperationResult& res, DiagnosticEventManager& diagnosticEvents) const { @@ -290,19 +290,19 @@ OperationFrame::checkValid(AppConnector& app, bool validationResult = false; auto validate = [this, &res, forApply, &signatureChecker, &app, &diagnosticEvents, &validationResult, - &cfg](LedgerSnapshot const& ls) { - if (!isOpSupported(ls.getLedgerHeader().current())) + &cfg](LedgerReadView const& lrv) { + if (!isOpSupported(lrv.getLedgerHeader().current())) { res.code(opNOT_SUPPORTED); validationResult = false; return; } - auto ledgerVersion = ls.getLedgerHeader().current().ledgerVersion; + auto ledgerVersion = lrv.getLedgerHeader().current().ledgerVersion; if (!forApply || protocolVersionIsBefore(ledgerVersion, ProtocolVersion::V_10)) { - if (!checkSignature(signatureChecker, ls, &res, forApply)) + if (!checkSignature(signatureChecker, lrv, &res, forApply)) { validationResult = false; return; @@ -319,7 +319,8 @@ OperationFrame::checkValid(AppConnector& app, // If we're applying, it's possible an earlier op modified the TX // source, so we need to check again. if ((mOperation.sourceAccount || forApply) && - !ls.getAccount(ls.getLedgerHeader(), mParentTx, getSourceID())) + !lrv.getAccount(lrv.getLedgerHeader(), mParentTx, + getSourceID())) { res.code(opNO_ACCOUNT); validationResult = false; @@ -343,16 +344,16 @@ OperationFrame::checkValid(AppConnector& app, // Older protocol versions contain buggy account loading code, // so preserve nested LedgerTxn to avoid writing to the ledger - if (protocolVersionIsBefore(ls.getLedgerHeader().current().ledgerVersion, + if (protocolVersionIsBefore(lrv.getLedgerHeader().current().ledgerVersion, ProtocolVersion::V_8) && forApply) { - ls.executeWithMaybeInnerSnapshot(validate); + lrv.executeWithMaybeInnerSnapshot(validate); } else { // Validate using read-only snapshot - validate(ls); + validate(lrv); } return validationResult; @@ -374,6 +375,18 @@ OperationFrame::doApplyForSoroban( OperationResult& res, std::optional& refundableFeeTracker, OperationMetaBuilder& opMeta) const +{ + // This implementation is just a stub for classic operations, it's not + // supposed to be called by them. + throw std::runtime_error( + "doApplyForSoroban should be overridden for Soroban operations"); +} + +bool +OperationFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { return doApply(app, ltx, res, opMeta); } @@ -412,6 +425,21 @@ OperationFrame::getSorobanResources() const return mParentTx.sorobanResources(); } +bool +OperationFrame::accessesFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + if (mOperation.sourceAccount) + { + auto opSrcKey = accountKey(toAccountID(*mOperation.sourceAccount)); + if (sorobanConfig.isKeyFrozen(opSrcKey)) + { + return true; + } + } + return doesAccessFrozenKey(sorobanConfig); +} + Memo const& OperationFrame::getTxMemo() const { diff --git a/src/transactions/OperationFrame.h b/src/transactions/OperationFrame.h index 909e6a74f1..c6747cc503 100644 --- a/src/transactions/OperationFrame.h +++ b/src/transactions/OperationFrame.h @@ -54,11 +54,15 @@ class OperationFrame Hash const& sorobanBasePrngSeed, OperationResult& res, std::optional& refundableFeeTracker, OperationMetaBuilder& opMeta) const; + virtual bool + doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const; virtual bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const = 0; - virtual ParallelTxReturnVal + virtual std::optional doParallelApply(AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, Hash const& txPrngSeed, @@ -77,6 +81,9 @@ class OperationFrame LedgerTxnEntry loadSourceAccount(AbstractLedgerTxn& ltx, LedgerTxnHeader const& header) const; + virtual bool + doesAccessFrozenKey(SorobanNetworkConfig const& sorobanConfig) const = 0; + public: static std::shared_ptr makeHelper(Operation const& op, TransactionFrame const& parentTx, @@ -90,14 +97,14 @@ class OperationFrame // to `nullptr` if they do not directly need the result of signature // validation (such as in the case of background signature validation). bool checkSignature(SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, OperationResult* res, + LedgerReadView const& lrv, OperationResult* res, bool forApply) const; AccountID getSourceID() const; MuxedAccount getSourceAccount() const; bool checkValid(AppConnector& app, SignatureChecker& signatureChecker, - SorobanNetworkConfig const* cfg, LedgerSnapshot const& ls, + SorobanNetworkConfig const* cfg, LedgerReadView const& lrv, bool forApply, OperationResult& res, DiagnosticEventManager& diagnosticEvents) const; @@ -108,7 +115,8 @@ class OperationFrame std::optional& refundableFeeTracker, OperationMetaBuilder& opMeta) const; - ParallelTxReturnVal parallelApply( + // Returns std::nullopt if operation fails. + std::optional parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, SorobanMetrics& sorobanMetrics, OperationResult& res, @@ -130,6 +138,8 @@ class OperationFrame SorobanResources const& getSorobanResources() const; + bool accessesFrozenKey(SorobanNetworkConfig const& sorobanConfig) const; + Memo const& getTxMemo() const; SorobanTransactionData::_ext_t const& getResourcesExt() const; }; diff --git a/src/transactions/ParallelApplyUtils.cpp b/src/transactions/ParallelApplyUtils.cpp index 9c26466bd5..12f3772484 100644 --- a/src/transactions/ParallelApplyUtils.cpp +++ b/src/transactions/ParallelApplyUtils.cpp @@ -3,13 +3,11 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "transactions/ParallelApplyUtils.h" -#include "bucket/BucketSnapshotManager.h" #include "bucket/BucketUtils.h" #include "ledger/LedgerEntryScope.h" #include "ledger/LedgerTxn.h" #include "ledger/NetworkConfig.h" #include "main/AppConnector.h" -#include "transactions/MutableTransactionResult.h" #include "transactions/ParallelApplyStage.h" #include "transactions/TransactionFrameBase.h" #include "util/GlobalChecks.h" @@ -297,18 +295,19 @@ ParallelLedgerAccessHelper::eraseLedgerEntryIfExists(LedgerKey const& key) // them are complete. class ThreadParalllelApplyLedgerState; GlobalParallelApplyLedgerState::GlobalParallelApplyLedgerState( - AppConnector& app, AbstractLedgerTxn& ltx, - std::vector const& stages, + AppConnector& app, ApplyLedgerStateSnapshot snapshot, + AbstractLedgerTxn& ltx, std::vector const& stages, InMemorySorobanState const& inMemoryState, SorobanNetworkConfig const& sorobanConfig) : LedgerEntryScope(ScopeIdT(0, ltx.getHeader().ledgerSeq)) - , mHotArchiveSnapshot(app.copySearchableHotArchiveBucketListSnapshot()) - , mLiveSnapshot(app.copySearchableLiveBucketListSnapshot()) + , mLCLSnapshot(std::move(snapshot)) , mInMemorySorobanState(inMemoryState) , mSorobanConfig(sorobanConfig) { + releaseAssertOrThrow(mLCLSnapshot.getLedgerSeq() == + mInMemorySorobanState.getLedgerSeq()); releaseAssertOrThrow(ltx.getHeader().ledgerSeq == - getSnapshotLedgerSeq() + 1); + mLCLSnapshot.getLedgerSeq() + 1); // From now on, we will be using globalState, liveSnapshots, and the // hotArchive to collect all entries. Before we continue though, we need to @@ -426,7 +425,10 @@ GlobalParallelApplyLedgerState::commitChangesToLedgerTxn( // While the final state of a restored key that will be written to the // Live BucketList is already handled in mGlobalEntryMap, we need to - // let the ltx know what keys need to be removed from the Hot Archive. + // let the ltx know what keys were restored so that: + // 1. Hot Archive restores can be removed from the Hot Archive BucketList + // 2. The ArchivedStateConsistency invariant can validate both hot archive + // and live BucketList restores for (auto const& kvp : mGlobalRestoredEntries.hotArchive) { // We will search for the ttl key in the hot archive when the entry @@ -439,17 +441,27 @@ GlobalParallelApplyLedgerState::commitChangesToLedgerTxn( ltxInner.markRestoredFromHotArchive(kvp.second, it->second); } } + // Live BucketList restores are only tracked in LedgerTxn for the + // ArchivedStateConsistency invariant, but we unconditionally track it for + // now. + for (auto const& kvp : mGlobalRestoredEntries.liveBucketList) + { + if (kvp.first.type() != TTL) + { + auto it = mGlobalRestoredEntries.liveBucketList.find( + getTTLKey(kvp.first)); + releaseAssertOrThrow(it != + mGlobalRestoredEntries.liveBucketList.end()); + ltxInner.markRestoredFromLiveBucketList(kvp.second, it->second); + } + } ltxInner.commit(); } uint32_t GlobalParallelApplyLedgerState::getSnapshotLedgerSeq() const { - releaseAssertOrThrow(mLiveSnapshot->getLedgerSeq() == - mHotArchiveSnapshot->getLedgerSeq()); - releaseAssertOrThrow(mLiveSnapshot->getLedgerSeq() == - mInMemorySorobanState.getLedgerSeq()); - return mLiveSnapshot->getLedgerSeq(); + return mInMemorySorobanState.getLedgerSeq(); } GlobalParallelApplyEntryMap const& @@ -599,11 +611,7 @@ ThreadParallelApplyLedgerState::ThreadParallelApplyLedgerState( AppConnector& app, GlobalParallelApplyLedgerState const& global, Cluster const& cluster, size_t clusterIdx) : LedgerEntryScope(ScopeIdT(clusterIdx, global.mScopeID.mLedger)) - // TODO: find a way to clone these from parent rather than asking the - // snapshot manager again. That might have changed! NB taking a shared - // pointer copy is not safe, the snapshot objects are not threadsafe. - , mHotArchiveSnapshot(app.copySearchableHotArchiveBucketListSnapshot()) - , mLiveSnapshot(app.copySearchableLiveBucketListSnapshot()) + , mLCLSnapshot(global.mLCLSnapshot) , mInMemorySorobanState(global.mInMemorySorobanState) , mSorobanConfig(global.mSorobanConfig) , mModuleCache(app.getModuleCache()) @@ -720,7 +728,7 @@ ThreadParallelApplyLedgerState::getLiveEntryOpt(LedgerKey const& key) const } else { - res = mLiveSnapshot->load(key); + res = mLCLSnapshot.loadLiveEntry(key); } return scopeAdoptEntryOpt(res ? std::make_optional(*res) : std::nullopt); @@ -780,11 +788,10 @@ ThreadParallelApplyLedgerState::commitChangeFromSuccessfulTx( void ThreadParallelApplyLedgerState::setEffectsDeltaFromSuccessfulTx( - ParallelTxReturnVal const& res, ParallelLedgerInfo const& ledgerInfo, + ParallelTxSuccessVal const& res, ParallelLedgerInfo const& ledgerInfo, TxEffects& effects) const { ZoneScoped; - releaseAssertOrThrow(res.getSuccess()); for (auto const& [lk, scopedEntryOpt] : res.getModifiedEntryMap()) { ThreadParApplyLedgerEntryOpt prevScopedLe = getLiveEntryOpt(lk); @@ -823,9 +830,8 @@ ThreadParallelApplyLedgerState::setEffectsDeltaFromSuccessfulTx( void ThreadParallelApplyLedgerState::commitChangesFromSuccessfulTx( - ParallelTxReturnVal const& res, TxBundle const& txBundle) + ParallelTxSuccessVal const& res, TxBundle const& txBundle) { - releaseAssertOrThrow(res.getSuccess()); auto roTTLSet = buildRoTTLSet(txBundle); for (auto const& [key, txScopedEntryOpt] : res.getModifiedEntryMap()) { @@ -846,11 +852,7 @@ ThreadParallelApplyLedgerState::entryWasRestored(LedgerKey const& key) const uint32_t ThreadParallelApplyLedgerState::getSnapshotLedgerSeq() const { - releaseAssertOrThrow(mLiveSnapshot->getLedgerSeq() == - mHotArchiveSnapshot->getLedgerSeq()); - releaseAssertOrThrow(mLiveSnapshot->getLedgerSeq() == - mInMemorySorobanState.getLedgerSeq()); - return mLiveSnapshot->getLedgerSeq(); + return mInMemorySorobanState.getLedgerSeq(); } SorobanNetworkConfig const& @@ -859,10 +861,10 @@ ThreadParallelApplyLedgerState::getSorobanConfig() const return mSorobanConfig; } -SearchableHotArchiveSnapshotConstPtr const& -ThreadParallelApplyLedgerState::getHotArchiveSnapshot() const +ApplyLedgerStateSnapshot const& +ThreadParallelApplyLedgerState::getSnapshot() const { - return mHotArchiveSnapshot; + return mLCLSnapshot; } rust::Box const& @@ -1004,22 +1006,23 @@ TxParallelApplyLedgerState::addLiveBucketlistRestore( mTxRestoredEntries.addLiveBucketlistRestore(key, entry, ttlKey, ttlEntry); } -ParallelTxReturnVal -TxParallelApplyLedgerState::takeSuccess() -{ - CLOG_TRACE(Tx, "parallel apply thread {} succeeded with {} dirty entries", - std::this_thread::get_id(), mTxEntryMap.size()); - - return ParallelTxReturnVal{true, std::move(mTxEntryMap), - std::move(mTxRestoredEntries), mScopeID}; -} - -ParallelTxReturnVal -TxParallelApplyLedgerState::takeFailure() +std::optional +TxParallelApplyLedgerState::takeResult(bool success) { - CLOG_TRACE(Tx, "parallel apply thread {} failed with {} dirty entries", - std::this_thread::get_id(), mTxEntryMap.size()); - return ParallelTxReturnVal{false, {}, mScopeID}; + if (success) + { + CLOG_TRACE(Tx, + "parallel apply thread {} succeeded with {} dirty entries", + std::this_thread::get_id(), mTxEntryMap.size()); + return ParallelTxSuccessVal{std::move(mTxEntryMap), + std::move(mTxRestoredEntries), mScopeID}; + } + else + { + CLOG_TRACE(Tx, "parallel apply thread {} failed with {} dirty entries", + std::this_thread::get_id(), mTxEntryMap.size()); + return std::nullopt; + } } uint32_t diff --git a/src/transactions/ParallelApplyUtils.h b/src/transactions/ParallelApplyUtils.h index 2f009dafd6..73d267e26c 100644 --- a/src/transactions/ParallelApplyUtils.h +++ b/src/transactions/ParallelApplyUtils.h @@ -6,6 +6,7 @@ #include "ledger/InMemorySorobanState.h" #include "ledger/LedgerEntryScope.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTypeUtils.h" #include "transactions/ParallelApplyStage.h" @@ -70,9 +71,9 @@ class ParallelLedgerInfo class ThreadParallelApplyLedgerState : public LedgerEntryScope { - // Copies of snapshots from the global state. - SearchableHotArchiveSnapshotConstPtr mHotArchiveSnapshot; - SearchableSnapshotConstPtr mLiveSnapshot; + // Copy of the LCL state snapshot from the global state, with fresh + // file caches for thread safety. + ApplyLedgerStateSnapshot mLCLSnapshot; // Reference to the live in-memory Soroban state. For Soroban entries // (CONTRACT_DATA, CONTRACT_CODE, TTL), query this in-memory state instead @@ -160,11 +161,11 @@ class ThreadParallelApplyLedgerState OptionalEntryT getLiveEntryOpt(LedgerKey const& key) const; bool entryWasRestored(LedgerKey const& key) const; - void setEffectsDeltaFromSuccessfulTx(ParallelTxReturnVal const& res, + void setEffectsDeltaFromSuccessfulTx(ParallelTxSuccessVal const& res, ParallelLedgerInfo const& ledgerInfo, TxEffects& effects) const; - void commitChangesFromSuccessfulTx(ParallelTxReturnVal const& res, + void commitChangesFromSuccessfulTx(ParallelTxSuccessVal const& res, TxBundle const& txBundle); // The snapshot ledger sequence number is one less than the @@ -173,7 +174,7 @@ class ThreadParallelApplyLedgerState SorobanNetworkConfig const& getSorobanConfig() const; - SearchableHotArchiveSnapshotConstPtr const& getHotArchiveSnapshot() const; + ApplyLedgerStateSnapshot const& getSnapshot() const; rust::Box const& getModuleCache() const; }; @@ -181,20 +182,11 @@ class ThreadParallelApplyLedgerState class GlobalParallelApplyLedgerState : public LedgerEntryScope { - // Contains the hot archive state from the start of the ledger close. If a - // key is in here, it is "evicted". An invariant is that if a key is in here - // it is _not_ in the live snapshot. - SearchableHotArchiveSnapshotConstPtr mHotArchiveSnapshot; - - // Contains the live soroban state from the start of the ledger close. If a - // key is in here, it is either "archived" or "live", depending on its TTL. - // Classic entries are always live, soroban entries always have an - // associated TTL entry and if the TTL is in the past the entry is - // "archived", otherwise "live". An invariant is that if a key is in here it - // is _not_ in the hot archive snapshot. - // Note that only classic entries should be queried from mLiveSnapshot. For - // Soroban entries query mInMemorySorobanState instead. - SearchableSnapshotConstPtr mLiveSnapshot; + // Contains the full LCL state snapshot from the start of the ledger + // close, providing access to both the live bucket list and the hot archive + // bucket list. Note that this does not reflect changes from the classic + // apply phase, but is a snapshot of the start of the ledger. + ApplyLedgerStateSnapshot mLCLSnapshot; // Contains an exact one-to-one in-memory mapping of the live snapshot for // CONTRACT_DATA, CONTRACT_CODE, and TTL entries. For these entry types, @@ -250,7 +242,9 @@ class GlobalParallelApplyLedgerState std::unordered_set const& readWriteSet); public: - GlobalParallelApplyLedgerState(AppConnector& app, AbstractLedgerTxn& ltx, + GlobalParallelApplyLedgerState(AppConnector& app, + ApplyLedgerStateSnapshot snapshot, + AbstractLedgerTxn& ltx, std::vector const& stages, InMemorySorobanState const& inMemoryState, SorobanNetworkConfig const& sorobanConfig); @@ -325,8 +319,7 @@ class TxParallelApplyLedgerState LedgerEntry const& entry, LedgerKey const& ttlKey, LedgerEntry const& ttlEntry); - ParallelTxReturnVal takeSuccess(); - ParallelTxReturnVal takeFailure(); + std::optional takeResult(bool success); uint32_t getSnapshotLedgerSeq() const; }; diff --git a/src/transactions/PathPaymentOpFrameBase.cpp b/src/transactions/PathPaymentOpFrameBase.cpp index a201daf683..6eedd24c48 100644 --- a/src/transactions/PathPaymentOpFrameBase.cpp +++ b/src/transactions/PathPaymentOpFrameBase.cpp @@ -6,6 +6,7 @@ #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" +#include "ledger/NetworkConfig.h" #include "ledger/TrustLineWrapper.h" #include "transactions/TransactionUtils.h" #include "util/GlobalChecks.h" @@ -27,6 +28,26 @@ PathPaymentOpFrameBase::getDestID() const return toAccountID(getDestMuxedAccount()); } +bool +PathPaymentOpFrameBase::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + auto const& srcAsset = getSourceAsset(); + if (srcAsset.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen(trustlineKey(getSourceID(), srcAsset))) + { + return true; + } + + auto const& destAsset = getDestAsset(); + auto destID = getDestID(); + if (destAsset.type() != ASSET_TYPE_NATIVE) + { + return sorobanConfig.isKeyFrozen(trustlineKey(destID, destAsset)); + } + return sorobanConfig.isKeyFrozen(accountKey(destID)); +} + void PathPaymentOpFrameBase::insertLedgerKeysToPrefetch( UnorderedSet& keys) const @@ -71,6 +92,8 @@ PathPaymentOpFrameBase::checkIssuer(AbstractLedgerTxn& ltx, Asset const& asset, bool PathPaymentOpFrameBase::convert( + AppConnector& app, + std::optional const& sorobanConfig, AbstractLedgerTxn& ltx, int64_t maxOffersToCross, Asset const& sendAsset, int64_t maxSend, int64_t& amountSend, Asset const& recvAsset, int64_t maxRecv, int64_t& amountRecv, RoundingType round, @@ -83,13 +106,18 @@ PathPaymentOpFrameBase::convert( ConvertResult r = convertWithOffersAndPools( ltx, sendAsset, maxSend, amountSend, recvAsset, maxRecv, amountRecv, round, - [this](LedgerTxnEntry const& o) { + [this, sorobanConfig](LedgerTxnEntry const& o) { auto const& offer = o.current().data.offer(); if (offer.sellerID == getSourceID()) { // we are crossing our own offer return OfferFilterResult::eStopCrossSelf; } + // CAP-77: Skip offers with frozen seller account or trustlines + if (sorobanConfig && offerAccessesFrozenKey(offer, *sorobanConfig)) + { + return OfferFilterResult::eSkipFrozen; + } return OfferFilterResult::eKeep; }, offerTrail, maxOffersToCross); diff --git a/src/transactions/PathPaymentOpFrameBase.h b/src/transactions/PathPaymentOpFrameBase.h index 54d0e9f709..a0fb292cf2 100644 --- a/src/transactions/PathPaymentOpFrameBase.h +++ b/src/transactions/PathPaymentOpFrameBase.h @@ -14,7 +14,9 @@ class AbstractLedgerTxn; class PathPaymentOpFrameBase : public OperationFrame { protected: - bool convert(AbstractLedgerTxn& ltx, int64_t maxOffersToCross, + bool convert(AppConnector& app, + std::optional const& sorobanConfig, + AbstractLedgerTxn& ltx, int64_t maxOffersToCross, Asset const& sendAsset, int64_t maxSend, int64_t& amountSend, Asset const& recvAsset, int64_t maxRecv, int64_t& amountRecv, RoundingType round, std::vector& offerTrail, @@ -41,6 +43,9 @@ class PathPaymentOpFrameBase : public OperationFrame bool isDexOperation() const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + virtual bool checkTransfer(int64_t maxSend, int64_t amountSend, int64_t maxRecv, int64_t amountRecv) const = 0; diff --git a/src/transactions/PathPaymentStrictReceiveOpFrame.cpp b/src/transactions/PathPaymentStrictReceiveOpFrame.cpp index 0ad43263f3..9356ad72d2 100644 --- a/src/transactions/PathPaymentStrictReceiveOpFrame.cpp +++ b/src/transactions/PathPaymentStrictReceiveOpFrame.cpp @@ -28,6 +28,16 @@ PathPaymentStrictReceiveOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("PathPaymentStrictReceiveOp may only be applied " + "with doApply overload accepting sorobanConfig"); +} + +bool +PathPaymentStrictReceiveOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "PathPaymentStrictReceiveOp apply", true); std::string pathStr = assetToString(getSourceAsset()); @@ -105,10 +115,10 @@ PathPaymentStrictReceiveOpFrame::doApply(AppConnector& app, int64_t amountSend = 0; int64_t amountRecv = 0; std::vector offerTrail; - if (!convert(ltx, maxOffersToCross, sendAsset, INT64_MAX, amountSend, - recvAsset, maxAmountRecv, amountRecv, - RoundingType::PATH_PAYMENT_STRICT_RECEIVE, offerTrail, - res)) + if (!convert(app, sorobanConfig, ltx, maxOffersToCross, sendAsset, + INT64_MAX, amountSend, recvAsset, maxAmountRecv, + amountRecv, RoundingType::PATH_PAYMENT_STRICT_RECEIVE, + offerTrail, res)) { return false; } diff --git a/src/transactions/PathPaymentStrictReceiveOpFrame.h b/src/transactions/PathPaymentStrictReceiveOpFrame.h index b83573ff1f..a5fdbf708b 100644 --- a/src/transactions/PathPaymentStrictReceiveOpFrame.h +++ b/src/transactions/PathPaymentStrictReceiveOpFrame.h @@ -26,6 +26,10 @@ class PathPaymentStrictReceiveOpFrame : public PathPaymentOpFrameBase bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; diff --git a/src/transactions/PathPaymentStrictSendOpFrame.cpp b/src/transactions/PathPaymentStrictSendOpFrame.cpp index 4016b352a0..0dcc57a269 100644 --- a/src/transactions/PathPaymentStrictSendOpFrame.cpp +++ b/src/transactions/PathPaymentStrictSendOpFrame.cpp @@ -34,6 +34,16 @@ bool PathPaymentStrictSendOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("PathPaymentStrictSendOp may only be applied with " + "doApply overload accepting sorobanConfig"); +} + +bool +PathPaymentStrictSendOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "PathPaymentStrictSendOp apply", true); std::string pathStr = assetToString(getSourceAsset()); @@ -95,9 +105,10 @@ PathPaymentStrictSendOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, int64_t amountSend = 0; int64_t amountRecv = 0; std::vector offerTrail; - if (!convert(ltx, maxOffersToCross, sendAsset, maxAmountSend, - amountSend, recvAsset, INT64_MAX, amountRecv, - RoundingType::PATH_PAYMENT_STRICT_SEND, offerTrail, res)) + if (!convert(app, sorobanConfig, ltx, maxOffersToCross, sendAsset, + maxAmountSend, amountSend, recvAsset, INT64_MAX, + amountRecv, RoundingType::PATH_PAYMENT_STRICT_SEND, + offerTrail, res)) { return false; } diff --git a/src/transactions/PathPaymentStrictSendOpFrame.h b/src/transactions/PathPaymentStrictSendOpFrame.h index a24ef88555..a302b7b88c 100644 --- a/src/transactions/PathPaymentStrictSendOpFrame.h +++ b/src/transactions/PathPaymentStrictSendOpFrame.h @@ -28,6 +28,10 @@ class PathPaymentStrictSendOpFrame : public PathPaymentOpFrameBase bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; diff --git a/src/transactions/PaymentOpFrame.cpp b/src/transactions/PaymentOpFrame.cpp index bf1e852ff0..9c1a7aeb58 100644 --- a/src/transactions/PaymentOpFrame.cpp +++ b/src/transactions/PaymentOpFrame.cpp @@ -28,6 +28,16 @@ bool PaymentOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const +{ + throw std::runtime_error("PaymentOp may only be applied " + "with doApply overload accepting sorobanConfig"); +} + +bool +PaymentOpFrame::doApply( + AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, OperationMetaBuilder& opMeta) const { ZoneNamedN(applyZone, "PaymentOp apply", true); std::string payStr = assetToString(mPayment.asset); @@ -72,7 +82,7 @@ PaymentOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, PathPaymentStrictReceiveOpFrame ppayment(op, mParentTx); if (!ppayment.doCheckValid(ledgerVersion, ppRes) || - !ppayment.doApply(app, ltx, ppRes, opMeta)) + !ppayment.doApply(app, ltx, sorobanConfig, ppRes, opMeta)) { if (ppRes.code() != opINNER) { @@ -155,4 +165,25 @@ PaymentOpFrame::insertLedgerKeysToPrefetch(UnorderedSet& keys) const keys.emplace(trustlineKey(getSourceID(), mPayment.asset)); } } + +bool +PaymentOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + if (mPayment.asset.type() == ASSET_TYPE_NATIVE) + { + return sorobanConfig.isKeyFrozen( + accountKey(toAccountID(mPayment.destination))); + } + if (sorobanConfig.isKeyFrozen(trustlineKey(getSourceID(), mPayment.asset))) + { + return true; + } + if (sorobanConfig.isKeyFrozen( + trustlineKey(toAccountID(mPayment.destination), mPayment.asset))) + { + return true; + } + return false; +} } diff --git a/src/transactions/PaymentOpFrame.h b/src/transactions/PaymentOpFrame.h index bc37cf1e20..7422c1869b 100644 --- a/src/transactions/PaymentOpFrame.h +++ b/src/transactions/PaymentOpFrame.h @@ -25,11 +25,18 @@ class PaymentOpFrame : public OperationFrame bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, OperationResult& res, OperationMetaBuilder& opMeta) const override; + bool doApply(AppConnector& app, AbstractLedgerTxn& ltx, + std::optional const& sorobanConfig, + OperationResult& res, + OperationMetaBuilder& opMeta) const override; bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static PaymentResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/RestoreFootprintOpFrame.cpp b/src/transactions/RestoreFootprintOpFrame.cpp index 547d138268..e2a9dd4fef 100644 --- a/src/transactions/RestoreFootprintOpFrame.cpp +++ b/src/transactions/RestoreFootprintOpFrame.cpp @@ -288,7 +288,7 @@ class RestoreFootprintParallelApplyHelper : virtual public RestoreFootprintApplyHelper, virtual public ParallelLedgerAccessHelper { - SearchableHotArchiveSnapshotConstPtr mHotArchive; + ApplyLedgerStateSnapshot mSnapshot; public: RestoreFootprintParallelApplyHelper( @@ -299,14 +299,14 @@ class RestoreFootprintParallelApplyHelper : RestoreFootprintApplyHelper(app, res, refundableFeeTracker, opMeta, opFrame, threadState.getSorobanConfig()) , ParallelLedgerAccessHelper(threadState, ledgerInfo) - , mHotArchive(app.copySearchableHotArchiveBucketListSnapshot()) + , mSnapshot(threadState.getSnapshot()) { } std::optional getHotArchiveEntry(LedgerKey const& key) override { - auto ptr = mHotArchive->load(key); + auto ptr = mSnapshot.loadArchiveEntry(key); if (ptr) { return ptr->archivedEntry(); @@ -352,17 +352,10 @@ class RestoreFootprintParallelApplyHelper } } - ParallelTxReturnVal - takeResults(bool applySucceeded) + std::optional + takeResult(bool success) { - if (applySucceeded) - { - return mTxState.takeSuccess(); - } - else - { - return mTxState.takeFailure(); - } + return mTxState.takeResult(success); } }; @@ -373,7 +366,7 @@ RestoreFootprintOpFrame::isOpSupported(LedgerHeader const& header) const SOROBAN_PROTOCOL_VERSION); } -ParallelTxReturnVal +std::optional RestoreFootprintOpFrame::doParallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -389,8 +382,7 @@ RestoreFootprintOpFrame::doParallelApply( releaseAssertOrThrow(refundableFeeTracker); RestoreFootprintParallelApplyHelper helper( app, threadState, ledgerInfo, res, refundableFeeTracker, opMeta, *this); - bool success = helper.apply(); - return helper.takeResults(success); + return helper.takeResult(helper.apply()); } bool @@ -476,4 +468,13 @@ RestoreFootprintOpFrame::getThresholdLevel() const { return ThresholdLevel::LOW; } + +bool +RestoreFootprintOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + // Soroban footprint checks happen at transaction level, so we can safely + // say that the operation itself doesn't access frozen keys. + return false; +} } diff --git a/src/transactions/RestoreFootprintOpFrame.h b/src/transactions/RestoreFootprintOpFrame.h index 795be46ef3..0db0b25e19 100644 --- a/src/transactions/RestoreFootprintOpFrame.h +++ b/src/transactions/RestoreFootprintOpFrame.h @@ -39,7 +39,7 @@ class RestoreFootprintOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; - ParallelTxReturnVal + std::optional doParallelApply(AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& appConfig, Hash const& txPrngSeed, @@ -60,6 +60,10 @@ class RestoreFootprintOpFrame : public OperationFrame virtual bool isSoroban() const override; ThresholdLevel getThresholdLevel() const override; + + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + friend class RestoreFootprintApplyHelper; friend class RestoreFootprintPreV23ApplyHelper; friend class RestoreFootprintParallelApplyHelper; diff --git a/src/transactions/RevokeSponsorshipOpFrame.cpp b/src/transactions/RevokeSponsorshipOpFrame.cpp index 82e7f922b9..b90e87d5f4 100644 --- a/src/transactions/RevokeSponsorshipOpFrame.cpp +++ b/src/transactions/RevokeSponsorshipOpFrame.cpp @@ -454,4 +454,26 @@ RevokeSponsorshipOpFrame::doCheckValid(uint32_t ledgerVersion, } return true; } + +bool +RevokeSponsorshipOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + if (mRevokeSponsorshipOp.type() == REVOKE_SPONSORSHIP_LEDGER_ENTRY) + { + if (sorobanConfig.isKeyFrozen(mRevokeSponsorshipOp.ledgerKey())) + { + return true; + } + } + else if (mRevokeSponsorshipOp.type() == REVOKE_SPONSORSHIP_SIGNER) + { + if (sorobanConfig.isKeyFrozen( + accountKey(mRevokeSponsorshipOp.signer().accountID))) + { + return true; + } + } + return false; +} } diff --git a/src/transactions/RevokeSponsorshipOpFrame.h b/src/transactions/RevokeSponsorshipOpFrame.h index f205553946..eeaf02022c 100644 --- a/src/transactions/RevokeSponsorshipOpFrame.h +++ b/src/transactions/RevokeSponsorshipOpFrame.h @@ -51,6 +51,9 @@ class RevokeSponsorshipOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static RevokeSponsorshipResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/SetOptionsOpFrame.cpp b/src/transactions/SetOptionsOpFrame.cpp index f3089e5f12..251e877a16 100644 --- a/src/transactions/SetOptionsOpFrame.cpp +++ b/src/transactions/SetOptionsOpFrame.cpp @@ -326,4 +326,11 @@ SetOptionsOpFrame::doCheckValid(uint32_t ledgerVersion, return true; } + +bool +SetOptionsOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return false; } +} \ No newline at end of file diff --git a/src/transactions/SetOptionsOpFrame.h b/src/transactions/SetOptionsOpFrame.h index 2e740199fb..b83081ca41 100644 --- a/src/transactions/SetOptionsOpFrame.h +++ b/src/transactions/SetOptionsOpFrame.h @@ -33,6 +33,9 @@ class SetOptionsOpFrame : public OperationFrame bool doCheckValid(uint32_t ledgerVersion, OperationResult& res) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static SetOptionsResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/SetTrustLineFlagsOpFrame.cpp b/src/transactions/SetTrustLineFlagsOpFrame.cpp index 41256ac282..fcdfcd847c 100644 --- a/src/transactions/SetTrustLineFlagsOpFrame.cpp +++ b/src/transactions/SetTrustLineFlagsOpFrame.cpp @@ -219,4 +219,12 @@ SetTrustLineFlagsOpFrame::isRevocationToMaintainLiabilitiesValid( return true; } +bool +SetTrustLineFlagsOpFrame::doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const +{ + return sorobanConfig.isKeyFrozen( + trustlineKey(mSetTrustLineFlags.trustor, mSetTrustLineFlags.asset)); +} + } diff --git a/src/transactions/SetTrustLineFlagsOpFrame.h b/src/transactions/SetTrustLineFlagsOpFrame.h index 7710cf7047..66744a404d 100644 --- a/src/transactions/SetTrustLineFlagsOpFrame.h +++ b/src/transactions/SetTrustLineFlagsOpFrame.h @@ -55,6 +55,9 @@ class SetTrustLineFlagsOpFrame : public TrustFlagsOpFrameBase void insertLedgerKeysToPrefetch(UnorderedSet& keys) const override; + bool doesAccessFrozenKey( + SorobanNetworkConfig const& sorobanConfig) const override; + static SetTrustLineFlagsResultCode getInnerCode(OperationResult const& res) { diff --git a/src/transactions/TransactionFrame.cpp b/src/transactions/TransactionFrame.cpp index cab872c08e..539bcbee00 100644 --- a/src/transactions/TransactionFrame.cpp +++ b/src/transactions/TransactionFrame.cpp @@ -15,7 +15,6 @@ #include "invariant/InvariantDoesNotHold.h" #include "invariant/InvariantManager.h" #include "ledger/LedgerEntryScope.h" -#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -41,6 +40,7 @@ #include "util/ProtocolVersion.h" #include "util/XDROperators.h" #include "util/XDRStream.h" +#include "util/numeric.h" #include "xdr/Stellar-contract.h" #include "xdr/Stellar-ledger.h" #include "xdrpp/depth_checker.h" @@ -310,6 +310,49 @@ TransactionFrame::validateSorobanTxForFlooding( checkKeys(sorobanData.resources.footprint.readWrite); } +bool +TransactionFrame::validateAccountFilterForFlooding( + std::set const& filteredAccounts) const +{ + if (filteredAccounts.empty()) + { + return true; + } + + // Check transaction source account + if (filteredAccounts.find(getSourceID()) != filteredAccounts.end()) + { + return false; + } + + // Check operation source accounts + for (auto const& op : mOperations) + { + if (filteredAccounts.find(op->getSourceID()) != filteredAccounts.end()) + { + return false; + } + } + + // For Soroban txs, check ACCOUNT-type entries in write footprint + if (isSoroban() && mEnvelope.type() == ENVELOPE_TYPE_TX && + mEnvelope.v1().tx.ext.v() == 1) + { + auto const& sorobanData = mEnvelope.v1().tx.ext.sorobanData(); + for (auto const& key : sorobanData.resources.footprint.readWrite) + { + if (key.type() == ACCOUNT && + filteredAccounts.find(key.account().accountID) != + filteredAccounts.end()) + { + return false; + } + } + } + + return true; +} + bool TransactionFrame::validateHostFn() const { @@ -431,19 +474,20 @@ TransactionFrame::getFee(LedgerHeader const& header, ProtocolVersion::V_11) || !applying) { - int64_t adjustedFee = - *baseFee * std::max(1, getNumOperations()); + int64_t adjustedFee = saturatingMultiply( + *baseFee, std::max(1, getNumOperations())); int64_t maybeResourceFee = isSoroban() ? declaredSorobanResourceFee() : 0; if (applying) { - return maybeResourceFee + - std::min(getInclusionFee(), adjustedFee); + return saturatingAdd( + maybeResourceFee, + std::min(getInclusionFee(), adjustedFee)); } else { - return maybeResourceFee + adjustedFee; + return saturatingAdd(maybeResourceFee, adjustedFee); } } else @@ -509,7 +553,7 @@ TransactionFrame::checkExtraSigners(SignatureChecker& signatureChecker) const bool TransactionFrame::checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const { ZoneScoped; @@ -518,7 +562,7 @@ TransactionFrame::checkOperationSignatures( { auto const& op = mOperations[i]; auto opResult = txResult ? &txResult->getOpResultAt(i) : nullptr; - if (!op->checkSignature(signatureChecker, ls, opResult, false)) + if (!op->checkSignature(signatureChecker, lrv, opResult, false)) { allOpsValid = false; } @@ -1065,6 +1109,52 @@ TransactionFrame::updateSorobanMetrics(AppConnector& app) const metrics.accumulateLedgerWriteByte(r.writeBytes); } +bool +TransactionFrame::accessesFrozenKey(SorobanNetworkConfig const& cfg) const +{ + if (!cfg.hasFrozenKeys()) + { + return false; + } + + // Transaction source account + auto srcAcctKey = accountKey(getSourceID()); + if (cfg.isKeyFrozen(srcAcctKey)) + { + return true; + } + + // Soroban footprint: check if any readOnly/readWrite key is frozen + if (isSoroban()) + { + auto const& sorobanData = mEnvelope.v1().tx.ext.sorobanData(); + for (auto const& lk : sorobanData.resources.footprint.readOnly) + { + if (cfg.isKeyFrozen(lk)) + { + return true; + } + } + for (auto const& lk : sorobanData.resources.footprint.readWrite) + { + if (cfg.isKeyFrozen(lk)) + { + return true; + } + } + } + + // Check every operation + for (auto const& op : mOperations) + { + if (op->accessesFrozenKey(cfg)) + { + return true; + } + } + return false; +} + FeePair TransactionFrame::computeSorobanResourceFee( uint32_t protocolVersion, SorobanResources const& txResources, @@ -1129,13 +1219,13 @@ TransactionFrame::computePreApplySorobanResourceFee( } bool -TransactionFrame::isTooEarly(LedgerHeaderWrapper const& header, +TransactionFrame::isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, + uint32_t ledgerSeq, uint64_t lowerBoundCloseTimeOffset) const { auto const tb = getTimeBounds(); if (tb) { - uint64 closeTime = header.current().scpValue.closeTime; if (tb->minTime && (tb->minTime > (closeTime + lowerBoundCloseTimeOffset))) { @@ -1143,18 +1233,18 @@ TransactionFrame::isTooEarly(LedgerHeaderWrapper const& header, } } - if (protocolVersionStartsFrom(header.current().ledgerVersion, - ProtocolVersion::V_19)) + if (protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_19)) { auto const lb = getLedgerBounds(); - return lb && lb->minLedger > header.current().ledgerSeq; + return lb && lb->minLedger > ledgerSeq; } return false; } bool -TransactionFrame::isTooLate(LedgerHeaderWrapper const& header, +TransactionFrame::isTooLate(uint32_t ledgerVersion, uint64_t closeTime, + uint32_t ledgerSeq, uint64_t upperBoundCloseTimeOffset) const { auto const tb = getTimeBounds(); @@ -1163,7 +1253,6 @@ TransactionFrame::isTooLate(LedgerHeaderWrapper const& header, // Prior to consensus, we can pass in an upper bound estimate on when we // expect the ledger to close so we don't accept transactions that will // expire by the time they are applied - uint64 closeTime = header.current().scpValue.closeTime; if (tb->maxTime && (tb->maxTime < (closeTime + upperBoundCloseTimeOffset))) { @@ -1171,23 +1260,21 @@ TransactionFrame::isTooLate(LedgerHeaderWrapper const& header, } } - if (protocolVersionStartsFrom(header.current().ledgerVersion, - ProtocolVersion::V_19)) + if (protocolVersionStartsFrom(ledgerVersion, ProtocolVersion::V_19)) { auto const lb = getLedgerBounds(); - return lb && lb->maxLedger != 0 && - lb->maxLedger <= header.current().ledgerSeq; + return lb && lb->maxLedger != 0 && lb->maxLedger <= ledgerSeq; } return false; } bool -TransactionFrame::isTooEarlyForAccount(LedgerHeaderWrapper const& header, +TransactionFrame::isTooEarlyForAccount(uint32_t ledgerVersion, + uint64_t closeTime, uint32_t ledgerSeq, LedgerEntryWrapper const& sourceAccount, uint64_t lowerBoundCloseTimeOffset) const { - if (protocolVersionIsBefore(header.current().ledgerVersion, - ProtocolVersion::V_19)) + if (protocolVersionIsBefore(ledgerVersion, ProtocolVersion::V_19)) { return false; } @@ -1201,8 +1288,7 @@ TransactionFrame::isTooEarlyForAccount(LedgerHeaderWrapper const& header, : 0; auto minSeqAge = getMinSeqAge(); - auto lowerBoundCloseTime = - header.current().scpValue.closeTime + lowerBoundCloseTimeOffset; + auto lowerBoundCloseTime = closeTime + lowerBoundCloseTimeOffset; if (minSeqAge > lowerBoundCloseTime || lowerBoundCloseTime - minSeqAge < accSeqTime) { @@ -1215,7 +1301,6 @@ TransactionFrame::isTooEarlyForAccount(LedgerHeaderWrapper const& header, : 0; auto minSeqLedgerGap = getMinSeqLedgerGap(); - auto ledgerSeq = header.current().ledgerSeq; if (minSeqLedgerGap > ledgerSeq || ledgerSeq - minSeqLedgerGap < accSeqLedger) { @@ -1228,17 +1313,18 @@ TransactionFrame::isTooEarlyForAccount(LedgerHeaderWrapper const& header, std::optional TransactionFrame::commonValidPreSeqNum( AppConnector& app, SorobanNetworkConfig const* cfg, - LedgerSnapshot const& ls, bool chargeFee, + LedgerReadView const& lrv, bool chargeFee, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, - std::optional sorobanResourceFee, + Hash const& envelopeContentsHash, std::optional sorobanResourceFee, MutableTransactionResultBase& txResult, - DiagnosticEventManager& diagnosticEvents) const + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { ZoneScoped; // this function does validations that are independent of the account state // (stay true regardless of other side effects) - uint32_t ledgerVersion = ls.getLedgerHeader().current().ledgerVersion; + uint32_t ledgerVersion = lrv.getLedgerHeader().current().ledgerVersion; if ((protocolVersionIsBefore(ledgerVersion, ProtocolVersion::V_13) && (mEnvelope.type() == ENVELOPE_TYPE_TX || hasMuxedAccount(mEnvelope))) || @@ -1299,7 +1385,7 @@ TransactionFrame::commonValidPreSeqNum( } if (protocolVersionStartsFrom( - ls.getLedgerHeader().current().ledgerVersion, + lrv.getLedgerHeader().current().ledgerVersion, ProtocolVersion::V_25)) { if (!validateSorobanMemo()) @@ -1422,13 +1508,22 @@ TransactionFrame::commonValidPreSeqNum( } } - auto header = ls.getLedgerHeader(); - if (isTooEarly(header, lowerBoundCloseTimeOffset)) + auto header = lrv.getLedgerHeader(); + + // If we have an overriding ledger sequence for validation (like when tx + // queue is accepting TXs for the next ledger), use that for time-based + // checks instead of the ledgerSeq from the header. + auto ledgerSeq = validationLedgerSeq.value_or(header.current().ledgerSeq); + auto closeTime = header.current().scpValue.closeTime; + + if (isTooEarly(ledgerVersion, closeTime, ledgerSeq, + lowerBoundCloseTimeOffset)) { txResult.setInnermostError(txTOO_EARLY); return std::nullopt; } - if (isTooLate(header, upperBoundCloseTimeOffset)) + if (isTooLate(ledgerVersion, closeTime, ledgerSeq, + upperBoundCloseTimeOffset)) { txResult.setInnermostError(txTOO_LATE); return std::nullopt; @@ -1447,13 +1542,27 @@ TransactionFrame::commonValidPreSeqNum( return std::nullopt; } - auto sourceAccount = ls.getAccount(header, *this); + auto sourceAccount = lrv.getAccount(header, *this); if (!sourceAccount) { txResult.setInnermostError(txNO_ACCOUNT); return std::nullopt; } + // CAP-77: Frozen ledger key checks. + // `cfg` check here could be a protocol-gated assertion as we're expected + // to have network config in protocol supporting CAP-77. However, that + // would break the tests that invoke `apply` directly and unconditionally + // pass `nullopt` for the config. + // We can clean this up after updating all the tests to pass the config + // properly. + if (cfg && accessesFrozenKey(*cfg) && + !cfg->isFreezeBypassTx(envelopeContentsHash)) + { + txResult.setInnermostError(txFROZEN_KEY_ACCESSED); + return std::nullopt; + } + return sourceAccount; } @@ -1504,14 +1613,15 @@ TransactionFrame::processSignatures( } bool allOpsValid = true; - // From protocol 10-13, there's a dangling reference bug where we check op - // signatures even if no OperationResult object exists. This check ensures - // opResult actually exists. + // From protocol 10-13, there's a dangling reference bug where we check + // op signatures even if no OperationResult object exists. This check + // ensures opResult actually exists. if (auto code = txResult.getInnermostResultCode(); code == txSUCCESS || code == txFAILED) { - LedgerSnapshot ls(ltxOuter); - allOpsValid = checkOperationSignatures(signatureChecker, ls, &txResult); + LedgerReadView lrv(ltxOuter); + allOpsValid = + checkOperationSignatures(signatureChecker, lrv, &txResult); } removeOneTimeSignerFromAllSourceAccounts(ltxOuter); @@ -1540,9 +1650,9 @@ TransactionFrame::isBadSeq(LedgerHeaderWrapper const& header, return true; } - // If seqNum == INT64_MAX, seqNum >= getSeqNum() is guaranteed to be true - // because SequenceNumber is int64, so isBadSeq will always return true in - // that case. + // If seqNum == INT64_MAX, seqNum >= getSeqNum() is guaranteed to be + // true because SequenceNumber is int64, so isBadSeq will always return + // true in that case. if (protocolVersionStartsFrom(header.current().ledgerVersion, ProtocolVersion::V_19)) { @@ -1559,16 +1669,15 @@ TransactionFrame::isBadSeq(LedgerHeaderWrapper const& header, } TransactionFrame::ValidationType -TransactionFrame::commonValid(AppConnector& app, - SorobanNetworkConfig const* cfg, - SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, SequenceNumber current, - bool applying, bool chargeFee, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - std::optional sorobanResourceFee, - MutableTransactionResultBase& txResult, - DiagnosticEventManager& diagnosticEvents) const +TransactionFrame::commonValid( + AppConnector& app, SorobanNetworkConfig const* cfg, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, + SequenceNumber current, bool applying, bool chargeFee, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + Hash const& envelopeContentsHash, std::optional sorobanResourceFee, + MutableTransactionResultBase& txResult, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { ZoneScoped; ValidationType res = ValidationType::kInvalid; @@ -1576,8 +1685,9 @@ TransactionFrame::commonValid(AppConnector& app, auto validate = [this, &signatureChecker, applying, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, &app, chargeFee, sorobanResourceFee, &txResult, - &diagnosticEvents, ¤t, &res, - &cfg](LedgerSnapshot const& ls) { + &diagnosticEvents, ¤t, &res, &cfg, + &envelopeContentsHash, + validationLedgerSeq](LedgerReadView const& lrv) { if (applying && (lowerBoundCloseTimeOffset != 0 || upperBoundCloseTimeOffset != 0)) { @@ -1585,19 +1695,19 @@ TransactionFrame::commonValid(AppConnector& app, "Applying transaction with non-current closeTime"); } - // Get the source account during commonValidPreSeqNum to avoid redundant - // account loading + // Get the source account during commonValidPreSeqNum to avoid + // redundant account loading auto sourceAccount = commonValidPreSeqNum( - app, cfg, ls, chargeFee, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, sorobanResourceFee, txResult, - diagnosticEvents); + app, cfg, lrv, chargeFee, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset, envelopeContentsHash, sorobanResourceFee, + txResult, diagnosticEvents, validationLedgerSeq); if (!sourceAccount) { return; } - auto header = ls.getLedgerHeader(); + auto header = lrv.getLedgerHeader(); // in older versions, the account's sequence number is updated when // taking fees @@ -1618,7 +1728,11 @@ TransactionFrame::commonValid(AppConnector& app, res = ValidationType::kInvalidUpdateSeqNum; - if (isTooEarlyForAccount(header, *sourceAccount, + auto ledgerSeq = + validationLedgerSeq.value_or(header.current().ledgerSeq); + auto closeTime = header.current().scpValue.closeTime; + if (isTooEarlyForAccount(header.current().ledgerVersion, closeTime, + ledgerSeq, *sourceAccount, lowerBoundCloseTimeOffset)) { txResult.setInnermostError(txBAD_MIN_SEQ_AGE_OR_GAP); @@ -1657,16 +1771,16 @@ TransactionFrame::commonValid(AppConnector& app, // Older protocol versions contain buggy account loading code, // so preserve nested LedgerTxn to avoid writing to the ledger - if (protocolVersionIsBefore(ls.getLedgerHeader().current().ledgerVersion, + if (protocolVersionIsBefore(lrv.getLedgerHeader().current().ledgerVersion, ProtocolVersion::V_8) && applying) { - ls.executeWithMaybeInnerSnapshot(validate); + lrv.executeWithMaybeInnerSnapshot(validate); } else { // Validate using read-only snapshot - validate(ls); + validate(lrv); } return res; } @@ -1693,9 +1807,9 @@ TransactionFrame::processFeeSeqNum(AbstractLedgerTxn& ltx, if (fee > 0) { fee = std::min(acc.balance, fee); - // Note: TransactionUtil addBalance checks that reserve plus liabilities - // are respected. In this case, we allow it to fall below that since it - // will be caught later in commonValid. + // Note: TransactionUtil addBalance checks that reserve plus + // liabilities are respected. In this case, we allow it to fall + // below that since it will be caught later in commonValid. stellar::addBalance(acc.balance, -fee); header.current().feePool += fee; } @@ -1705,8 +1819,8 @@ TransactionFrame::processFeeSeqNum(AbstractLedgerTxn& ltx, { if (acc.seqNum + 1 != getSeqNum()) { - // this should not happen as the transaction set is sanitized for - // sequence numbers + // this should not happen as the transaction set is sanitized + // for sequence numbers throw std::runtime_error("Unexpected account state"); } acc.seqNum = getSeqNum(); @@ -1790,34 +1904,39 @@ TransactionFrame::removeAccountSigner(AbstractLedgerTxn& ltxOuter, void TransactionFrame::checkValidWithOptionallyChargedFee( - AppConnector& app, LedgerSnapshot const& ls, SequenceNumber current, + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, bool chargeFee, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, MutableTransactionResultBase& txResult, - DiagnosticEventManager& diagnosticEvents) const + uint64_t upperBoundCloseTimeOffset, Hash const& envelopeContentsHash, + MutableTransactionResultBase& txResult, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { ZoneScoped; mCachedAccountPreProtocol8.reset(); SignatureChecker signatureChecker{ - ls.getLedgerHeader().current().ledgerVersion, getContentsHash(), + lrv.getLedgerHeader().current().ledgerVersion, getContentsHash(), getSignatures(mEnvelope)}; std::optional sorobanResourceFee; SorobanNetworkConfig const* sorobanConfig = nullptr; - if (protocolVersionStartsFrom(ls.getLedgerHeader().current().ledgerVersion, - SOROBAN_PROTOCOL_VERSION) && - isSoroban()) + auto ledgerVersion = lrv.getLedgerHeader().current().ledgerVersion; + // Load sorobanConfig for all transactions at protocol >= V20. + if (protocolVersionStartsFrom(ledgerVersion, SOROBAN_PROTOCOL_VERSION)) { sorobanConfig = &app.getLedgerManager().getLastClosedSorobanNetworkConfig(); - sorobanResourceFee = computePreApplySorobanResourceFee( - ls.getLedgerHeader().current().ledgerVersion, *sorobanConfig, - app.getConfig()); + if (isSoroban()) + { + sorobanResourceFee = computePreApplySorobanResourceFee( + ledgerVersion, *sorobanConfig, app.getConfig()); + } } - if (commonValid(app, sorobanConfig, signatureChecker, ls, current, false, + if (commonValid(app, sorobanConfig, signatureChecker, lrv, current, false, chargeFee, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, sorobanResourceFee, txResult, - diagnosticEvents) != ValidationType::kMaybeValid) + upperBoundCloseTimeOffset, envelopeContentsHash, + sorobanResourceFee, txResult, diagnosticEvents, + validationLedgerSeq) != ValidationType::kMaybeValid) { return; } @@ -1827,7 +1946,7 @@ TransactionFrame::checkValidWithOptionallyChargedFee( auto const& op = mOperations[i]; auto& opResult = txResult.getOpResultAt(i); - if (!op->checkValid(app, signatureChecker, sorobanConfig, ls, false, + if (!op->checkValid(app, signatureChecker, sorobanConfig, lrv, false, opResult, diagnosticEvents)) { // it's OK to just fast fail here and not try to call @@ -1845,11 +1964,12 @@ TransactionFrame::checkValidWithOptionallyChargedFee( } MutableTxResultPtr -TransactionFrame::checkValid(AppConnector& app, LedgerSnapshot const& ls, +TransactionFrame::checkValid(AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { #ifdef BUILD_TESTS if (app.getRunInOverlayOnlyMode()) @@ -1872,16 +1992,18 @@ TransactionFrame::checkValid(AppConnector& app, LedgerSnapshot const& ls, { return MutableTransactionResult::createTxError(txMALFORMED); } - // Setting the fees in this flow is potentially misleading, as these aren't - // the fees that would end up being applied. However, this is what Core - // used to return for a while, and some users may rely on this, so we - // maintain this logic for the time being. - int64_t minBaseFee = ls.getLedgerHeader().current().baseFee; - auto feeCharged = getFee(ls.getLedgerHeader().current(), minBaseFee, false); + // Setting the fees in this flow is potentially misleading, as these + // aren't the fees that would end up being applied. However, this is + // what Core used to return for a while, and some users may rely on + // this, so we maintain this logic for the time being. + int64_t minBaseFee = lrv.getLedgerHeader().current().baseFee; + auto feeCharged = + getFee(lrv.getLedgerHeader().current(), minBaseFee, false); auto txResult = MutableTransactionResult::createSuccess(*this, feeCharged); checkValidWithOptionallyChargedFee( - app, ls, current, true, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, *txResult, diagnosticEvents); + app, lrv, current, true, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset, getContentsHash(), *txResult, + diagnosticEvents, validationLedgerSeq); return txResult; } @@ -1934,10 +2056,12 @@ maybeTriggerTestInternalError(TransactionEnvelope const& env) #endif std::unique_ptr -TransactionFrame::commonPreApply( - bool chargeFee, AppConnector& app, AbstractLedgerTxn& ltx, - TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, - SorobanNetworkConfig const* sorobanConfig) const +TransactionFrame::commonPreApply(bool chargeFee, AppConnector& app, + AbstractLedgerTxn& ltx, + TransactionMetaBuilder& meta, + MutableTransactionResultBase& txResult, + SorobanNetworkConfig const* sorobanConfig, + Hash const& envelopeContentsHash) const { mCachedAccountPreProtocol8.reset(); uint32_t ledgerVersion = ltx.loadHeader().current().ledgerVersion; @@ -1976,11 +2100,16 @@ TransactionFrame::commonPreApply( sorobanResourceFee->non_refundable_fee; txResult.initializeRefundableFeeTracker(initialFeeRefund); } + + // Pass in nullopt, we always use the header ledgerSeq in the apply path for + // validation. LedgerTxn ltxTx(ltx); - LedgerSnapshot lsTx(ltxTx); - auto cv = commonValid(app, sorobanConfig, *signatureChecker, lsTx, 0, true, - chargeFee, 0, 0, sorobanResourceFee, txResult, - meta.getDiagnosticEventManager()); + LedgerReadView lsTx(ltxTx); + auto cv = + commonValid(app, sorobanConfig, *signatureChecker, lsTx, 0, true, + chargeFee, 0, 0, envelopeContentsHash, sorobanResourceFee, + txResult, meta.getDiagnosticEventManager(), + /*validationLedgerSeq=*/std::nullopt); if (cv >= ValidationType::kInvalidUpdateSeqNum) { processSeqNum(ltxTx); @@ -2008,14 +2137,17 @@ TransactionFrame::preParallelApply( MutableTransactionResultBase& resPayload, SorobanNetworkConfig const& sorobanConfig) const { - preParallelApply(true, app, ltx, meta, resPayload, sorobanConfig); + preParallelApply(true, app, ltx, meta, resPayload, sorobanConfig, + getContentsHash()); } void -TransactionFrame::preParallelApply( - bool chargeFee, AppConnector& app, AbstractLedgerTxn& ltx, - TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, - SorobanNetworkConfig const& sorobanConfig) const +TransactionFrame::preParallelApply(bool chargeFee, AppConnector& app, + AbstractLedgerTxn& ltx, + TransactionMetaBuilder& meta, + MutableTransactionResultBase& txResult, + SorobanNetworkConfig const& sorobanConfig, + Hash const& envelopeContentsHash) const { ZoneScoped; releaseAssert(threadIsMain() || @@ -2025,7 +2157,8 @@ TransactionFrame::preParallelApply( releaseAssertOrThrow(isSoroban()); auto signatureChecker = - commonPreApply(chargeFee, app, ltx, meta, txResult, &sorobanConfig); + commonPreApply(chargeFee, app, ltx, meta, txResult, &sorobanConfig, + envelopeContentsHash); bool ok = signatureChecker != nullptr; if (ok) { @@ -2033,9 +2166,10 @@ TransactionFrame::preParallelApply( auto& opResult = txResult.getOpResultAt(0); - // Pre parallel soroban, OperationFrame::checkValid is called right - // before OperationFrame::doApply, but we do it here instead to - // avoid making OperationFrame::checkValid thread safe. + // Pre parallel soroban, OperationFrame::checkValid is called + // right before OperationFrame::doApply, but we do it here + // instead to avoid making OperationFrame::checkValid thread + // safe. ok = mOperations.front()->checkValid( app, *signatureChecker, &sorobanConfig, ltx, true, opResult, meta.getDiagnosticEventManager()); @@ -2045,8 +2179,8 @@ TransactionFrame::preParallelApply( } } - // If validation fails, we check the result code in the parallel step to - // make sure we don't apply the transaction. + // If validation fails, we check the result code in the parallel + // step to make sure we don't apply the transaction. releaseAssertOrThrow(ok == txResult.isSuccess()); } catch (std::exception& e) @@ -2062,7 +2196,7 @@ TransactionFrame::preParallelApply( } } -ParallelTxReturnVal +std::optional TransactionFrame::parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, @@ -2073,18 +2207,12 @@ TransactionFrame::parallelApply( // This tx failed validation earlier, do not apply it if (!txResult.isSuccess()) { - return ParallelTxReturnVal{ - false, - {}, - LedgerEntryScopeID(0, 0)}; + return std::nullopt; } if (!maybeAdoptFailedReplayResult(txResult)) { - return ParallelTxReturnVal{ - false, - {}, - LedgerEntryScopeID(0, 0)}; + return std::nullopt; } bool reportInternalErrOnException = true; @@ -2119,11 +2247,11 @@ TransactionFrame::parallelApply( maybeTriggerTestInternalError(mEnvelope); #endif - if (res.getSuccess()) + if (res) { - threadState.setEffectsDeltaFromSuccessfulTx(res, ledgerInfo, + threadState.setEffectsDeltaFromSuccessfulTx(*res, ledgerInfo, effects); - opMeta.setLedgerChangesFromSuccessfulOp(threadState, res, + opMeta.setLedgerChangesFromSuccessfulOp(threadState, *res, ledgerInfo.getLedgerSeq()); } else @@ -2173,10 +2301,7 @@ TransactionFrame::parallelApply( {"ledger", "transaction", "internal-error"}); internalErrorCounter.inc(); } - return ParallelTxReturnVal{ - false, - {}, - LedgerEntryScopeID(0, 0)}; + return std::nullopt; } bool @@ -2381,14 +2506,15 @@ TransactionFrame::apply( bool chargeFee, AppConnector& app, AbstractLedgerTxn& ltx, TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, std::optional const& sorobanConfig, - Hash const& sorobanBasePrngSeed) const + Hash const& sorobanBasePrngSeed, Hash const& envelopeContentsHash) const { ZoneScoped; try { auto signatureChecker = commonPreApply(chargeFee, app, ltx, meta, txResult, - sorobanConfig ? &sorobanConfig.value() : nullptr); + sorobanConfig ? &sorobanConfig.value() : nullptr, + envelopeContentsHash); bool ok = signatureChecker != nullptr; try { @@ -2439,7 +2565,7 @@ TransactionFrame::apply( Hash const& sorobanBasePrngSeed) const { return apply(true, app, ltx, meta, txResult, sorobanConfig, - sorobanBasePrngSeed); + sorobanBasePrngSeed, getContentsHash()); } void diff --git a/src/transactions/TransactionFrame.h b/src/transactions/TransactionFrame.h index c4f690165c..771ffb42a4 100644 --- a/src/transactions/TransactionFrame.h +++ b/src/transactions/TransactionFrame.h @@ -88,38 +88,44 @@ class TransactionFrame : public TransactionFrameBase kMaybeValid }; - virtual bool isTooEarly(LedgerHeaderWrapper const& header, + virtual bool isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, + uint32_t ledgerSeq, uint64_t lowerBoundCloseTimeOffset) const; - virtual bool isTooLate(LedgerHeaderWrapper const& header, + virtual bool isTooLate(uint32_t ledgerVersion, uint64_t closeTime, + uint32_t ledgerSeq, uint64_t upperBoundCloseTimeOffset) const; - bool isTooEarlyForAccount(LedgerHeaderWrapper const& header, + bool isTooEarlyForAccount(uint32_t ledgerVersion, uint64_t closeTime, + uint32_t ledgerSeq, LedgerEntryWrapper const& sourceAccount, uint64_t lowerBoundCloseTimeOffset) const; // If check passes, returns the source account. Otherwise returns nullopt. std::optional commonValidPreSeqNum(AppConnector& app, SorobanNetworkConfig const* cfg, - LedgerSnapshot const& ls, bool chargeFee, + LedgerReadView const& lrv, bool chargeFee, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + Hash const& envelopeContentsHash, std::optional sorobanResourceFee, MutableTransactionResultBase& txResult, - DiagnosticEventManager& diagnosticEvents) const; + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const; virtual bool isBadSeq(LedgerHeaderWrapper const& header, int64_t seqNum) const; - ValidationType commonValid(AppConnector& app, - SorobanNetworkConfig const* cfg, - SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, SequenceNumber current, - bool applying, bool chargeFee, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - std::optional sorobanResourceFee, - MutableTransactionResultBase& txResult, - DiagnosticEventManager& diagnosticEvents) const; + ValidationType + commonValid(AppConnector& app, SorobanNetworkConfig const* cfg, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, + SequenceNumber current, bool applying, bool chargeFee, + uint64_t lowerBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, + Hash const& envelopeContentsHash, + std::optional sorobanResourceFee, + MutableTransactionResultBase& txResult, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const; void removeOneTimeSignerFromAllSourceAccounts(AbstractLedgerTxn& ltx) const; @@ -148,6 +154,8 @@ class TransactionFrame : public TransactionFrameBase int64_t refundSorobanFee(AbstractLedgerTxn& ltx, AccountID const& feeSource, MutableTransactionResultBase& txResult) const; void updateSorobanMetrics(AppConnector& app) const; + bool accessesFrozenKey(SorobanNetworkConfig const& cfg) const; + #ifdef BUILD_TESTS public: #endif @@ -207,6 +215,8 @@ class TransactionFrame : public TransactionFrameBase bool validateSorobanTxForFlooding( UnorderedSet const& keysToFilter) const override; + bool validateAccountFilterForFlooding( + std::set const& filteredAccounts) const override; bool validateSorobanMemo() const override; bool validateHostFn() const override; @@ -230,20 +240,23 @@ class TransactionFrame : public TransactionFrameBase uint32_t ledgerVersion) const override; bool checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const override; void checkValidWithOptionallyChargedFee( - AppConnector& app, LedgerSnapshot const& ls, SequenceNumber current, + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, bool chargeFee, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, Hash const& envelopeContentsHash, MutableTransactionResultBase& result, - DiagnosticEventManager& diagnosticEvents) const; - MutableTxResultPtr - checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const override; + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq = std::nullopt) const; + MutableTxResultPtr checkValid(AppConnector& app, LedgerReadView const& lrv, + SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, + uint64_t upperBoundCloseTimeOffset, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq = + std::nullopt) const override; bool checkSorobanResources( SorobanNetworkConfig const& cfg, uint32_t ledgerVersion, DiagnosticEventManager& diagnosticEvents) const override; @@ -278,12 +291,14 @@ class TransactionFrame : public TransactionFrameBase commonPreApply(bool chargeFee, AppConnector& app, AbstractLedgerTxn& ltx, TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, - SorobanNetworkConfig const* sorobanConfig) const; + SorobanNetworkConfig const* sorobanConfig, + Hash const& envelopeContentsHash) const; void preParallelApply(bool chargeFee, AppConnector& app, AbstractLedgerTxn& ltx, TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, - SorobanNetworkConfig const& sorobanConfig) const; + SorobanNetworkConfig const& sorobanConfig, + Hash const& envelopeContentsHash) const; void preParallelApply(AppConnector& app, AbstractLedgerTxn& ltx, @@ -291,7 +306,7 @@ class TransactionFrame : public TransactionFrameBase MutableTransactionResultBase& txResult, SorobanNetworkConfig const& sorobanConfig) const override; - ParallelTxReturnVal parallelApply( + std::optional parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, MutableTransactionResultBase& resPayload, @@ -304,7 +319,8 @@ class TransactionFrame : public TransactionFrameBase TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, std::optional const& sorobanConfig, - Hash const& sorobanBasePrngSeed) const; + Hash const& sorobanBasePrngSeed, + Hash const& envelopeContentsHash) const; bool apply(AppConnector& app, AbstractLedgerTxn& ltx, TransactionMetaBuilder& meta, MutableTransactionResultBase& txResult, diff --git a/src/transactions/TransactionFrameBase.h b/src/transactions/TransactionFrameBase.h index 62d12ccb1f..fc5f422b20 100644 --- a/src/transactions/TransactionFrameBase.h +++ b/src/transactions/TransactionFrameBase.h @@ -98,17 +98,15 @@ using ThreadParallelApplyEntryMap = using TxParallelApplyEntryMap = ParallelApplyEntryMap; -// Returned by each parallel transaction. It will contain the entries modified -// by the transaction, the success status of the transaction, and the keys -// restored. -class ParallelTxReturnVal +// Returned by each parallel transaction on success. It will contain the entries +// modified by the transaction and the keys restored. +class ParallelTxSuccessVal : public LedgerEntryScope { public: - ParallelTxReturnVal(bool success, TxModifiedEntryMap&& modifiedEntryMap, - ScopeIdT txScopeID) + ParallelTxSuccessVal(TxModifiedEntryMap&& modifiedEntryMap, + ScopeIdT txScopeID) : LedgerEntryScope(txScopeID) - , mSuccess(success) , mModifiedEntryMap(std::move(modifiedEntryMap)) { // The ModifiedEntryMap should not be used for reading entries, only @@ -117,21 +115,15 @@ class ParallelTxReturnVal // prevent accidental reads. scopeDeactivate(); } - ParallelTxReturnVal(bool success, TxModifiedEntryMap&& modifiedEntryMap, - RestoredEntries&& restoredEntries, ScopeIdT txScopeID) + ParallelTxSuccessVal(TxModifiedEntryMap&& modifiedEntryMap, + RestoredEntries&& restoredEntries, ScopeIdT txScopeID) : LedgerEntryScope(txScopeID) - , mSuccess(success) , mModifiedEntryMap(std::move(modifiedEntryMap)) , mRestoredEntries(std::move(restoredEntries)) { scopeDeactivate(); } - bool - getSuccess() const - { - return mSuccess; - } TxModifiedEntryMap const& getModifiedEntryMap() const { @@ -146,7 +138,6 @@ class ParallelTxReturnVal friend class TxParallelApplyLedgerState; private: - bool mSuccess; // This will contain a key for every entry modified by a transaction TxModifiedEntryMap mModifiedEntryMap; RestoredEntries mRestoredEntries; @@ -171,18 +162,26 @@ class TransactionFrameBase MutableTransactionResultBase& txResult, SorobanNetworkConfig const& sorobanConfig) const = 0; - virtual ParallelTxReturnVal parallelApply( + // If the transaction fails during parallel apply, returns std::nullopt. + // Otherwise returns a ParallelTxSuccessVal containing the modified entries + // and restored keys. + virtual std::optional parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, MutableTransactionResultBase& resPayload, SorobanMetrics& sorobanMetrics, Hash const& sorobanBasePrngSeed, TxEffects& effects) const = 0; - virtual MutableTxResultPtr - checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const = 0; + // When validationLedgerSeq is set, ledger sequence precondition + // checks use this value instead of the + // ledgerSeq from the snapshot header. This is used for pre-consensus + // validation where the snapshot reflects LCL but checks must evaluate + // against the next ledger. + virtual MutableTxResultPtr checkValid( + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq = std::nullopt) const = 0; virtual bool checkSorobanResources(SorobanNetworkConfig const& cfg, uint32_t ledgerVersion, @@ -204,7 +203,7 @@ class TransactionFrameBase // populating signature cache in the background). virtual bool checkOperationSignatures(SignatureChecker& signatureChecker, - LedgerSnapshot const& ls, + LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const = 0; // Validate all transaction-level signatures @@ -221,6 +220,8 @@ class TransactionFrameBase virtual bool validateSorobanTxForFlooding( UnorderedSet const& keysToFilter) const = 0; + virtual bool validateAccountFilterForFlooding( + std::set const& filteredAccounts) const = 0; virtual bool validateSorobanMemo() const = 0; virtual bool validateHostFn() const = 0; diff --git a/src/transactions/TransactionMeta.cpp b/src/transactions/TransactionMeta.cpp index 782a242dbd..267262bf1e 100644 --- a/src/transactions/TransactionMeta.cpp +++ b/src/transactions/TransactionMeta.cpp @@ -362,35 +362,16 @@ OperationMetaBuilder::setLedgerChanges(AbstractLedgerTxn& opLtx, opLtx.getHeader().ledgerVersion, ProtocolVersion::V_23)); } - // getRestoredHotArchiveKeys and getRestoredLiveBucketListKeys return all - // entries that have been restored this ledger, not just by this op. - // However, processOpLedgerEntryChanges expects just the map of restores for - // this op. This function only gets called for opRestoredLiveBucketListKeys{}; - auto allRestoredLiveBucketListKeys = opLtx.getRestoredLiveBucketListKeys(); - auto opModifiedKeys = opLtx.getAllKeysWithoutSealing(); - if (mOp.getOperation().body.type() == OperationType::RESTORE_FOOTPRINT) - { - for (auto const& [key, entry] : allRestoredLiveBucketListKeys) - { - if (isSorobanEntry(key)) - { - auto ttlKey = getTTLKey(key); - if (opModifiedKeys.find(ttlKey) != opModifiedKeys.end()) - { - opRestoredLiveBucketListKeys[key] = entry; - opRestoredLiveBucketListKeys[ttlKey] = - allRestoredLiveBucketListKeys.at(ttlKey); - } - } - } - } - - // Note: Hot Archive restore map is always empty since this is never called - // in p23. + // We should only have restored live BucketList keys for the restore + // operation pre-v23. Starting from v23, we use + // setLedgerChangesFromSuccessfulOp for the parallel operations, which has + // RestoredEntries passed directly to it through ParallelTxReturnVal. + auto opRestoredLiveBucketListKeys = opLtx.getRestoredLiveBucketListKeys(); + releaseAssertOrThrow(opRestoredLiveBucketListKeys.empty() || + opType == OperationType::RESTORE_FOOTPRINT); + + // Hot Archive restores are not possible pre-v23, so this should be empty. + releaseAssertOrThrow(opLtx.getRestoredHotArchiveKeys().empty()); std::visit( [&opLtx, &opRestoredLiveBucketListKeys, ledgerSeq, this](auto&& meta) { meta.get().changes = processOpLedgerEntryChanges( @@ -403,7 +384,7 @@ OperationMetaBuilder::setLedgerChanges(AbstractLedgerTxn& opLtx, void OperationMetaBuilder::setLedgerChangesFromSuccessfulOp( ThreadParallelApplyLedgerState const& threadState, - ParallelTxReturnVal const& res, uint32_t ledgerSeq) + ParallelTxSuccessVal const& res, uint32_t ledgerSeq) { ZoneScoped; if (!mEnabled) diff --git a/src/transactions/TransactionMeta.h b/src/transactions/TransactionMeta.h index 15aa5e86df..545700c101 100644 --- a/src/transactions/TransactionMeta.h +++ b/src/transactions/TransactionMeta.h @@ -26,7 +26,7 @@ class OperationMetaBuilder // thread state and return value maps to track entry changes. void setLedgerChangesFromSuccessfulOp( ThreadParallelApplyLedgerState const& threadState, - ParallelTxReturnVal const& res, uint32_t ledgerSeq); + ParallelTxSuccessVal const& res, uint32_t ledgerSeq); // Sets the return value for a Soroban operation. void setSorobanReturnValue(SCVal const& val); diff --git a/src/transactions/TransactionUtils.cpp b/src/transactions/TransactionUtils.cpp index 64eb2afe50..8783cc26eb 100644 --- a/src/transactions/TransactionUtils.cpp +++ b/src/transactions/TransactionUtils.cpp @@ -15,6 +15,7 @@ #include "transactions/OfferExchange.h" #include "transactions/SponsorshipUtils.h" #include "util/ProtocolVersion.h" +#include "util/numeric.h" #include "util/types.h" #include "xdr/Stellar-contract.h" #include "xdr/Stellar-ledger-entries.h" @@ -229,6 +230,36 @@ offerKey(AccountID const& sellerID, uint64_t offerID) return key; } +bool +offerAccessesFrozenKey(OfferEntry const& offer, + SorobanNetworkConfig const& sorobanConfig) +{ + if (!sorobanConfig.hasFrozenKeys()) + { + return false; + } + + // Frozen seller account only matters when at least one side of the offer + // is native (the account entry holds the native balance). + if ((offer.selling.type() == ASSET_TYPE_NATIVE || + offer.buying.type() == ASSET_TYPE_NATIVE) && + sorobanConfig.isKeyFrozen(accountKey(offer.sellerID))) + { + return true; + } + if (offer.selling.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen(trustlineKey(offer.sellerID, offer.selling))) + { + return true; + } + if (offer.buying.type() != ASSET_TYPE_NATIVE && + sorobanConfig.isKeyFrozen(trustlineKey(offer.sellerID, offer.buying))) + { + return true; + } + return false; +} + LedgerKey dataKey(AccountID const& accountID, std::string const& dataName) { @@ -1542,6 +1573,13 @@ prefetchPoolShareTrustLinesByAccountAndGetKeys(AbstractLedgerTxn& ltx, poolTLKeys.emplace_back(LedgerEntryKey(poolShareTrustLine.current())); } + // The ordering of poolTLKeys isn't deterministic across the network because + // getPoolShareTrustLinesByAccountAndAsset returns an UnorderedMap, which is + // why we need to sort here. There's a subtle bug in pool share revocation + // and sponsorships where the operation can succeed or fail based on the + // order of the pool share trustlines. + std::sort(poolTLKeys.begin(), poolTLKeys.end()); + return poolTLKeys; } @@ -1928,7 +1966,8 @@ getMinInclusionFee(TransactionFrameBase const& tx, LedgerHeader const& header, { effectiveBaseFee = std::max(effectiveBaseFee, *baseFee); } - return effectiveBaseFee * std::max(1, tx.getNumOperations()); + return saturatingMultiply(effectiveBaseFee, + std::max(1, tx.getNumOperations())); } bool diff --git a/src/transactions/TransactionUtils.h b/src/transactions/TransactionUtils.h index 514d46ddf7..27d264430e 100644 --- a/src/transactions/TransactionUtils.h +++ b/src/transactions/TransactionUtils.h @@ -65,6 +65,8 @@ LedgerKey accountKey(AccountID const& accountID); LedgerKey trustlineKey(AccountID const& accountID, Asset const& asset); LedgerKey trustlineKey(AccountID const& accountID, TrustLineAsset const& asset); LedgerKey offerKey(AccountID const& sellerID, uint64_t offerID); +bool offerAccessesFrozenKey(OfferEntry const& offer, + SorobanNetworkConfig const& sorobanConfig); LedgerKey dataKey(AccountID const& accountID, std::string const& dataName); LedgerKey claimableBalanceKey(ClaimableBalanceID const& balanceID); LedgerKey liquidityPoolKey(PoolID const& poolID); diff --git a/src/transactions/test/BeginSponsoringFutureReservesTests.cpp b/src/transactions/test/BeginSponsoringFutureReservesTests.cpp index 51fd7a64bc..ebc07cef8f 100644 --- a/src/transactions/test/BeginSponsoringFutureReservesTests.cpp +++ b/src/transactions/test/BeginSponsoringFutureReservesTests.cpp @@ -11,7 +11,6 @@ #include "test/TxTests.h" #include "test/test.h" #include "transactions/TransactionFrameBase.h" -#include "transactions/TransactionMeta.h" #include "transactions/TransactionUtils.h" #include "transactions/test/SponsorshipTestUtils.h" @@ -84,19 +83,14 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") root->op(beginSponsoringFutureReserves(a1))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); - REQUIRE(tx->getResult().result.code() == txFAILED); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 0) == + auto const& opRes0 = r.results[0].result.result.results()[0]; + REQUIRE(opRes0.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_SUCCESS); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 1) == + auto const& opRes1 = r.results[0].result.result.results()[1]; + REQUIRE(opRes1.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_ALREADY_SPONSORED); }); } @@ -109,16 +103,8 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") app->getNetworkID(), *root, {root->op(beginSponsoringFutureReserves(a1))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); - - REQUIRE(tx->getResultCode() == txBAD_SPONSORSHIP); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txBAD_SPONSORSHIP); }); } @@ -135,19 +121,14 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1, a2}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); - REQUIRE(tx->getResult().result.code() == txFAILED); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 0) == + auto const& opRes0 = r.results[0].result.result.results()[0]; + REQUIRE(opRes0.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_SUCCESS); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 1) == + auto const& opRes1 = r.results[0].result.result.results()[1]; + REQUIRE(opRes1.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_RECURSIVE); }); } @@ -165,19 +146,14 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1, a2}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); - REQUIRE(tx->getResult().result.code() == txFAILED); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 0) == + auto const& opRes0 = r.results[0].result.result.results()[0]; + REQUIRE(opRes0.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_SUCCESS); - REQUIRE(getBeginSponsoringFutureReservesResultCode(*tx, 1) == + auto const& opRes1 = r.results[0].result.result.results()[1]; + REQUIRE(opRes1.tr().beginSponsoringFutureReservesResult().code() == BEGIN_SPONSORING_FUTURE_RESERVES_RECURSIVE); }); } @@ -192,16 +168,8 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); - - REQUIRE(tx->getResultCode() == txSUCCESS); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); }); } @@ -223,16 +191,14 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, - 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); - checkSponsorship(ltx, trustlineKey(a1, cur1), 1, - &root->getPublicKey()); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, trustlineKey(a1, cur1), 1, + &root->getPublicKey()); + } auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -241,15 +207,14 @@ TEST_CASE_VERSIONS("sponsor future reserves", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, - 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); - checkSponsorship(ltx, a1.getPublicKey(), signer.key, 2, - &root->getPublicKey()); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, a1.getPublicKey(), signer.key, 2, + &root->getPublicKey()); + } }); } diff --git a/src/transactions/test/ChangeTrustTests.cpp b/src/transactions/test/ChangeTrustTests.cpp index 64f2dd66bc..9ca7cbfe05 100644 --- a/src/transactions/test/ChangeTrustTests.cpp +++ b/src/transactions/test/ChangeTrustTests.cpp @@ -292,13 +292,8 @@ TEST_CASE_VERSIONS("change trust", "[tx][changetrust]") root->op(changeTrust(idr, 0))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); }); } } diff --git a/src/transactions/test/ClawbackClaimableBalanceTests.cpp b/src/transactions/test/ClawbackClaimableBalanceTests.cpp index e823bd4794..08af0d88ba 100644 --- a/src/transactions/test/ClawbackClaimableBalanceTests.cpp +++ b/src/transactions/test/ClawbackClaimableBalanceTests.cpp @@ -108,27 +108,20 @@ TEST_CASE_VERSIONS("clawbackClaimableBalance", a1.op(endSponsoringFutureReserves())}, {a1}); - ClaimableBalanceID balanceID; - { - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - REQUIRE(tx->getResultCode() == txSUCCESS); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); - // the create is the second op in the tx - balanceID = account.getBalanceID(1); + // the create is the second op in the tx + auto balanceID = account.getBalanceID(1); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, claimableBalanceKey(balanceID), 1, &account.getPublicKey()); // a1 has one subentry - a trustline checkSponsorship(ltx, a1, 0, nullptr, 1, 0, 0, 0); checkSponsorship(ltx, account, 0, nullptr, 0, 2, 1, 0); - ltx.commit(); } gateway.clawbackClaimableBalance(balanceID); diff --git a/src/transactions/test/CreateAccountTests.cpp b/src/transactions/test/CreateAccountTests.cpp index aaeb4d6006..d45d173c73 100644 --- a/src/transactions/test/CreateAccountTests.cpp +++ b/src/transactions/test/CreateAccountTests.cpp @@ -186,16 +186,8 @@ TEST_CASE_VERSIONS("create account", "[tx][createaccount]") a1.op(endSponsoringFutureReserves())}, {key}); - { - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); - } + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); { LedgerTxn ltx(app->getLedgerTxnRoot()); diff --git a/src/transactions/test/EndSponsoringFutureReservesTests.cpp b/src/transactions/test/EndSponsoringFutureReservesTests.cpp index c808cf0c4e..724778e07d 100644 --- a/src/transactions/test/EndSponsoringFutureReservesTests.cpp +++ b/src/transactions/test/EndSponsoringFutureReservesTests.cpp @@ -23,13 +23,6 @@ getOperationResultCode(TransactionTestFramePtr& tx, size_t i) return opRes.code(); } -static EndSponsoringFutureReservesResultCode -getEndSponsoringFutureReservesResultCode(TransactionTestFramePtr tx, size_t i) -{ - auto const& opRes = tx->getResult().result.results()[i]; - return opRes.tr().endSponsoringFutureReservesResult().code(); -} - TEST_CASE_VERSIONS("confirm and clear sponsor", "[tx][sponsorship]") { VirtualClock clock; @@ -63,16 +56,10 @@ TEST_CASE_VERSIONS("confirm and clear sponsor", "[tx][sponsorship]") app->getNetworkID(), *root, {root->op(endSponsoringFutureReserves())}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - - REQUIRE(tx->getResult().result.code() == txFAILED); - REQUIRE(getEndSponsoringFutureReservesResultCode(tx, 0) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + auto const& opRes = r.results[0].result.result.results()[0]; + REQUIRE(opRes.tr().endSponsoringFutureReservesResult().code() == END_SPONSORING_FUTURE_RESERVES_NOT_SPONSORED); }); } diff --git a/src/transactions/test/FrozenLedgerKeysTests.cpp b/src/transactions/test/FrozenLedgerKeysTests.cpp new file mode 100644 index 0000000000..ebd67c0112 --- /dev/null +++ b/src/transactions/test/FrozenLedgerKeysTests.cpp @@ -0,0 +1,2294 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#include "crypto/SHA.h" +#include "ledger/LedgerManager.h" +#include "ledger/LedgerTxn.h" +#include "ledger/LedgerTxnHeader.h" +#include "ledger/NetworkConfig.h" +#include "ledger/TrustLineWrapper.h" +#include "ledger/test/LedgerTestUtils.h" +#include "main/Application.h" +#include "test/Catch2.h" +#include "test/TestAccount.h" +#include "test/TestExceptions.h" +#include "test/TestUtils.h" +#include "test/TxTests.h" +#include "test/test.h" +#include "transactions/SponsorshipUtils.h" +#include "transactions/TransactionUtils.h" +#include "util/ProtocolVersion.h" +#include "util/XDROperators.h" +#include "util/types.h" +#include +#include +#include + +namespace stellar +{ +namespace +{ +using namespace stellar::txtest; +EncodedLedgerKey +encodeLedgerKey(LedgerKey const& key) +{ + return xdr::xdr_to_opaque(key); +} + +void +freezeKey(Application& app, LedgerKey const& key) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFrozenLedgerKeys.insert(key); + }); +} + +void +unfreezeKey(Application& app, LedgerKey const& key) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFrozenLedgerKeys.erase(key); + }); +} + +void +freezeAndUnfreezeKeys(Application& app, std::vector const& toFreeze, + std::vector const& toUnfreeze) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFrozenLedgerKeys.insert(toFreeze.begin(), toFreeze.end()); + for (auto const& k : toUnfreeze) + { + cfg.mFrozenLedgerKeys.erase(k); + } + }); +} + +void +bypassTxHash(Application& app, Hash const& txHash) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFreezeBypassTxs.insert(txHash); + }); +} + +void +unbypassTxHash(Application& app, Hash const& txHash) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFreezeBypassTxs.erase(txHash); + }); +} + +void +bypassAndUnbypassTxHashes(Application& app, std::vector const& toBypass, + std::vector const& toUnbypass) +{ + modifySorobanNetworkConfig(app, [&](SorobanNetworkConfig& cfg) { + cfg.mFreezeBypassTxs.insert(toBypass.begin(), toBypass.end()); + for (auto const& h : toUnbypass) + { + cfg.mFreezeBypassTxs.erase(h); + } + }); +} + +UnorderedSet +loadFrozenKeysFromLedger(Application& app) +{ + LedgerReadView lrv(app); + auto configKey = configSettingKey(CONFIG_SETTING_FROZEN_LEDGER_KEYS); + auto entry = lrv.load(configKey); + REQUIRE(entry); + + auto const& frozenKeys = + entry.current().data.configSetting().frozenLedgerKeys().keys; + UnorderedSet result; + for (auto const& encodedKey : frozenKeys) + { + LedgerKey lk; + xdr::xdr_from_opaque(encodedKey, lk); + result.insert(lk); + } + + // Verify that we cache the correct frozen key set. + auto const& sorobanConfig = + app.getLedgerManager().getLastClosedSorobanNetworkConfig(); + REQUIRE(sorobanConfig.frozenLedgerKeys() == result); + return result; +} + +UnorderedSet +loadFreezeBypassTxsFromLedger(Application& app) +{ + LedgerReadView lrv(app); + auto configKey = configSettingKey(CONFIG_SETTING_FREEZE_BYPASS_TXS); + auto entry = lrv.load(configKey); + REQUIRE(entry); + + auto const& bypassTxs = + entry.current().data.configSetting().freezeBypassTxs().txHashes; + UnorderedSet result; + for (auto const& txHash : bypassTxs) + { + result.insert(txHash); + } + + // Verify that we cache the correct bypass tx hash set. + auto const& sorobanConfig = + app.getLedgerManager().getLastClosedSorobanNetworkConfig(); + REQUIRE(sorobanConfig.freezeBypassTxs() == result); + return result; +} + +TEST_CASE("frozen ledger keys config setting does not exist prior to p26", + "[frozenledgerkeys][upgrades]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.LEDGER_PROTOCOL_VERSION = static_cast(ProtocolVersion::V_25); + cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = + static_cast(ProtocolVersion::V_25); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + LedgerReadView lrv(*app); + auto configKey = configSettingKey(CONFIG_SETTING_FROZEN_LEDGER_KEYS); + auto entry = lrv.load(configKey); + REQUIRE(!entry); +} + +TEST_CASE("freeze bypass txs config setting does not exist prior to p26", + "[frozenledgerkeys][upgrades]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.LEDGER_PROTOCOL_VERSION = static_cast(ProtocolVersion::V_25); + cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = + static_cast(ProtocolVersion::V_25); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + LedgerReadView lrv(*app); + auto configKey = configSettingKey(CONFIG_SETTING_FREEZE_BYPASS_TXS); + auto entry = lrv.load(configKey); + REQUIRE(!entry); +} + +TEST_CASE_VERSIONS("frozen ledger keys config setting upgrades", + "[frozenledgerkeys][upgrades]") +{ + auto cfg = getTestConfig(); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + + for_versions_from(26, *app, [&] { + auto const protocolVersion = app->getLedgerManager() + .getLastClosedLedgerHeader() + .header.ledgerVersion; + + auto initFrozenKeys = loadFrozenKeysFromLedger(*app); + // Frozen keys are initially empty. + REQUIRE(initFrozenKeys.empty()); + + // CONFIG_SETTING_FROZEN_LEDGER_KEYS cannot be upgraded directly; + // only the delta mechanism is allowed. + REQUIRE(SorobanNetworkConfig::isNonUpgradeableConfigSettingEntry( + CONFIG_SETTING_FROZEN_LEDGER_KEYS)); + + auto makeAccountKey = [&](uint8_t id) { + AccountID accountID{}; + accountID.ed25519()[0] = id; + return accountKey(accountID); + }; + + SECTION("frozen keys delta validation accepts valid key types") + { + // Create a delta with valid key types: ACCOUNT, TRUSTLINE, + // CONTRACT_DATA, CONTRACT_CODE + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID(CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + + auto accKey = makeAccountKey(1); + Asset asset{}; + asset.type(ASSET_TYPE_CREDIT_ALPHANUM4); + asset.alphaNum4().issuer = makeAccountKey(2).account().accountID; + strToAssetCode(asset.alphaNum4().assetCode, "USD"); + auto tlKey = trustlineKey(accKey.account().accountID, asset); + + SCAddress contractAddr; + contractAddr.type(SC_ADDRESS_TYPE_CONTRACT); + contractAddr.contractId() = sha256("test_contract"); + SCVal scKey; + scKey.type(SCV_SYMBOL); + scKey.sym() = "key"; + auto cdKey = contractDataKey(contractAddr, scKey, + ContractDataDurability::PERSISTENT); + auto ccKey = contractCodeKey(sha256("test_code")); + + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(accKey)); + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(tlKey)); + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(cdKey)); + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(ccKey)); + + REQUIRE(SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + + SECTION("frozen keys delta validation rejects liquidity pool share " + "trustlines") + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID(CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + + auto accKey = makeAccountKey(1); + PoolID poolID = sha256("test_pool"); + auto poolShareTlKey = + poolShareTrustLineKey(accKey.account().accountID, poolID); + + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(poolShareTlKey)); + + REQUIRE(!SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + + SECTION("frozen keys delta validation rejects issuer trustline keys") + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID(CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + + auto accKey = makeAccountKey(1); + Asset asset{}; + asset.type(ASSET_TYPE_CREDIT_ALPHANUM4); + asset.alphaNum4().issuer = accKey.account().accountID; + strToAssetCode(asset.alphaNum4().assetCode, "USD"); + auto issuerTlKey = trustlineKey(accKey.account().accountID, asset); + + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(issuerTlKey)); + + REQUIRE(!SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + + SECTION("frozen keys delta validation rejects invalid key types") + { + for (auto t : xdr::xdr_traits::enum_values()) + { + auto type = static_cast(t); + if (type == ACCOUNT || type == TRUSTLINE || + type == CONTRACT_DATA || type == CONTRACT_CODE) + { + continue; + } + + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID( + CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + + LedgerKey lk; + lk.type(type); + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(lk)); + + REQUIRE(!SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + } + + SECTION("frozen keys delta validation rejects malformed XDR") + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID(CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA); + + LedgerKey lk; + lk.type(ACCOUNT); + deltaEntry.frozenLedgerKeysDelta().keysToFreeze.emplace_back( + encodeLedgerKey(lk)); + REQUIRE(SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + // Corrupt the XDR by changing some bytes in the encoded key. + deltaEntry.frozenLedgerKeysDelta().keysToFreeze[0][0] = 0xFF; + deltaEntry.frozenLedgerKeysDelta().keysToFreeze[0][3] = 0xFF; + REQUIRE(!SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + + SECTION("adds and remove frozen keys") + { + auto k1 = makeAccountKey(1); + freezeKey(*app, k1); + + // Add a key + auto frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 1); + REQUIRE(frozenKeys.count(k1) == 1); + + // Add another key + auto k2 = makeAccountKey(2); + freezeKey(*app, k2); + + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 2); + REQUIRE(frozenKeys.count(k1) == 1); + REQUIRE(frozenKeys.count(k2) == 1); + + // Remove a key + unfreezeKey(*app, k1); + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 1); + REQUIRE(frozenKeys.count(k2) == 1); + + // Add and remove in a single upgrade + freezeAndUnfreezeKeys(*app, {k1}, {k2}); + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 1); + REQUIRE(frozenKeys.count(k1) == 1); + + // Add multiple keys at once + auto k3 = makeAccountKey(3); + auto k4 = makeAccountKey(4); + freezeAndUnfreezeKeys(*app, {k2, k3, k4}, {}); + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 4); + REQUIRE(frozenKeys.count(k1) == 1); + REQUIRE(frozenKeys.count(k2) == 1); + REQUIRE(frozenKeys.count(k3) == 1); + REQUIRE(frozenKeys.count(k4) == 1); + + // Remove multiple keys at once + freezeAndUnfreezeKeys(*app, {}, {k1, k3}); + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 2); + REQUIRE(frozenKeys.count(k2) == 1); + REQUIRE(frozenKeys.count(k4) == 1); + + // Removing non-existent key is no-op + unfreezeKey(*app, k1); + auto frozenKeys2 = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys2 == frozenKeys); + + // Adding a key that's already frozen is no-op + freezeKey(*app, k2); + frozenKeys2 = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys2 == frozenKeys); + } + + SECTION("same key in both freeze and unfreeze results in key not " + "frozen") + { + auto k1 = makeAccountKey(1); + freezeKey(*app, k1); + auto frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.size() == 1); + REQUIRE(frozenKeys.count(k1) == 1); + + // Apply a delta with the same key in both lists. + // Implementation inserts first, then removes, so the key + // ends up not frozen. + freezeAndUnfreezeKeys(*app, {k1}, {k1}); + frozenKeys = loadFrozenKeysFromLedger(*app); + REQUIRE(frozenKeys.empty()); + } + }); +} + +TEST_CASE_VERSIONS("freeze bypass txs config setting upgrades", + "[frozenledgerkeys][upgrades]") +{ + auto cfg = getTestConfig(); + + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + + for_versions_from(26, *app, [&] { + auto const protocolVersion = app->getLedgerManager() + .getLastClosedLedgerHeader() + .header.ledgerVersion; + + auto bypassTxs = loadFreezeBypassTxsFromLedger(*app); + // Bypass tx hashes are initially empty. + REQUIRE(bypassTxs.empty()); + + // CONFIG_SETTING_FREEZE_BYPASS_TXS cannot be upgraded directly; + // only the delta mechanism is allowed. + REQUIRE(SorobanNetworkConfig::isNonUpgradeableConfigSettingEntry( + CONFIG_SETTING_FREEZE_BYPASS_TXS)); + + auto makeHash = [&](uint8_t id) { + Hash h{}; + h[0] = id; + return h; + }; + + SECTION("freeze bypass txs delta validation accepts hashes") + { + ConfigSettingEntry deltaEntry; + deltaEntry.configSettingID(CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA); + + deltaEntry.freezeBypassTxsDelta().addTxs.emplace_back(makeHash(1)); + deltaEntry.freezeBypassTxsDelta().removeTxs.emplace_back( + makeHash(2)); + + REQUIRE(SorobanNetworkConfig::isValidConfigSettingEntry( + deltaEntry, protocolVersion)); + } + + SECTION("adds and removes bypass tx hashes") + { + auto h1 = makeHash(1); + bypassTxHash(*app, h1); + + // Add a hash + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 1); + REQUIRE(bypassTxs.count(h1) == 1); + + // Add another hash + auto h2 = makeHash(2); + bypassTxHash(*app, h2); + + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 2); + REQUIRE(bypassTxs.count(h1) == 1); + REQUIRE(bypassTxs.count(h2) == 1); + + // Remove a hash + unbypassTxHash(*app, h1); + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 1); + REQUIRE(bypassTxs.count(h2) == 1); + + // Add and remove in a single upgrade + bypassAndUnbypassTxHashes(*app, {h1}, {h2}); + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 1); + REQUIRE(bypassTxs.count(h1) == 1); + + // Add multiple hashes at once + auto h3 = makeHash(3); + auto h4 = makeHash(4); + bypassAndUnbypassTxHashes(*app, {h2, h3, h4}, {}); + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 4); + REQUIRE(bypassTxs.count(h1) == 1); + REQUIRE(bypassTxs.count(h2) == 1); + REQUIRE(bypassTxs.count(h3) == 1); + REQUIRE(bypassTxs.count(h4) == 1); + + // Remove multiple hashes at once + bypassAndUnbypassTxHashes(*app, {}, {h1, h3}); + bypassTxs = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs.size() == 2); + REQUIRE(bypassTxs.count(h2) == 1); + REQUIRE(bypassTxs.count(h4) == 1); + + // Removing non-existent hash is no-op + unbypassTxHash(*app, h1); + auto bypassTxs2 = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs2 == bypassTxs); + + // Adding an existing hash is no-op + bypassTxHash(*app, h2); + bypassTxs2 = loadFreezeBypassTxsFromLedger(*app); + REQUIRE(bypassTxs2 == bypassTxs); + } + }); +} + +TEST_CASE("freeze bypass tx hash allows frozen key access at validation time", + "[frozenledgerkeys][tx][bypass]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto a1 = + root->create("A1", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto a2 = + root->create("A2", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto feeSource = root->create("feeSource", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + + enum class TxWrapperKind + { + REGULAR, + FEE_BUMP + }; + + auto makeTx = [&](TxWrapperKind txWrapperKind) { + std::vector ops = {payment(a2.getPublicKey(), 100)}; + auto innerTx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), ops); + if (txWrapperKind == TxWrapperKind::REGULAR) + { + return std::make_pair(TransactionTestFramePtr(innerTx), + innerTx->getContentsHash()); + } + + auto tx = feeBump(*app, feeSource, innerTx, 10000); + return std::make_pair(tx, tx->getContentsHash()); + }; + + auto checkFrozen = [&](TransactionTestFramePtr& tx, + bool expectInnerFrozenResult) { + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(!result->isSuccess()); + if (expectInnerFrozenResult) + { + REQUIRE(result->getResultCode() == txFEE_BUMP_INNER_FAILED); + auto const& fbRes = result->getXDR(); + auto const& innerRes = fbRes.result.innerResultPair().result; + REQUIRE(innerRes.result.code() == txFROZEN_KEY_ACCESSED); + } + else + { + REQUIRE(result->getResultCode() == txFROZEN_KEY_ACCESSED); + } + }; + + auto checkValid = [&](TransactionTestFramePtr& tx) { + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(result->isSuccess()); + }; + + auto checkBypassScenario = [&](TxWrapperKind txWrapperKind, + std::function freezeKeyFn, + bool expectInnerFrozenResult) { + freezeKeyFn(); + auto [tx, bypassHash] = makeTx(txWrapperKind); + checkFrozen(tx, expectInnerFrozenResult); + + bypassTxHash(*app, bypassHash); + checkValid(tx); + }; + + SECTION("bypass frozen tx source account in regular tx") + { + checkBypassScenario( + TxWrapperKind::REGULAR, + [&] { freezeKey(*app, accountKey(a1.getPublicKey())); }, false); + } + + SECTION("bypass frozen inner tx source account in fee bump") + { + checkBypassScenario( + TxWrapperKind::FEE_BUMP, + [&] { freezeKey(*app, accountKey(a1.getPublicKey())); }, true); + } + + SECTION("bypass frozen key accessed by operation in regular tx") + { + checkBypassScenario( + TxWrapperKind::REGULAR, + [&] { freezeKey(*app, accountKey(a2.getPublicKey())); }, false); + } + + SECTION("bypass frozen key accessed by operation in fee bump inner tx") + { + checkBypassScenario( + TxWrapperKind::FEE_BUMP, + [&] { freezeKey(*app, accountKey(a2.getPublicKey())); }, true); + } + + SECTION("bypass frozen fee bump source account") + { + checkBypassScenario( + TxWrapperKind::FEE_BUMP, + [&] { freezeKey(*app, accountKey(feeSource.getPublicKey())); }, + false); + } + + SECTION("inner tx hash does not bypass frozen fee bump source") + { + freezeKey(*app, accountKey(feeSource.getPublicKey())); + + // Build the inner tx explicitly so we can capture its contents + // hash separately from the fee bump contents hash. + std::vector ops = {payment(a2.getPublicKey(), 100)}; + auto innerTx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), ops); + auto innerHash = innerTx->getContentsHash(); + + auto tx = feeBump(*app, feeSource, innerTx, 10000); + auto feeBumpHash = tx->getContentsHash(); + REQUIRE(innerHash != feeBumpHash); + + // Bypass only the inner tx hash -- fee bump source is still + // frozen and the fee bump contents hash is not bypassed. + bypassTxHash(*app, innerHash); + checkFrozen(tx, false); + + // Now bypass the actual fee bump hash -- should pass. + bypassTxHash(*app, feeBumpHash); + checkValid(tx); + } +} + +TEST_CASE("frozen ledger keys in Soroban footprint", + "[frozenledgerkeys][tx][soroban]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + overrideSorobanNetworkConfigForTest(*app); + auto root = app->getRoot(); + + auto a1 = root->create("A1", app->getLedgerManager().getLastMinBalance(2) + + 10'000'000); + + std::unordered_set const sorobanFootprintTypes = { + CONTRACT_DATA, CONTRACT_CODE, ACCOUNT, TRUSTLINE}; + + auto isFreezableSorobanKey = [](LedgerKey const& key) { + if (key.type() != TRUSTLINE) + { + return true; + } + + auto const& tl = key.trustLine(); + return tl.asset.type() != ASSET_TYPE_POOL_SHARE && + !isIssuer(tl.accountID, tl.asset); + }; + + for (int i = 0; i < 10; ++i) + { + INFO("iteration " << i); + + UnorderedSet seenKeys; + auto readOnly = LedgerTestUtils::generateValidUniqueLedgerKeysWithTypes( + sorobanFootprintTypes, 20, seenKeys); + auto readWrite = + LedgerTestUtils::generateValidUniqueLedgerKeysWithTypes( + sorobanFootprintTypes, 20, seenKeys); + + std::vector freezableKeys; + freezableKeys.reserve(readOnly.size() + readWrite.size()); + + for (auto const& key : readOnly) + { + if (isFreezableSorobanKey(key)) + { + freezableKeys.emplace_back(key); + } + } + + for (auto const& key : readWrite) + { + if (isFreezableSorobanKey(key)) + { + freezableKeys.emplace_back(key); + } + } + + REQUIRE(!freezableKeys.empty()); + stellar::uniform_int_distribution dist(0, freezableKeys.size() - + 1); + auto frozenKey = freezableKeys[dist(Catch::rng())]; + freezeKey(*app, frozenKey); + + SorobanResources resources; + resources.instructions = 800'000; + resources.diskReadBytes = 1000; + resources.writeBytes = 1000; + resources.footprint.readOnly.insert(resources.footprint.readOnly.end(), + readOnly.begin(), readOnly.end()); + resources.footprint.readWrite.insert( + resources.footprint.readWrite.end(), readWrite.begin(), + readWrite.end()); + + auto tx = createUploadWasmTx(*app, a1, 1000, DEFAULT_TEST_RESOURCE_FEE, + resources); + + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(!result->isSuccess()); + REQUIRE(result->getResultCode() == txFROZEN_KEY_ACCESSED); + + unfreezeKey(*app, frozenKey); + } +} + +TEST_CASE("source account frozen", "[frozenledgerkeys][tx]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto a1 = + root->create("A1", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto a2 = + root->create("A2", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + + auto checkTx = [&](TransactionTestFramePtr& tx) { + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(!result->isSuccess()); + REQUIRE(result->getResultCode() == txFROZEN_KEY_ACCESSED); + }; + + SECTION("tx source account frozen") + { + auto a1Key = accountKey(a1.getPublicKey()); + freezeKey(*app, a1Key); + + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), + {payment(a2.getPublicKey(), 100)}); + checkTx(tx); + } + + SECTION("fee bump source account frozen") + { + auto feeSource = root->create("feeSource", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto feeSrcKey = accountKey(feeSource.getPublicKey()); + freezeKey(*app, feeSrcKey); + auto innerTx = transactionFromOperations( + *app, a1.getSecretKey(), a1.nextSequenceNumber(), + {payment(a2.getPublicKey(), 100)}); + auto feeBumpTx = feeBump(*app, feeSource, innerTx, 10000); + checkTx(feeBumpTx); + } + + SECTION("op source account frozen") + { + auto opSource = root->create("opSource", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto opSrcKey = accountKey(opSource.getPublicKey()); + freezeKey(*app, opSrcKey); + + auto payOp = payment(a2.getPublicKey(), 100); + payOp.sourceAccount.activate() = + toMuxedAccount(opSource.getPublicKey()); + + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), {payOp}); + tx->addSignature(opSource.getSecretKey()); + checkTx(tx); + } + + SECTION("one of multiple ops source account frozen") + { + auto opSource1 = root->create("opSource1", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto opSrcKey1 = accountKey(opSource1.getPublicKey()); + auto opSource2 = root->create("opSource2", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto opSrcKey2 = accountKey(opSource2.getPublicKey()); + freezeKey(*app, opSrcKey2); + + auto op1 = payment(a2.getPublicKey(), 100); + op1.sourceAccount.activate() = toMuxedAccount(opSource1.getPublicKey()); + auto op2 = payment(a2.getPublicKey(), 100); + auto op3 = payment(a2.getPublicKey(), 100); + op3.sourceAccount.activate() = toMuxedAccount(opSource2.getPublicKey()); + + auto tx = transactionFromOperations( + *app, a1.getSecretKey(), a1.nextSequenceNumber(), {op1, op2, op3}); + tx->addSignature(opSource1.getSecretKey()); + + checkTx(tx); + } + + SECTION("tx source AND destination both frozen") + { + auto a1Key = accountKey(a1.getPublicKey()); + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a1Key); + freezeKey(*app, a2Key); + + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), + {payment(a2.getPublicKey(), 100)}); + checkTx(tx); + } + + SECTION("tx source frozen via muxed account ID") + { + auto a1Key = accountKey(a1.getPublicKey()); + freezeKey(*app, a1Key); + + // Build a tx envelope with a muxed source account (includes a + // memo id). The frozen key is keyed on the underlying ed25519 + // account, so it must still be detected. + auto muxedSrc = toMuxedAccount(a1.getPublicKey(), 12345); + auto payOp = payment(a2.getPublicKey(), 100); + TransactionEnvelope env(ENVELOPE_TYPE_TX); + env.v1().tx.sourceAccount = muxedSrc; + env.v1().tx.fee = 100; + env.v1().tx.seqNum = a1.nextSequenceNumber(); + env.v1().tx.operations.emplace_back(payOp); + + auto tx = TransactionTestFrame::fromTxFrame( + TransactionFrameBase::makeTransactionFromWire(app->getNetworkID(), + env)); + tx->addSignature(a1.getSecretKey()); + checkTx(tx); + } + + SECTION("op source frozen via muxed account ID") + { + auto opSource = root->create("opSourceMux", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto opSrcKey = accountKey(opSource.getPublicKey()); + freezeKey(*app, opSrcKey); + + auto payOp = payment(a2.getPublicKey(), 100); + payOp.sourceAccount.activate() = + toMuxedAccount(opSource.getPublicKey(), 99999); + + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), {payOp}); + tx->addSignature(opSource.getSecretKey()); + checkTx(tx); + } + + SECTION("unfreeze restores tx validity") + { + auto a1Key = accountKey(a1.getPublicKey()); + freezeKey(*app, a1Key); + + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), + {payment(a2.getPublicKey(), 100)}); + checkTx(tx); + + unfreezeKey(*app, a1Key); + + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(result->isSuccess()); + } +} + +TEST_CASE("source trustline frozen", "[frozenledgerkeys][tx]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto issuer = root->create("issuer", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto a1 = + root->create("A1", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto a2 = + root->create("A2", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + + auto usd = makeAsset(issuer, "USD"); + auto eur = makeAsset(issuer, "EUR"); + + a1.changeTrust(usd, INT64_MAX); + a1.changeTrust(eur, INT64_MAX); + a2.changeTrust(usd, INT64_MAX); + a2.changeTrust(eur, INT64_MAX); + issuer.pay(a1, usd, 10000); + issuer.pay(a1, eur, 10000); + issuer.pay(a2, usd, 10000); + issuer.pay(a2, eur, 10000); + + auto checkAccessesFrozenKey = [&](Operation const& op) { + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), {op}); + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(!result->isSuccess()); + REQUIRE(result->getResultCode() == txFROZEN_KEY_ACCESSED); + }; + + auto a1UsdTL = trustlineKey(a1.getPublicKey(), usd); + auto a1EurTL = trustlineKey(a1.getPublicKey(), eur); + + SECTION("PaymentOp source trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey(payment(a2.getPublicKey(), usd, 100)); + } + + SECTION("PathPaymentStrictReceive sendAsset trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey( + pathPayment(a2.getPublicKey(), usd, 100, usd, 100, {})); + } + + SECTION("PathPaymentStrictSend sendAsset trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey( + pathPaymentStrictSend(a2.getPublicKey(), usd, 100, usd, 90, {})); + } + + SECTION("ManageSellOffer selling trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey(manageOffer(0, usd, eur, Price{1, 1}, 100)); + } + + SECTION("ManageSellOffer buying trustline frozen") + { + freezeKey(*app, a1EurTL); + checkAccessesFrozenKey(manageOffer(0, usd, eur, Price{1, 1}, 100)); + } + + SECTION("ManageBuyOffer selling trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey(manageBuyOffer(0, usd, eur, Price{1, 1}, 100)); + } + + SECTION("ManageBuyOffer buying trustline frozen") + { + freezeKey(*app, a1EurTL); + checkAccessesFrozenKey(manageBuyOffer(0, usd, eur, Price{1, 1}, 100)); + } + + SECTION("CreatePassiveSellOffer selling trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey(createPassiveOffer(usd, eur, Price{1, 1}, 100)); + } + + SECTION("CreatePassiveSellOffer buying trustline frozen") + { + freezeKey(*app, a1EurTL); + checkAccessesFrozenKey(createPassiveOffer(usd, eur, Price{1, 1}, 100)); + } + + SECTION("ChangeTrustOp trustline frozen") + { + freezeKey(*app, a1UsdTL); + checkAccessesFrozenKey(changeTrust(usd, INT64_MAX - 1)); + } + SECTION("CreateClaimableBalance source trustline frozen") + { + freezeKey(*app, a1UsdTL); + + Claimant claimant; + claimant.v0().destination = a2.getPublicKey(); + claimant.v0().predicate.type(CLAIM_PREDICATE_UNCONDITIONAL); + + checkAccessesFrozenKey(createClaimableBalance(usd, 100, {claimant})); + } +} + +TEST_CASE("operation destination frozen", "[frozenledgerkeys][tx]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto issuer = root->create("issuer", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto a1 = + root->create("A1", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto a2 = + root->create("A2", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + + auto usd = makeAsset(issuer, "USD"); + auto xlm = makeNativeAsset(); + auto eur = makeAsset(issuer, "EUR"); + + a1.changeTrust(usd, INT64_MAX); + a1.changeTrust(eur, INT64_MAX); + a2.changeTrust(usd, INT64_MAX); + a2.changeTrust(eur, INT64_MAX); + issuer.pay(a1, usd, 10000); + issuer.pay(a1, eur, 10000); + issuer.pay(a2, usd, 10000); + issuer.pay(a2, eur, 10000); + + auto checkAccessesFrozenKeyWithSource = [&](auto& sourceAccount, + Operation const& op) { + auto tx = + transactionFromOperations(*app, sourceAccount.getSecretKey(), + sourceAccount.nextSequenceNumber(), {op}); + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), lrv, 0, 0, 0); + REQUIRE(!result->isSuccess()); + REQUIRE(result->getResultCode() == txFROZEN_KEY_ACCESSED); + }; + + auto checkAccessesFrozenKey = [&](Operation const& op) { + checkAccessesFrozenKeyWithSource(a1, op); + }; + + auto a2UsdTL = trustlineKey(a2.getPublicKey(), usd); + + SECTION("PaymentOp destination trustline frozen") + { + freezeKey(*app, a2UsdTL); + checkAccessesFrozenKey(payment(a2.getPublicKey(), usd, 100)); + } + + SECTION("PaymentOp native destination account frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + checkAccessesFrozenKey(payment(a2.getPublicKey(), 100)); + } + + SECTION("PathPaymentStrictReceive destination trustline frozen") + { + freezeKey(*app, a2UsdTL); + checkAccessesFrozenKey( + pathPayment(a2.getPublicKey(), usd, 100, usd, 100, {})); + } + + SECTION("PathPaymentStrictReceive native destination account frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + checkAccessesFrozenKey( + pathPayment(a2.getPublicKey(), xlm, 100, xlm, 100, {})); + } + + SECTION("PathPaymentStrictSend destination trustline frozen") + { + freezeKey(*app, a2UsdTL); + checkAccessesFrozenKey( + pathPaymentStrictSend(a2.getPublicKey(), usd, 100, usd, 90, {})); + } + + SECTION("PathPaymentStrictSend native destination account frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + checkAccessesFrozenKey( + pathPaymentStrictSend(a2.getPublicKey(), xlm, 100, xlm, 100, {})); + } + + SECTION("AllowTrustOp trustor trustline frozen") + { + freezeKey(*app, a2UsdTL); + checkAccessesFrozenKeyWithSource( + issuer, allowTrust(a2.getPublicKey(), usd, AUTHORIZED_FLAG)); + } + + SECTION("SetTrustLineFlagsOp trustor trustline frozen") + { + // Issuer must have AUTH_REVOCABLE flag to set trustline flags + issuer.setOptions(setFlags(AUTH_REVOCABLE_FLAG)); + freezeKey(*app, a2UsdTL); + checkAccessesFrozenKeyWithSource( + issuer, setTrustLineFlags(a2.getPublicKey(), usd, + setTrustLineFlags(AUTHORIZED_FLAG))); + } + + SECTION("ClawbackOp from trustline frozen") + { + // Issuer needs clawback enabled + auto clawbackIssuer = root->create( + "clawIssuer", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + clawbackIssuer.setOptions( + setFlags(AUTH_REVOCABLE_FLAG | AUTH_CLAWBACK_ENABLED_FLAG)); + auto clawAsset = makeAsset(clawbackIssuer, "CLW"); + a2.changeTrust(clawAsset, INT64_MAX); + clawbackIssuer.pay(a2, clawAsset, 1000); + + auto a2ClwTL = trustlineKey(a2.getPublicKey(), clawAsset); + freezeKey(*app, a2ClwTL); + + checkAccessesFrozenKeyWithSource( + clawbackIssuer, clawback(a2.getPublicKey(), clawAsset, 100)); + } + + SECTION("RevokeSponsorshipOp ledger key frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + checkAccessesFrozenKey(revokeSponsorship(a2Key)); + } + + SECTION("RevokeSponsorshipOp signer account frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + + SignerKey signerKey; + signerKey.type(SIGNER_KEY_TYPE_ED25519); + signerKey.ed25519() = a1.getPublicKey().ed25519(); + + checkAccessesFrozenKey(revokeSponsorship(a2.getPublicKey(), signerKey)); + } + + SECTION("AccountMergeOp destination account frozen") + { + auto a2Key = accountKey(a2.getPublicKey()); + freezeKey(*app, a2Key); + checkAccessesFrozenKey(accountMerge(a2.getPublicKey())); + } + + SECTION("CreateAccountOp destination account frozen") + { + AccountID destKey{}; + freezeKey(*app, accountKey(destKey)); + checkAccessesFrozenKey(createAccount(destKey, 10000000)); + } +} + +TEST_CASE("frozen ledger keys apply time validation", "[frozenledgerkeys][tx]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto issuer = root->create("issuer", lm.getLastMinBalance(10) + + 10 * lm.getLastTxFee()); + auto a1 = + root->create("A1", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + auto a2 = + root->create("A2", lm.getLastMinBalance(10) + 10 * lm.getLastTxFee()); + + auto usd = makeAsset(issuer, "USD"); + auto eur = makeAsset(issuer, "EUR"); + + a1.changeTrust(usd, INT64_MAX); + a1.changeTrust(eur, INT64_MAX); + a2.changeTrust(usd, INT64_MAX); + a2.changeTrust(eur, INT64_MAX); + issuer.pay(a1, usd, 10000); + issuer.pay(a1, eur, 10000); + issuer.pay(a2, usd, 10000); + + SECTION("claim claimable balance trustline frozen") + { + Claimant claimant; + claimant.v0().destination = a2.getPublicKey(); + claimant.v0().predicate.type(CLAIM_PREDICATE_UNCONDITIONAL); + a1.createClaimableBalance(usd, 100, {claimant}); + auto cbID = a1.getBalanceID(0); + + auto a2UsdTL = trustlineKey(a2.getPublicKey(), usd); + freezeKey(*app, a2UsdTL); + + auto tx = transactionFromOperations(*app, a2.getSecretKey(), + a2.nextSequenceNumber(), + {claimClaimableBalance(cbID)}); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + REQUIRE(r.results[0] + .result.result.results()[0] + .tr() + .claimClaimableBalanceResult() + .code() == CLAIM_CLAIMABLE_BALANCE_TRUSTLINE_FROZEN); + } + + auto checkLPTrustlineFrozen = [&](LedgerKey const& frozenTrustline, + bool isDeposit) { + auto share = + makeChangeTrustAssetPoolShare(eur, usd, LIQUIDITY_POOL_FEE_V18); + auto poolID = xdrSha256(share.liquidityPool()); + a1.changeTrust(share, INT64_MAX); + a1.liquidityPoolDeposit(poolID, 1000, 1000, Price{1, 1}, Price{1, 1}); + + auto op = isDeposit ? liquidityPoolDeposit(poolID, 100, 100, + Price{1, 1}, Price{1, 1}) + : liquidityPoolWithdraw(poolID, 100, 0, 0); + + freezeKey(*app, frozenTrustline); + auto tx = transactionFromOperations(*app, a1.getSecretKey(), + a1.nextSequenceNumber(), {op}); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + auto const& opResult = r.results[0].result.result.results()[0].tr(); + if (isDeposit) + { + REQUIRE(opResult.liquidityPoolDepositResult().code() == + LIQUIDITY_POOL_DEPOSIT_TRUSTLINE_FROZEN); + } + else + { + REQUIRE(opResult.liquidityPoolWithdrawResult().code() == + LIQUIDITY_POOL_WITHDRAW_TRUSTLINE_FROZEN); + } + }; + SECTION("liquidity pool deposit assetA trustline frozen") + { + auto a1EurTL = trustlineKey(a1.getPublicKey(), eur); + checkLPTrustlineFrozen(a1EurTL, true); + } + + SECTION("liquidity pool deposit assetB trustline frozen") + { + auto a1UsdTL = trustlineKey(a1.getPublicKey(), usd); + checkLPTrustlineFrozen(a1UsdTL, true); + } + + SECTION("liquidity pool withdraw assetA trustline frozen") + { + auto a1EurTL = trustlineKey(a1.getPublicKey(), eur); + checkLPTrustlineFrozen(a1EurTL, false); + } + + SECTION("liquidity pool withdraw assetB trustline frozen") + { + auto a1UsdTL = trustlineKey(a1.getPublicKey(), usd); + checkLPTrustlineFrozen(a1UsdTL, false); + } +} + +TEST_CASE("sponsorship can be removed with frozen sponsor", + "[frozenledgerkeys][tx][sponsorship]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto minBalance = lm.getLastMinBalance(10) + 20 * lm.getLastTxFee(); + auto frozenSponsor = root->create("frozenSponsor", minBalance); + auto sponsored = root->create("sponsored", minBalance); + auto issuer = root->create("issuer", minBalance); + + auto usd = makeAsset(issuer, "USD"); + + auto getNumSponsoringFor = [&](TestAccount const& account) { + LedgerTxn ltx(app->getLedgerTxnRoot()); + auto ltxe = loadAccount(ltx, account.getPublicKey(), true); + REQUIRE(ltxe); + return getNumSponsoring(ltxe.current()); + }; + + auto getNumSponsoredFor = [&](TestAccount const& account) { + LedgerTxn ltx(app->getLedgerTxnRoot()); + auto ltxe = loadAccount(ltx, account.getPublicKey(), true); + REQUIRE(ltxe); + return getNumSponsored(ltxe.current()); + }; + + auto createSponsoredTLTx = transactionFrameFromOps( + app->getNetworkID(), frozenSponsor, + {frozenSponsor.op(beginSponsoringFutureReserves(sponsored)), + sponsored.op(changeTrust(usd, INT64_MAX)), + sponsored.op(endSponsoringFutureReserves())}, + {sponsored}); + auto createRes = closeLedger(*app, {createSponsoredTLTx}); + checkTx(0, createRes, txSUCCESS); + + REQUIRE(sponsored.hasTrustLine(usd)); + REQUIRE(getNumSponsoringFor(frozenSponsor) == 1); + REQUIRE(getNumSponsoredFor(sponsored) == 1); + + freezeKey(*app, accountKey(frozenSponsor.getPublicKey())); + + auto removeTx = transactionFromOperations(*app, sponsored.getSecretKey(), + sponsored.nextSequenceNumber(), + {changeTrust(usd, 0)}); + auto removeRes = closeLedger(*app, {removeTx}); + checkTx(0, removeRes, txSUCCESS); + + REQUIRE(!sponsored.hasTrustLine(usd)); + REQUIRE(getNumSponsoringFor(frozenSponsor) == 0); + REQUIRE(getNumSponsoredFor(sponsored) == 0); +} + +TEST_CASE("deauth removes offers on frozen account", "[frozenledgerkeys][tx]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto minBalance = lm.getLastMinBalance(10) + 20 * lm.getLastTxFee(); + auto issuer = root->create("issuer", minBalance); + issuer.setOptions(setFlags(AUTH_REQUIRED_FLAG | AUTH_REVOCABLE_FLAG)); + auto frozenAcct = root->create("frozenAcct", minBalance); + + auto usd = makeAsset(issuer, "USD"); + auto xlm = makeNativeAsset(); + + frozenAcct.changeTrust(usd, INT64_MAX); + issuer.allowTrust(usd, frozenAcct.getPublicKey(), AUTHORIZED_FLAG); + issuer.pay(frozenAcct, usd, 5000); + + auto offerID = frozenAcct.manageOffer(0, usd, xlm, Price{1, 1}, 1000); + + // Verify the offer exists and selling liabilities are set. + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + REQUIRE(loadOffer(ltx, frozenAcct.getPublicKey(), offerID)); + auto tl = loadTrustLine(ltx, frozenAcct.getPublicKey(), usd); + REQUIRE(tl); + REQUIRE(tl.getSellingLiabilities(ltx.loadHeader()) > 0); + } + + // Freeze the ACCOUNT (not the trustline). + freezeKey(*app, accountKey(frozenAcct.getPublicKey())); + + // The issuer deauthorizes the (non-frozen) trustline. This triggers offer + // removal which releases liabilities on the frozen account — an allowed + // modification per CAP-77. + auto deauthTx = transactionFromOperations( + *app, issuer.getSecretKey(), issuer.nextSequenceNumber(), + {setTrustLineFlags(frozenAcct.getPublicKey(), usd, + clearTrustLineFlags(AUTHORIZED_FLAG))}); + auto r = closeLedger(*app, {deauthTx}); + checkTx(0, r, txSUCCESS); + + // The offer should be removed and liabilities released, even though the + // account is frozen. + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + REQUIRE(!loadOffer(ltx, frozenAcct.getPublicKey(), offerID)); + auto tl = loadTrustLine(ltx, frozenAcct.getPublicKey(), usd); + REQUIRE(tl); + REQUIRE(tl.getSellingLiabilities(ltx.loadHeader()) == 0); + } +} + +// Below are the helper types/functions for the DEX tests. + +enum class DexOfferOpKind +{ + MANAGE_SELL, + MANAGE_BUY, + CREATE_PASSIVE_SELL +}; + +enum class DexPathOpKind +{ + STRICT_RECEIVE, + STRICT_SEND +}; + +enum class DexAssetPairKind +{ + CREDIT_NATIVE, + NATIVE_CREDIT, + CREDIT_CREDIT +}; + +enum class FrozenSide +{ + SELLING, + BUYING, + BOTH +}; + +char const* +toString(DexOfferOpKind opKind) +{ + switch (opKind) + { + case DexOfferOpKind::MANAGE_SELL: + return "manage-sell"; + case DexOfferOpKind::MANAGE_BUY: + return "manage-buy"; + case DexOfferOpKind::CREATE_PASSIVE_SELL: + return "create-passive-sell"; + } + throw std::runtime_error("unexpected dex offer op kind"); +} + +char const* +toString(DexPathOpKind opKind) +{ + switch (opKind) + { + case DexPathOpKind::STRICT_RECEIVE: + return "path-strict-receive"; + case DexPathOpKind::STRICT_SEND: + return "path-strict-send"; + } + throw std::runtime_error("unexpected dex path op kind"); +} + +char const* +toString(DexAssetPairKind pairKind) +{ + switch (pairKind) + { + case DexAssetPairKind::CREDIT_NATIVE: + return "credit-native"; + case DexAssetPairKind::NATIVE_CREDIT: + return "native-credit"; + case DexAssetPairKind::CREDIT_CREDIT: + return "credit-credit"; + } + throw std::runtime_error("unexpected dex asset pair kind"); +} + +char const* +toString(FrozenSide side) +{ + switch (side) + { + case FrozenSide::SELLING: + return "selling-frozen"; + case FrozenSide::BUYING: + return "buying-frozen"; + case FrozenSide::BOTH: + return "both-frozen"; + } + throw std::runtime_error("unexpected frozen side"); +} + +std::vector +getFrozenAssets(Asset const& selling, Asset const& buying, FrozenSide side) +{ + switch (side) + { + case FrozenSide::SELLING: + return {selling}; + case FrozenSide::BUYING: + return {buying}; + case FrozenSide::BOTH: + return {selling, buying}; + } + throw std::runtime_error("unexpected frozen side"); +} + +struct DexAssetState +{ + int64_t balance; + Liabilities liabilities; +}; + +DexAssetState +loadDexAssetState(Application& app, TestAccount const& account, + Asset const& asset) +{ + DexAssetState res; + res.liabilities.selling = 0; + res.liabilities.buying = 0; + LedgerTxn ltx(app.getLedgerTxnRoot()); + auto header = ltx.loadHeader(); + if (asset.type() == ASSET_TYPE_NATIVE) + { + auto acc = stellar::loadAccount(ltx, account.getPublicKey()); + REQUIRE(acc); + res.balance = acc.current().data.account().balance; + res.liabilities.selling = getSellingLiabilities(header, acc); + res.liabilities.buying = getBuyingLiabilities(header, acc); + } + else + { + auto tl = stellar::loadTrustLine(ltx, account.getPublicKey(), asset); + REQUIRE(tl); + res.balance = tl.getBalance(); + res.liabilities.selling = tl.getSellingLiabilities(header); + res.liabilities.buying = tl.getBuyingLiabilities(header); + } + return res; +} + +bool +offerExists(Application& app, TestAccount const& seller, int64_t offerID) +{ + LedgerTxn ltx(app.getLedgerTxnRoot()); + return static_cast(loadOffer(ltx, seller.getPublicKey(), offerID)); +} + +LedgerKey +frozenKeyForAsset(TestAccount const& account, Asset const& asset) +{ + if (asset.type() == ASSET_TYPE_NATIVE) + { + return accountKey(account.getPublicKey()); + } + return trustlineKey(account.getPublicKey(), asset); +} + +Operation +makeOfferDexOp(DexOfferOpKind opKind, Asset const& selling, Asset const& buying) +{ + switch (opKind) + { + case DexOfferOpKind::MANAGE_SELL: + return manageOffer(0, selling, buying, Price{1, 100}, 300); + case DexOfferOpKind::MANAGE_BUY: + return manageBuyOffer(0, selling, buying, Price{2, 1}, 300); + case DexOfferOpKind::CREATE_PASSIVE_SELL: + return createPassiveOffer(selling, buying, Price{1, 100}, 300); + } + throw std::runtime_error("unexpected dex offer op kind"); +} + +template +size_t +claimedOfferCount(T const& tr, DexOfferOpKind opKind) +{ + switch (opKind) + { + case DexOfferOpKind::MANAGE_SELL: + return tr.manageSellOfferResult().success().offersClaimed.size(); + case DexOfferOpKind::MANAGE_BUY: + return tr.manageBuyOfferResult().success().offersClaimed.size(); + case DexOfferOpKind::CREATE_PASSIVE_SELL: + return tr.manageSellOfferResult().success().offersClaimed.size(); + } + throw std::runtime_error("unexpected dex offer op kind"); +} + +template +size_t +claimedOfferCount(T const& tr, DexPathOpKind opKind) +{ + if (opKind == DexPathOpKind::STRICT_RECEIVE) + { + return tr.pathPaymentStrictReceiveResult().success().offers.size(); + } + return tr.pathPaymentStrictSendResult().success().offers.size(); +} + +TEST_CASE("frozen ledger keys DEX offer operations", + "[frozenledgerkeys][tx][offers]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto minBalance = lm.getLastMinBalance(20) + 100 * lm.getLastTxFee(); + auto issuerA = root->create("issuerA", minBalance); + auto issuerB = root->create("issuerB", minBalance); + auto frozenSeller1 = root->create("frozenSeller1", minBalance); + auto frozenSeller2 = root->create("frozenSeller2", minBalance); + auto activeSeller = root->create("activeSeller", minBalance); + auto buyer = root->create("buyer", minBalance); + + auto xlm = makeNativeAsset(); + auto usd = makeAsset(issuerA, "USD"); + auto eur = makeAsset(issuerB, "EUR"); + + auto ensureTrust = [&](TestAccount& account, Asset const& asset) { + if (asset.type() != ASSET_TYPE_NATIVE && !account.hasTrustLine(asset)) + { + account.changeTrust(asset, INT64_MAX); + } + }; + + auto fundAsset = [&](TestAccount& account, Asset const& asset, + int64_t amount) { + if (asset.type() == ASSET_TYPE_NATIVE) + { + root->pay(account, amount); + } + else + { + ensureTrust(account, asset); + if (asset == usd) + { + issuerA.pay(account, asset, amount); + } + else + { + REQUIRE(asset == eur); + issuerB.pay(account, asset, amount); + } + } + }; + + auto opKind = + GENERATE(DexOfferOpKind::MANAGE_SELL, DexOfferOpKind::MANAGE_BUY, + DexOfferOpKind::CREATE_PASSIVE_SELL); + auto pairKind = GENERATE(DexAssetPairKind::CREDIT_NATIVE, + DexAssetPairKind::NATIVE_CREDIT, + DexAssetPairKind::CREDIT_CREDIT); + auto side = + GENERATE(FrozenSide::SELLING, FrozenSide::BUYING, FrozenSide::BOTH); + // Generate two offers: first is always frozen, second is active or frozen + // based on this flag. + auto secondOfferIsActive = GENERATE(true, false); + + DYNAMIC_SECTION(fmt::format( + "{} [{}][{}][{}]", + secondOfferIsActive ? "second offer active" : "second offer frozen", + toString(opKind), toString(pairKind), toString(side))) + { + Asset makerSelling; + Asset makerBuying; + switch (pairKind) + { + case DexAssetPairKind::CREDIT_NATIVE: + makerSelling = usd; + makerBuying = xlm; + break; + case DexAssetPairKind::NATIVE_CREDIT: + makerSelling = xlm; + makerBuying = usd; + break; + case DexAssetPairKind::CREDIT_CREDIT: + makerSelling = usd; + makerBuying = eur; + break; + } + + auto prepareMaker = [&](TestAccount& account) { + ensureTrust(account, makerSelling); + ensureTrust(account, makerBuying); + fundAsset(account, makerSelling, 10'000); + }; + + prepareMaker(frozenSeller1); + prepareMaker(frozenSeller2); + prepareMaker(activeSeller); + ensureTrust(buyer, makerSelling); + ensureTrust(buyer, makerBuying); + fundAsset(buyer, makerBuying, 10'000); + + auto frozenOffer1 = frozenSeller1.manageOffer( + 0, makerSelling, makerBuying, Price{1, 1}, 1'000); + auto frozenOffer2 = int64_t{0}; + auto activeOffer = int64_t{0}; + if (secondOfferIsActive) + { + activeOffer = activeSeller.manageOffer(0, makerSelling, makerBuying, + Price{2, 1}, 1'000); + } + else + { + frozenOffer2 = frozenSeller2.manageOffer( + 0, makerSelling, makerBuying, Price{2, 1}, 1'000); + } + + auto frozenAssets = getFrozenAssets(makerSelling, makerBuying, side); + struct FrozenState + { + TestAccount* seller; + Asset asset; + DexAssetState pre; + }; + std::vector frozenStates; + + auto freezeForSeller = [&](TestAccount& seller) { + for (auto const& asset : frozenAssets) + { + freezeKey(*app, frozenKeyForAsset(seller, asset)); + auto pre = loadDexAssetState(*app, seller, asset); + REQUIRE(pre.liabilities.selling + pre.liabilities.buying > 0); + frozenStates.emplace_back(FrozenState{&seller, asset, pre}); + } + }; + + freezeForSeller(frozenSeller1); + if (!secondOfferIsActive) + { + freezeForSeller(frozenSeller2); + } + + auto frozen1SellingPre = + loadDexAssetState(*app, frozenSeller1, makerSelling).balance; + auto frozen1BuyingPre = + loadDexAssetState(*app, frozenSeller1, makerBuying).balance; + auto frozen2SellingPre = + loadDexAssetState(*app, frozenSeller2, makerSelling).balance; + auto frozen2BuyingPre = + loadDexAssetState(*app, frozenSeller2, makerBuying).balance; + auto activeSellingPre = + loadDexAssetState(*app, activeSeller, makerSelling).balance; + auto activeBuyingPre = + loadDexAssetState(*app, activeSeller, makerBuying).balance; + auto buyerSellingPre = + loadDexAssetState(*app, buyer, makerBuying).balance; + auto buyerBuyingPre = + loadDexAssetState(*app, buyer, makerSelling).balance; + + auto op = makeOfferDexOp(opKind, makerBuying, makerSelling); + op.sourceAccount.activate() = toMuxedAccount(buyer.getPublicKey()); + // Pay for transaction from the root account in order to have clean XLM + // balance changes. + auto tx = transactionFromOperations(*app, root->getSecretKey(), + root->nextSequenceNumber(), {op}); + tx->addSignature(buyer.getSecretKey()); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + + auto const& tr = r.results[0].result.result.results()[0].tr(); + if (secondOfferIsActive) + { + REQUIRE(claimedOfferCount(tr, opKind) > 0); + } + else + { + REQUIRE(claimedOfferCount(tr, opKind) == 0); + } + + REQUIRE(!offerExists(*app, frozenSeller1, frozenOffer1)); + if (secondOfferIsActive) + { + REQUIRE(offerExists(*app, activeSeller, activeOffer)); + } + else + { + REQUIRE(!offerExists(*app, frozenSeller2, frozenOffer2)); + } + + auto frozen1SellingPost = + loadDexAssetState(*app, frozenSeller1, makerSelling).balance; + auto frozen1BuyingPost = + loadDexAssetState(*app, frozenSeller1, makerBuying).balance; + auto frozen2SellingPost = + loadDexAssetState(*app, frozenSeller2, makerSelling).balance; + auto frozen2BuyingPost = + loadDexAssetState(*app, frozenSeller2, makerBuying).balance; + auto activeSellingPost = + loadDexAssetState(*app, activeSeller, makerSelling).balance; + auto activeBuyingPost = + loadDexAssetState(*app, activeSeller, makerBuying).balance; + auto buyerSellingPost = + loadDexAssetState(*app, buyer, makerBuying).balance; + auto buyerBuyingPost = + loadDexAssetState(*app, buyer, makerSelling).balance; + + REQUIRE(frozen1SellingPost == frozen1SellingPre); + REQUIRE(frozen1BuyingPost == frozen1BuyingPre); + // With second offer active, exactly one unfrozen offer at price 2:1 is + // crossed. Math: + // - manage-buy buys 300 units -> pays 600 units. + // - manage-sell/create-passive sell 300 units -> receive 150 units. + int64_t expectedActiveSold = 0; + int64_t expectedActiveBought = 0; + switch (opKind) + { + case DexOfferOpKind::MANAGE_BUY: + expectedActiveSold = 300; + expectedActiveBought = 600; + break; + case DexOfferOpKind::MANAGE_SELL: + case DexOfferOpKind::CREATE_PASSIVE_SELL: + expectedActiveSold = 150; + expectedActiveBought = 300; + break; + } + + if (secondOfferIsActive) + { + REQUIRE(activeSellingPre - activeSellingPost == expectedActiveSold); + REQUIRE(activeBuyingPost - activeBuyingPre == expectedActiveBought); + REQUIRE(buyerBuyingPost - buyerBuyingPre == expectedActiveSold); + REQUIRE(buyerSellingPre - buyerSellingPost == expectedActiveBought); + } + else + { + REQUIRE(activeSellingPost == activeSellingPre); + REQUIRE(activeBuyingPost == activeBuyingPre); + REQUIRE(frozen2SellingPost == frozen2SellingPre); + REQUIRE(frozen2BuyingPost == frozen2BuyingPre); + REQUIRE(buyerBuyingPost == buyerBuyingPre); + REQUIRE(buyerSellingPost == buyerSellingPre); + } + + for (auto const& frozenState : frozenStates) + { + auto post = + loadDexAssetState(*app, *frozenState.seller, frozenState.asset); + REQUIRE(post.balance == frozenState.pre.balance); + REQUIRE(post.liabilities.selling == 0); + REQUIRE(post.liabilities.buying == 0); + } + } +} + +TEST_CASE("frozen ledger keys DEX path payments", + "[frozenledgerkeys][tx][offers]") +{ + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + + auto minBalance = lm.getLastMinBalance(20) + 100 * lm.getLastTxFee(); + auto issuerB = root->create("issuerB", minBalance); + auto issuerC = root->create("issuerC", minBalance); + + auto payer = root->create("payer", minBalance); + auto destination = root->create("destination", minBalance); + + auto l1Best = root->create("l1Best", minBalance); + auto l1Fallback = root->create("l1Fallback", minBalance); + auto l2Best = root->create("l2Best", minBalance); + auto l2Fallback = root->create("l2Fallback", minBalance); + auto l3Best = root->create("l3Best", minBalance); + auto l3Fallback = root->create("l3Fallback", minBalance); + + auto a = makeNativeAsset(); + auto b = makeAsset(issuerB, "USD"); + auto c = makeAsset(issuerC, "EUR"); + + auto ensureTrust = [&](TestAccount& account, Asset const& asset) { + if (asset.type() != ASSET_TYPE_NATIVE && !account.hasTrustLine(asset)) + { + account.changeTrust(asset, INT64_MAX); + } + }; + + auto fundAsset = [&](TestAccount& account, Asset const& asset, + int64_t amount) { + if (asset.type() == ASSET_TYPE_NATIVE) + { + root->pay(account, amount); + } + else + { + ensureTrust(account, asset); + if (asset == b) + { + issuerB.pay(account, asset, amount); + } + else + { + REQUIRE(asset == c); + issuerC.pay(account, asset, amount); + } + } + }; + + struct LegState + { + TestAccount* best; + TestAccount* fallback; + Asset selling; + Asset buying; + int64_t bestOffer; + int64_t fallbackOffer; + }; + + std::array legs = {LegState{&l1Best, &l1Fallback, b, a, 0, 0}, + LegState{&l2Best, &l2Fallback, c, b, 0, 0}, + LegState{&l3Best, &l3Fallback, a, c, 0, 0}}; + + auto prepareMaker = [&](TestAccount& account, Asset const& selling, + Asset const& buying) { + ensureTrust(account, selling); + ensureTrust(account, buying); + fundAsset(account, selling, 10'000); + }; + + for (auto& leg : legs) + { + prepareMaker(*leg.best, leg.selling, leg.buying); + prepareMaker(*leg.fallback, leg.selling, leg.buying); + leg.bestOffer = leg.best->manageOffer(0, leg.selling, leg.buying, + Price{1, 1}, 1'000); + leg.fallbackOffer = leg.fallback->manageOffer( + 0, leg.selling, leg.buying, Price{2, 1}, 1'000); + } + + auto makePathDexOp = [&](DexPathOpKind opKind, PublicKey const& destination, + Asset const& a, Asset const& b, Asset const& c) { + if (opKind == DexPathOpKind::STRICT_RECEIVE) + { + return pathPayment(destination, a, 10'000, a, 200, {b, c}); + } + return pathPaymentStrictSend(destination, a, 400, a, 1, {b, c}); + }; + + auto opKind = + GENERATE(DexPathOpKind::STRICT_RECEIVE, DexPathOpKind::STRICT_SEND); + auto side = + GENERATE(FrozenSide::SELLING, FrozenSide::BUYING, FrozenSide::BOTH); + auto legToFreeze = GENERATE(0, 1, 2); + + DYNAMIC_SECTION(fmt::format("A->B->C->A [{}][leg={}][{}]", toString(opKind), + legToFreeze, toString(side))) + { + auto& targetLeg = legs[legToFreeze]; + auto frozenAssets = + getFrozenAssets(targetLeg.selling, targetLeg.buying, side); + + struct FrozenState + { + Asset asset; + DexAssetState pre; + }; + std::vector frozenStates; + for (auto const& asset : frozenAssets) + { + freezeKey(*app, frozenKeyForAsset(*targetLeg.best, asset)); + auto pre = loadDexAssetState(*app, *targetLeg.best, asset); + REQUIRE(pre.liabilities.selling + pre.liabilities.buying > 0); + frozenStates.emplace_back(FrozenState{asset, pre}); + } + + auto bestSellingPre = + loadDexAssetState(*app, *targetLeg.best, targetLeg.selling).balance; + auto bestBuyingPre = + loadDexAssetState(*app, *targetLeg.best, targetLeg.buying).balance; + auto fallbackSellingPre = + loadDexAssetState(*app, *targetLeg.fallback, targetLeg.selling) + .balance; + auto fallbackBuyingPre = + loadDexAssetState(*app, *targetLeg.fallback, targetLeg.buying) + .balance; + auto payerPre = loadDexAssetState(*app, payer, a).balance; + auto destinationPre = loadDexAssetState(*app, destination, a).balance; + + auto op = makePathDexOp(opKind, destination.getPublicKey(), a, b, c); + op.sourceAccount.activate() = toMuxedAccount(payer.getPublicKey()); + + auto tx = transactionFromOperations(*app, root->getSecretKey(), + root->nextSequenceNumber(), {op}); + tx->addSignature(payer.getSecretKey()); + + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + + auto const& tr = r.results[0].result.result.results()[0].tr(); + REQUIRE(claimedOfferCount(tr, opKind) > 0); + + REQUIRE(!offerExists(*app, *targetLeg.best, targetLeg.bestOffer)); + REQUIRE( + offerExists(*app, *targetLeg.fallback, targetLeg.fallbackOffer)); + + auto bestSellingPost = + loadDexAssetState(*app, *targetLeg.best, targetLeg.selling).balance; + auto bestBuyingPost = + loadDexAssetState(*app, *targetLeg.best, targetLeg.buying).balance; + auto fallbackSellingPost = + loadDexAssetState(*app, *targetLeg.fallback, targetLeg.selling) + .balance; + auto fallbackBuyingPost = + loadDexAssetState(*app, *targetLeg.fallback, targetLeg.buying) + .balance; + auto payerPost = loadDexAssetState(*app, payer, a).balance; + auto destinationPost = loadDexAssetState(*app, destination, a).balance; + + // Exactly one leg uses the fallback 2:1 offer, other two legs use 1:1. + // For both strict-receive (dest=200 A) and strict-send (source=400 A): + // - fallback seller sells 200 of its selling asset and receives 400 of + // its buying asset, + // - payer sends 400 A, + // - destination receives 200 A. + constexpr int64_t expectedFallbackSold = 200; + constexpr int64_t expectedFallbackBought = 400; + constexpr int64_t expectedPayerSent = 400; + constexpr int64_t expectedDestinationReceived = 200; + + REQUIRE(bestSellingPost == bestSellingPre); + REQUIRE(bestBuyingPost == bestBuyingPre); + REQUIRE(fallbackSellingPre - fallbackSellingPost == + expectedFallbackSold); + REQUIRE(fallbackBuyingPost - fallbackBuyingPre == + expectedFallbackBought); + REQUIRE(payerPre - payerPost == expectedPayerSent); + REQUIRE(destinationPost - destinationPre == + expectedDestinationReceived); + + for (auto const& frozenState : frozenStates) + { + auto post = + loadDexAssetState(*app, *targetLeg.best, frozenState.asset); + REQUIRE(post.balance == frozenState.pre.balance); + REQUIRE(post.liabilities.selling == 0); + REQUIRE(post.liabilities.buying == 0); + } + } +} + +TEST_CASE("frozen offers are transparent to DEX matching - randomized", + "[frozenledgerkeys][offers][acceptance]") +{ + constexpr int NUM_ITERATIONS = 10; + constexpr int ACTIVE_MAKERS_PER_PAIR = 10; + constexpr int FROZEN_MAKERS_PER_PAIR = 5; + constexpr int NUM_PAIRS = 3; + constexpr int NUM_OPS = 15; + constexpr int NUM_ASSETS = 3; + constexpr int MAX_BATCH_SIZE = 10; + constexpr int TOTAL_ACTIVE_MAKERS = ACTIVE_MAKERS_PER_PAIR * NUM_PAIRS; + constexpr int TOTAL_FROZEN_MAKERS = FROZEN_MAKERS_PER_PAIR * NUM_PAIRS; + + constexpr int NUM_TRACKED = 1 + TOTAL_ACTIVE_MAKERS; + + struct MarketResult + { + std::vector deltas; + int frozenOffersRemoved; + int txsSucceeded; + }; + + int totalFrozenOffersRemoved = 0; + int totalTxsSucceeded = 0; + + for (int iter = 0; iter < NUM_ITERATIONS; ++iter) + { + INFO("iteration " << iter); + + auto iterSeed = stellar::uniform_int_distribution( + 0, UINT32_MAX)(Catch::rng()); + + auto runMarket = [&](uint32_t seed, + bool withFrozenOffers) -> MarketResult { + std::mt19937 rng(seed); + + VirtualClock clock; + auto cfg = getTestConfig(); + auto app = createTestApplication(clock, cfg); + auto root = app->getRoot(); + auto const& lm = app->getLedgerManager(); + auto minBalance = + lm.getLastMinBalance(20) + 100 * lm.getLastTxFee(); + + // Initialize accounts and assets. + auto issuerUSD = root->create("issuerUSD", minBalance); + auto issuerEUR = root->create("issuerEUR", minBalance); + auto xlm = makeNativeAsset(); + auto usd = makeAsset(issuerUSD, "USD"); + auto eur = makeAsset(issuerEUR, "EUR"); + + Asset assets[NUM_ASSETS] = {xlm, usd, eur}; + + struct Pair + { + Asset selling; + Asset buying; + }; + Pair pairs[NUM_PAIRS] = {{usd, xlm}, {eur, xlm}, {usd, eur}}; + + auto randInt = [&](int lo, int hi) { + stellar::uniform_int_distribution dist(lo, hi); + return dist(rng); + }; + + auto fundNonNativeAssets = [&](TestAccount& account) { + for (auto const& asset : assets) + { + if (asset.type() != ASSET_TYPE_NATIVE) + { + account.changeTrust(asset, INT64_MAX); + auto& issuer = (asset == usd) ? issuerUSD : issuerEUR; + issuer.pay(account, asset, 100'000); + } + } + }; + + std::vector activeMakers; + activeMakers.reserve(TOTAL_ACTIVE_MAKERS); + for (int i = 0; i < TOTAL_ACTIVE_MAKERS; ++i) + { + auto name = fmt::format("maker{}", i); + activeMakers.emplace_back(root->create(name, minBalance)); + fundNonNativeAssets(activeMakers.back()); + } + + auto taker = root->create("taker", minBalance); + fundNonNativeAssets(taker); + + std::vector feePayers; + feePayers.reserve(MAX_BATCH_SIZE); + for (int i = 0; i < MAX_BATCH_SIZE; ++i) + { + auto name = fmt::format("feePayer{}", i); + feePayers.emplace_back(root->create(name, minBalance)); + } + + // Initialize market with active offers. + int makerIdx = 0; + for (auto const& pair : pairs) + { + for (int j = 0; j < ACTIVE_MAKERS_PER_PAIR; ++j, ++makerIdx) + { + auto priceN = static_cast(randInt(1, 10)); + auto priceD = static_cast(randInt(1, 10)); + int64_t amount = randInt(100, 5000); + activeMakers[makerIdx].manageOffer( + 0, pair.selling, pair.buying, Price{priceN, priceD}, + amount); + } + } + + struct FrozenOfferInfo + { + TestAccount account; + int64_t offerID; + }; + std::vector frozenOffers; + // Create frozen offers (only in run with frozen offers). + if (withFrozenOffers) + { + int frozenIdx = 0; + for (auto const& pair : pairs) + { + for (int j = 0; j < FROZEN_MAKERS_PER_PAIR; + ++j, ++frozenIdx) + { + auto name = fmt::format("frozen{}", frozenIdx); + auto frozenMaker = root->create(name, minBalance); + fundNonNativeAssets(frozenMaker); + + auto priceN = static_cast(randInt(1, 10)); + auto priceD = static_cast(randInt(1, 10)); + int64_t amount = randInt(100, 5000); + auto offerID = frozenMaker.manageOffer( + 0, pair.selling, pair.buying, Price{priceN, priceD}, + amount); + freezeKey(*app, + frozenKeyForAsset(frozenMaker, pair.selling)); + frozenOffers.emplace_back( + FrozenOfferInfo{std::move(frozenMaker), offerID}); + } + } + } + + auto recordBalances = [&]() { + std::vector balances(NUM_TRACKED * NUM_ASSETS, 0); + auto record = [&](int accIdx, TestAccount& acc) { + for (int a = 0; a < NUM_ASSETS; ++a) + { + balances[accIdx * NUM_ASSETS + a] = + loadDexAssetState(*app, acc, assets[a]).balance; + } + }; + record(0, taker); + for (int i = 0; i < TOTAL_ACTIVE_MAKERS; ++i) + { + record(i + 1, activeMakers[i]); + } + return balances; + }; + + auto preBalances = recordBalances(); + + // Execute deterministic operation sequence in random-sized + // batches. Use a separate RNG stream so frozen offer creation + // does not change the operations. + std::mt19937 opsRng(seed + 1000); + auto opsRandInt = [&](int lo, int hi) { + stellar::uniform_int_distribution dist(lo, hi); + return dist(opsRng); + }; + + int txsSucceeded = 0; + int opsGenerated = 0; + while (opsGenerated < NUM_OPS) + { + int batchSize = std::min(opsRandInt(1, MAX_BATCH_SIZE), + NUM_OPS - opsGenerated); + + std::vector batch; + batch.reserve(batchSize); + for (int b = 0; b < batchSize; ++b, ++opsGenerated) + { + int opType = opsRandInt(0, 4); + int pairIdx = opsRandInt(0, NUM_PAIRS - 1); + auto const& pair = pairs[pairIdx]; + + int64_t amount = opsRandInt(50, 2000); + auto pN = static_cast(opsRandInt(1, 10)); + auto pD = static_cast(opsRandInt(1, 10)); + + Operation dexOp; + switch (opType) + { + case 0: + dexOp = manageOffer(0, pair.buying, pair.selling, + Price{pN, pD}, amount); + break; + case 1: + dexOp = manageBuyOffer(0, pair.buying, pair.selling, + Price{pN, pD}, amount); + break; + case 2: + dexOp = createPassiveOffer(pair.buying, pair.selling, + Price{pN, pD}, amount); + break; + case 3: + dexOp = + pathPayment(taker.getPublicKey(), pair.buying, + amount * 10, pair.selling, amount, {}); + break; + default: + dexOp = pathPaymentStrictSend(taker.getPublicKey(), + pair.buying, amount, + pair.selling, 1, {}); + break; + } + + dexOp.sourceAccount.activate() = + toMuxedAccount(taker.getPublicKey()); + auto& feePayer = feePayers[b]; + auto tx = transactionFromOperations( + *app, feePayer.getSecretKey(), + feePayer.nextSequenceNumber(), {dexOp}); + tx->addSignature(taker.getSecretKey()); + + { + LedgerReadView lrv(*app); + auto result = tx->checkValid(app->getAppConnector(), + lrv, 0, 0, 0); + REQUIRE(result->isSuccess()); + } + + batch.emplace_back(std::move(tx)); + } + + // Subtle: strict order has to be used because ledger hashes + // are going to be different between frozen and non-frozen + // runs, which causes different ordering of the exact same + // transactions. + auto r = closeLedger(*app, batch, /*strictOrder=*/true); + REQUIRE(r.results.size() == static_cast(batchSize)); + for (int b = 0; b < batchSize; ++b) + { + if (r.results[b].result.result.code() == txSUCCESS) + { + ++txsSucceeded; + } + } + } + + int frozenRemoved = 0; + for (auto const& fo : frozenOffers) + { + if (!offerExists(*app, fo.account, fo.offerID)) + { + ++frozenRemoved; + } + } + + auto postBalances = recordBalances(); + std::vector deltas(NUM_TRACKED * NUM_ASSETS, 0); + for (int i = 0; i < NUM_TRACKED * NUM_ASSETS; ++i) + { + deltas[i] = postBalances[i] - preBalances[i]; + } + return MarketResult{deltas, frozenRemoved, txsSucceeded}; + }; + + auto baseline = runMarket(iterSeed, false); + auto withFrozen = runMarket(iterSeed, true); + + std::cerr << fmt::format("frozen offers removed: {}/{}, " + "txs succeeded: {}", + withFrozen.frozenOffersRemoved, + TOTAL_FROZEN_MAKERS, baseline.txsSucceeded) + << std::endl; + + REQUIRE(baseline.deltas == withFrozen.deltas); + REQUIRE(baseline.txsSucceeded == withFrozen.txsSucceeded); + + totalFrozenOffersRemoved += withFrozen.frozenOffersRemoved; + totalTxsSucceeded += baseline.txsSucceeded; + } + + // We should have enough test iterations and transactions to get at least + // some frozen offer removals and successful transactions. + REQUIRE(totalFrozenOffersRemoved > 0); + REQUIRE(totalTxsSucceeded > 0); +} +} // namespace +} // namespace stellar diff --git a/src/transactions/test/InflationTests.cpp b/src/transactions/test/InflationTests.cpp index de7adf2725..7c3aa50918 100644 --- a/src/transactions/test/InflationTests.cpp +++ b/src/transactions/test/InflationTests.cpp @@ -231,7 +231,8 @@ doInflation(Application& app, int ledgerVersion, int nbAccounts, [&](int i) { return balances[i]; }, getVote, app); // perform actual inflation - applyTx(txFrame, app); + auto inflResult = closeLedger(app, {txFrame}); + checkTx(0, inflResult, txSUCCESS); // verify ledger state REQUIRE(getTotalCoins() == expectedTotcoins); @@ -239,7 +240,7 @@ doInflation(Application& app, int ledgerVersion, int nbAccounts, // verify balances InflationResult const& infResult = - getFirstResult(txFrame).tr().inflationResult(); + inflResult.results[0].result.result.results()[0].tr().inflationResult(); auto const& payouts = infResult.payouts(); size_t actualChanges = 0; diff --git a/src/transactions/test/InvokeHostFunctionTests.cpp b/src/transactions/test/InvokeHostFunctionTests.cpp index e64db9604e..bb61651e90 100644 --- a/src/transactions/test/InvokeHostFunctionTests.cpp +++ b/src/transactions/test/InvokeHostFunctionTests.cpp @@ -9,7 +9,6 @@ #include "util/ProtocolVersion.h" #include "util/UnorderedSet.h" #include "xdr/Stellar-transaction.h" -#include #include #include #include @@ -19,6 +18,7 @@ #include "crypto/SecretKey.h" #include "herder/Herder.h" #include "ledger/LedgerManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTypeUtils.h" #include "ledger/test/LedgerTestUtils.h" @@ -44,8 +44,6 @@ #include #include #include -#include -#include #include "ledger/LedgerManagerImpl.h" @@ -2212,10 +2210,10 @@ TEST_CASE("resource fee exceeds uint32", "[tx][soroban][feebump]") txEnvelope.v1()); auto tx = TransactionFrameBase::makeTransactionFromWire( test.getApp().getNetworkID(), txEnvelope); - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto diagnostics = DiagnosticEventManager::createDisabled(); auto innerCheckValidResult = tx->checkValid( - test.getApp().getAppConnector(), ls, 0, 0, 0, diagnostics); + test.getApp().getAppConnector(), lrv, 0, 0, 0, diagnostics); int64_t feeBumpFullFee = resourceFee + inclusionFee; auto feeBumpTx = feeBump(test.getApp(), feeBumper, tx, feeBumpFullFee, @@ -2224,7 +2222,7 @@ TEST_CASE("resource fee exceeds uint32", "[tx][soroban][feebump]") REQUIRE(feeBumpTx->getInclusionFee() == inclusionFee); auto checkValidResult = feeBumpTx->checkValid( - test.getApp().getAppConnector(), ls, 0, 0, 0, diagnostics); + test.getApp().getAppConnector(), lrv, 0, 0, 0, diagnostics); if (!checkValidResult->isSuccess()) { return checkValidResult->getResultCode(); @@ -2526,6 +2524,14 @@ TEST_CASE("settings upgrade", "[tx][soroban][upgrades]") continue; } + // Delta settings are upgrade payloads only and have no stored + // ledger entries to load. + if (type == CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA || + type == CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + continue; + } + // Because we added more cost types in v21 and later, the initial // contractDataEntrySizeBytes setting of 2000 is too low to write // all settings at once. This isn't an issue in practice because 1. @@ -2869,11 +2875,9 @@ TEST_CASE("ledger entry size limit enforced", "[tx][soroban]") INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED); // Archive entry - for (uint32_t i = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); - i <= originalExpectedLiveUntilLedger + 1; ++i) + while (test.getLCLSeq() < originalExpectedLiveUntilLedger + 1) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(!test.isEntryLive({lk}, test.getLCLSeq())); @@ -2901,11 +2905,9 @@ TEST_CASE("ledger entry size limit enforced", "[tx][soroban]") failedExtendOp(lk); // Archive entry - for (uint32_t i = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); - i <= originalExpectedLiveUntilLedger + 1; ++i) + while (test.getLCLSeq() < originalExpectedLiveUntilLedger + 1) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(!test.isEntryLive({lk}, test.getLCLSeq())); @@ -3114,11 +3116,9 @@ TEST_CASE_VERSIONS("state archival", "[tx][soroban][archival]") uint32_t originalExpectedLiveUntilLedger = test.getLCLSeq() + stateArchivalSettings.minPersistentTTL - 1; - for (uint32_t i = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); - i <= originalExpectedLiveUntilLedger + 1; ++i) + while (test.getLCLSeq() < originalExpectedLiveUntilLedger + 1) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } // Contract instance and code should be expired @@ -3262,11 +3262,9 @@ TEST_CASE_VERSIONS("state archival", "[tx][soroban][archival]") expectedTempLiveUntilLedger); // Close ledgers until temp entry expires - uint32 nextLedgerSeq = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); - for (; nextLedgerSeq < expectedTempLiveUntilLedger; ++nextLedgerSeq) + while (test.getLCLSeq() < expectedTempLiveUntilLedger - 1) { - closeLedgerOn(test.getApp(), nextLedgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(test.getLCLSeq() == expectedTempLiveUntilLedger - 1); @@ -3303,7 +3301,7 @@ TEST_CASE_VERSIONS("state archival", "[tx][soroban][archival]") SECTION("TTL enforcement") { // Close one more ledger so temp entry is expired - closeLedgerOn(test.getApp(), nextLedgerSeq++, 2, 1, 2016); + closeLedger(test.getApp()); REQUIRE(test.getLCLSeq() == expectedTempLiveUntilLedger); // Check that temp entry has expired in the current ledger, i.e. @@ -3340,12 +3338,10 @@ TEST_CASE_VERSIONS("state archival", "[tx][soroban][archival]") 1); REQUIRE(isSuccess( client.get("temp", ContractDataDurability::TEMPORARY, 42))); - nextLedgerSeq = test.getLCLSeq() + 1; // Close ledgers until PERSISTENT entry liveUntilLedger - for (; nextLedgerSeq < expectedPersistentLiveUntilLedger; - ++nextLedgerSeq) + while (test.getLCLSeq() < expectedPersistentLiveUntilLedger - 1) { - closeLedgerOn(test.getApp(), nextLedgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } SECTION( @@ -3370,9 +3366,11 @@ TEST_CASE_VERSIONS("state archival", "[tx][soroban][archival]") } // Close one more ledger so entry is expired - closeLedgerOn(test.getApp(), nextLedgerSeq++, 2, 1, 2016); + closeLedger(test.getApp()); + // The sections above can bump the lcl, which is why this check + // is >= REQUIRE( - test.getApp().getLedgerManager().getLastClosedLedgerNum() == + test.getApp().getLedgerManager().getLastClosedLedgerNum() >= expectedPersistentLiveUntilLedger); // Check that persistent entry has expired in the current ledger @@ -3786,10 +3784,9 @@ TEST_CASE_VERSIONS("archival meta", "[tx][soroban][archival]") REQUIRE(test.getTTL(temporaryLk) == expectedLiveUntilLedger); // Advance ledgers to just before eviction - for (uint32_t i = test.getLCLSeq(); i < tempEntryEvictionLedger - 2; - ++i) + while (test.getLCLSeq() < tempEntryEvictionLedger - 3) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(test.getTTL(temporaryLk) == expectedLiveUntilLedger); @@ -3808,7 +3805,7 @@ TEST_CASE_VERSIONS("archival meta", "[tx][soroban][archival]") REQUIRE(!test.isEntryLive(temporaryLk, test.getLCLSeq())); // Close one more ledger to trigger the eviction - closeLedgerOn(test.getApp(), tempEntryEvictionLedger, 2, 1, 2016); + closeLedger(test.getApp()); // Verify the entry is deleted from eviction { @@ -3826,10 +3823,9 @@ TEST_CASE_VERSIONS("archival meta", "[tx][soroban][archival]") { // Verify that we're on the ledger where the entry would get // evicted it wasn't recreated. - for (uint32_t i = test.getLCLSeq(); i < tempEntryEvictionLedger; - ++i) + while (test.getLCLSeq() < tempEntryEvictionLedger - 1) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(client.put("key", ContractDataDurability::TEMPORARY, 234) == @@ -4207,9 +4203,9 @@ TEST_CASE_VERSIONS("archival meta", "[tx][soroban][archival]") auto expirationLedger = test.getLCLSeq() + test.getNetworkCfg().stateArchivalSettings().minPersistentTTL; - for (uint32_t i = test.getLCLSeq(); i <= expirationLedger; ++i) + while (test.getLCLSeq() < expirationLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(!test.isEntryLive(persistentKey, test.getLCLSeq())); @@ -4513,9 +4509,9 @@ TEST_CASE_VERSIONS("archival meta", "[tx][soroban][archival]") { // Close ledgers until entry is evicted auto evictionLedger = 33; - for (uint32_t i = test.getLCLSeq(); i <= evictionLedger; ++i) + while (test.getLCLSeq() < evictionLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } if (protocolVersionStartsFrom( @@ -4589,11 +4585,9 @@ TEST_CASE_VERSIONS("state archival operation errors", "[tx][soroban][archival]") SECTION("restore operation") { - for (uint32_t i = - test.getApp().getLedgerManager().getLastClosedLedgerNum(); - i <= k2LiveUntilLedger; ++i) + while (test.getLCLSeq() < k2LiveUntilLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } SorobanResources restoreResources; restoreResources.footprint.readWrite = dataKeys; @@ -4748,24 +4742,20 @@ TEST_CASE("persistent entry archival", "[tx][soroban][archival]") MinimumSorobanNetworkConfig::MINIMUM_PERSISTENT_ENTRY_LIFETIME; // Close ledgers until entry is evicted - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq <= evictionLedger; ++ledgerSeq) + while (test.getLCLSeq() < evictionLedger) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } auto lk = client.getContract().getDataKey( makeSymbolSCVal("key"), ContractDataDurability::PERSISTENT); - auto hotArchive = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto snap = test.getApp().getLedgerManager().copyLedgerStateSnapshot(); if (evict) { - REQUIRE(hotArchive->load(lk)); - REQUIRE(!hotArchive->load(getTTLKey(lk))); + REQUIRE(snap.loadArchiveEntry(lk)); + REQUIRE(!snap.loadArchiveEntry(getTTLKey(lk))); { LedgerTxn ltx(test.getApp().getLedgerTxnRoot()); REQUIRE(!ltx.load(lk)); @@ -4774,8 +4764,8 @@ TEST_CASE("persistent entry archival", "[tx][soroban][archival]") } else { - REQUIRE(!hotArchive->load(lk)); - REQUIRE(!hotArchive->load(getTTLKey(lk))); + REQUIRE(!snap.loadArchiveEntry(lk)); + REQUIRE(!snap.loadArchiveEntry(getTTLKey(lk))); { LedgerTxn ltx(test.getApp().getLedgerTxnRoot()); REQUIRE(ltx.load(lk)); @@ -4838,14 +4828,11 @@ TEST_CASE("persistent entry archival", "[tx][soroban][archival]") client.get("key", ContractDataDurability::PERSISTENT, 123); - test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .maybeCopySearchableHotArchiveBucketListSnapshot( - hotArchive); + auto restoredSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); // Restored entries are deleted from Hot Archive - REQUIRE(!hotArchive->load(lk)); + REQUIRE(!restoredSnap.loadArchiveEntry(lk)); }; SECTION("restore op") @@ -5288,10 +5275,9 @@ TEST_CASE("autorestore contract instance", "[tx][soroban][archival]") // Close ledgers until ContractData entry, contract code, and instance are // all expired - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq <= expirationLedger; ++ledgerSeq) + while (test.getLCLSeq() < expirationLedger) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } auto lk = client.getContract().getDataKey( @@ -5513,10 +5499,9 @@ TEST_CASE("autorestore with storage resize", "[tx][soroban][archival]") // Close ledgers until ContractData entry, contract code, and instance // are all expired - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq <= expirationLedger; ++ledgerSeq) + while (test.getLCLSeq() < expirationLedger) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } REQUIRE(!test.isEntryLive(lk, test.getLCLSeq())); @@ -5687,6 +5672,14 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") continue; } + // Delta settings are upgrade payloads only and have no stored + // ledger entries to load. + if (type == CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA || + type == CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + continue; + } + LedgerTxn ltx(app->getLedgerTxnRoot()); auto entry = ltx.load(configSettingKey(type)); @@ -5955,6 +5948,14 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") continue; } + // Delta settings are upgrade payloads only and have no stored + // ledger entries to load. + if (type == CONFIG_SETTING_FROZEN_LEDGER_KEYS_DELTA || + type == CONFIG_SETTING_FREEZE_BYPASS_TXS_DELTA) + { + continue; + } + LedgerTxn ltx(app->getLedgerTxnRoot()); auto entry = ltx.load(configSettingKey(type)); @@ -5971,13 +5972,7 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") auto ledgerUpgrade = LedgerUpgrade{LEDGER_UPGRADE_CONFIG}; ledgerUpgrade.newConfig() = upgradeSetKey; - auto const& lcl = lm.getLastClosedLedgerHeader(); - auto txSet = TxSetXDRFrame::makeEmpty(lcl); - auto lastCloseTime = lcl.header.scpValue.closeTime; - - app->getHerder().externalizeValue( - txSet, lcl.header.ledgerSeq + 1, lastCloseTime, - {LedgerTestUtils::toUpgradeType(ledgerUpgrade)}); + executeUpgrade(*app, ledgerUpgrade); checkSettings(updatedEntries); } @@ -6014,13 +6009,7 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") auto ledgerUpgrade = LedgerUpgrade{LEDGER_UPGRADE_CONFIG}; ledgerUpgrade.newConfig() = upgradeSetKey2; - auto const& lcl = lm.getLastClosedLedgerHeader(); - auto txSet = TxSetXDRFrame::makeEmpty(lcl); - auto lastCloseTime = lcl.header.scpValue.closeTime; - - app->getHerder().externalizeValue( - txSet, lcl.header.ledgerSeq + 1, lastCloseTime, - {LedgerTestUtils::toUpgradeType(ledgerUpgrade)}); + executeUpgrade(*app, ledgerUpgrade); checkSettings(initialEntries); } @@ -6047,12 +6036,7 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") auto ledgerUpgrade = LedgerUpgrade{LEDGER_UPGRADE_CONFIG}; ledgerUpgrade.newConfig() = upgradeSetKey; - auto txSet = TxSetXDRFrame::makeEmpty(lcl); - auto lastCloseTime = lcl.header.scpValue.closeTime; - - app->getHerder().externalizeValue( - txSet, lcl.header.ledgerSeq + 1, lastCloseTime, - {LedgerTestUtils::toUpgradeType(ledgerUpgrade)}); + executeUpgrade(*app, ledgerUpgrade); // No upgrade due to expired entry checkSettings(initialEntries); @@ -6070,12 +6054,7 @@ TEST_CASE("settings upgrade command line utils", "[tx][soroban][upgrades]") auto ledgerUpgrade = LedgerUpgrade{LEDGER_UPGRADE_CONFIG}; ledgerUpgrade.newConfig() = upgradeSetKey; - auto txSet = TxSetXDRFrame::makeEmpty(lcl); - auto lastCloseTime = lcl.header.scpValue.closeTime; - - app->getHerder().externalizeValue( - txSet, lcl.header.ledgerSeq + 1, lastCloseTime, - {LedgerTestUtils::toUpgradeType(ledgerUpgrade)}); + executeUpgrade(*app, ledgerUpgrade); // No upgrade due to tampered entry checkSettings(initialEntries); @@ -7488,17 +7467,14 @@ TEST_CASE("multiple version of same key in a single eviction scan", auto evictionLedger = test.getLCLSeq() + MinimumSorobanNetworkConfig::MINIMUM_PERSISTENT_ENTRY_LIFETIME; - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq <= evictionLedger; ++ledgerSeq) + while (test.getLCLSeq() < evictionLedger) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } - auto hotArchive = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - REQUIRE(hotArchive->load(lk)); + auto evictSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); + REQUIRE(evictSnap.loadArchiveEntry(lk)); }; evictEntry(); @@ -7509,11 +7485,9 @@ TEST_CASE("multiple version of same key in a single eviction scan", // levels of the BucketList. test.invokeRestoreOp({lk}, 20166); - auto bl = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - auto loadRes = bl->load(lk); + auto restoreSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); + auto loadRes = restoreSnap.loadLiveEntry(lk); REQUIRE(loadRes); // Evict the entry again. If we "double evict" we'll throw during ledger @@ -7540,8 +7514,7 @@ TEST_CASE_VERSIONS("do not evict outdated keys", "[archival][soroban]") SorobanTest test(app, cfg, false); ContractStorageTestClient client(test); - auto& snapshotManager = - test.getApp().getBucketManager().getBucketSnapshotManager(); + auto& snapshotManager = test.getApp().getLedgerManager(); // WASM and instance should not expire test.invokeExtendOp(client.getContract().getKeys(), 10'000); @@ -7560,10 +7533,9 @@ TEST_CASE_VERSIONS("do not evict outdated keys", "[archival][soroban]") MinimumSorobanNetworkConfig::MINIMUM_PERSISTENT_ENTRY_LIFETIME; // Close ledgers until one ledger before eviction - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq < evictionLedger - 1; ++ledgerSeq) + while (test.getLCLSeq() < evictionLedger - 2) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } // Update entry to currVal @@ -7573,17 +7545,14 @@ TEST_CASE_VERSIONS("do not evict outdated keys", "[archival][soroban]") // Close one more ledger to trigger eviction. The newest version of // the entry is in level 0 of the BucketList, so only the outdated // version on level 1 will be scanned. - closeLedgerOn(test.getApp(), evictionLedger, 2, 1, 2016); + closeLedger(test.getApp()); // Check the eviction results. // Entry should be archived and not in the live BucketList - auto liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - REQUIRE(!liveBL->load(lk)); + auto evictionSnap = snapshotManager.copyLedgerStateSnapshot(); + REQUIRE(!evictionSnap.loadLiveEntry(lk)); - auto hotArchive = - snapshotManager.copySearchableHotArchiveBucketListSnapshot(); - - auto hotLoad = hotArchive->load(lk); + auto hotLoad = evictionSnap.loadArchiveEntry(lk); REQUIRE(hotLoad); REQUIRE(hotLoad->type() == HOT_ARCHIVE_ARCHIVED); @@ -7604,14 +7573,12 @@ TEST_CASE_VERSIONS("do not evict outdated keys", "[archival][soroban]") // Restore entry and make sure the correct value is restored test.invokeRestoreOp({lk}, 20166); - hotArchive = - snapshotManager.copySearchableHotArchiveBucketListSnapshot(); - auto hotLoadAfterRestore = hotArchive->load(lk); + auto restoreSnap = snapshotManager.copyLedgerStateSnapshot(); + auto hotLoadAfterRestore = restoreSnap.loadArchiveEntry(lk); REQUIRE(!hotLoadAfterRestore); // Check that restored value matches what was archived - liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - auto liveLoadAfterRestore = liveBL->load(lk); + auto liveLoadAfterRestore = restoreSnap.loadLiveEntry(lk); REQUIRE(liveLoadAfterRestore); if (protocolVersionIsBefore(test.getLedgerVersion(), @@ -7641,8 +7608,7 @@ TEST_CASE("disable eviction scan", "[archival][soroban]") SorobanTest test(cfg, false); ContractStorageTestClient client(test); - auto& snapshotManager = - test.getApp().getBucketManager().getBucketSnapshotManager(); + auto& snapshotManager = test.getApp().getLedgerManager(); // WASM and instance should not expire test.invokeExtendOp(client.getContract().getKeys(), 10'000); @@ -7663,10 +7629,9 @@ TEST_CASE("disable eviction scan", "[archival][soroban]") // modifySorobanNetworkConfig will close 4 ledgers before the upgrade will // take affect, so close enough ledgers here such that the persistent entry // would be evicted on the ledger immediately following the upgrade. - for (auto ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq < firstEvictionLedger - 4; ++ledgerSeq) + while (test.getLCLSeq() < firstEvictionLedger - 5) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } // Disable eviction scan by setting evictionScanSize to 0 @@ -7679,39 +7644,31 @@ TEST_CASE("disable eviction scan", "[archival][soroban]") // Close ledgers well beyond when the entries would have been evicted. auto closeLedgersUntil = test.getLCLSeq() + 20; - for (auto ledgerSeq = test.getLCLSeq() + 1; ledgerSeq <= closeLedgersUntil; - ++ledgerSeq) + while (test.getLCLSeq() < closeLedgersUntil) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); // Verify iterator has not changed REQUIRE(initialIterator == test.getNetworkCfg().evictionIterator()); } - auto liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - auto hotArchive = - snapshotManager.copySearchableHotArchiveBucketListSnapshot(); - + auto snap = snapshotManager.copyLedgerStateSnapshot(); auto assertTemp = [&](bool isLive) { - liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - hotArchive = - snapshotManager.copySearchableHotArchiveBucketListSnapshot(); - auto tempLiveLoad = liveBL->load(temporaryKey); + snap = snapshotManager.copyLedgerStateSnapshot(); + auto tempLiveLoad = snap.loadLiveEntry(temporaryKey); REQUIRE(static_cast(tempLiveLoad) == isLive); // Temp entries are never archived - REQUIRE(!hotArchive->load(temporaryKey)); + REQUIRE(!snap.loadArchiveEntry(temporaryKey)); }; auto assertPersistent = [&](bool isLive) { - liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - hotArchive = - snapshotManager.copySearchableHotArchiveBucketListSnapshot(); + snap = snapshotManager.copyLedgerStateSnapshot(); - auto persistentLiveLoad = liveBL->load(persistentKey); + auto persistentLiveLoad = snap.loadLiveEntry(persistentKey); REQUIRE(static_cast(persistentLiveLoad) == isLive); - auto hotArchiveLoad = hotArchive->load(persistentKey); + auto hotArchiveLoad = snap.loadArchiveEntry(persistentKey); REQUIRE(static_cast(hotArchiveLoad) != isLive); }; @@ -7735,10 +7692,9 @@ TEST_CASE("disable eviction scan", "[archival][soroban]") initialIterator = iteratorAfterUpgrade; // Check that exactly one entry has been evicted - liveBL = snapshotManager.copySearchableLiveBucketListSnapshot(); - hotArchive = snapshotManager.copySearchableHotArchiveBucketListSnapshot(); + snap = snapshotManager.copyLedgerStateSnapshot(); - auto persistentLiveLoad = liveBL->load(persistentKey); + auto persistentLiveLoad = snap.loadLiveEntry(persistentKey); if (persistentLiveLoad) { // If perstent entry is live, assert that the temp entry is evicted. @@ -7753,7 +7709,7 @@ TEST_CASE("disable eviction scan", "[archival][soroban]") } // Close one more ledger to evict the last remaining entry. - closeLedgerOn(test.getApp(), test.getLCLSeq() + 1, 2, 1, 2016); + closeLedger(test.getApp()); // check that the iterator has advanced REQUIRE(!(initialIterator == test.getNetworkCfg().evictionIterator())); @@ -8663,10 +8619,9 @@ TEST_CASE("parallel txs hit declared readBytes", "[tx][soroban][parallelapply]") } SECTION("restore") { - for (uint32_t i = test.getLCLSeq() + 1; i <= contractExpirationLedger; - ++i) + while (test.getLCLSeq() < contractExpirationLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } auto const& contractKeys = client.getContract().getKeys(); @@ -8770,8 +8725,8 @@ TEST_CASE_VERSIONS("merge account then SAC payment scenarios", checkTx(1, r, txFAILED); // Verify that a1 no longer exists after the merge - LedgerSnapshot ls(test.getApp()); - REQUIRE(!ls.getAccount(a1.getPublicKey())); + LedgerReadView lrv(test.getApp()); + REQUIRE(!lrv.getAccount(a1.getPublicKey())); // Verify that b1 received a1's balance (minus merge fee) auto expectedBalance = @@ -8802,8 +8757,8 @@ TEST_CASE_VERSIONS("merge account then SAC payment scenarios", checkTx(1, r, txFAILED); // Verify that a1 no longer exists after the merge - LedgerSnapshot ls(test.getApp()); - REQUIRE(!ls.getAccount(a1.getPublicKey())); + LedgerReadView lrv(test.getApp()); + REQUIRE(!lrv.getAccount(a1.getPublicKey())); // Verify that b1 received a1's balance (minus merge fee) auto expectedBalance = @@ -8839,8 +8794,8 @@ TEST_CASE_VERSIONS("merge account then SAC payment scenarios", checkTx(1, r, txNO_ACCOUNT); // Verify that a1 no longer exists after the merge - LedgerSnapshot ls(test.getApp()); - REQUIRE(!ls.getAccount(a1.getPublicKey())); + LedgerReadView lrv(test.getApp()); + REQUIRE(!lrv.getAccount(a1.getPublicKey())); // Verify that b1 received a1's balance (minus the soroban // transactions fee which a1 paid before it was merged). @@ -9102,7 +9057,7 @@ TEST_CASE("apply generated parallel tx sets", "[soroban][parallelapply]") { std::vector sorobanTxs; auto resources = lm.maxLedgerResources(true); - LedgerSnapshot ls(app); + LedgerReadView lrv(app); for (int txId = 0; txId < MAX_TRANSACTIONS_PER_LEDGER; ++txId) { auto account = txtest::getGenesisAccount(app, accountId++); @@ -9143,7 +9098,7 @@ TEST_CASE("apply generated parallel tx sets", "[soroban][parallelapply]") auto tx = invocation.withExactNonRefundableResourceFee().createTx( &account); - REQUIRE(tx->checkValid(app.getAppConnector(), ls, 0, 0, 0) + REQUIRE(tx->checkValid(app.getAppConnector(), lrv, 0, 0, 0) ->isSuccess()); if (!anyGreater(tx->getResources(false, test.getLedgerVersion()), resources)) @@ -9194,9 +9149,9 @@ TEST_CASE("parallel restore and extend op", "[tx][soroban][parallelapply]") auto expirationLedger = test.getLCLSeq() + test.getNetworkCfg().stateArchivalSettings().minPersistentTTL; - for (uint32_t i = test.getLCLSeq() + 1; i <= expirationLedger; ++i) + while (test.getLCLSeq() < expirationLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } auto const& contractKeys = client.getContract().getKeys(); @@ -9315,9 +9270,9 @@ TEST_CASE("parallel restore and update", "[tx][soroban][parallelapply]") auto expirationLedger = test.getLCLSeq() + test.getNetworkCfg().stateArchivalSettings().minPersistentTTL; - for (uint32_t i = test.getLCLSeq() + 1; i <= expirationLedger; ++i) + while (test.getLCLSeq() < expirationLedger) { - closeLedgerOn(test.getApp(), i, 2, 1, 2016); + closeLedger(test.getApp()); } auto persistentKey = client.getContract().getDataKey( @@ -9533,8 +9488,8 @@ TEST_CASE("in-memory state size tracking", "[soroban]") { auto ledgerKey = client.getContract().getDataKey( makeSymbolSCVal(key), durability); - LedgerSnapshot ls(test.getApp()); - auto le = ls.load(ledgerKey); + LedgerReadView lrv(test.getApp()); + auto le = lrv.load(ledgerKey); if (le) { // We only deal with the data entries here, so no need to use @@ -9745,9 +9700,9 @@ TEST_CASE("readonly ttl bumps across threads and stages", auto startingTTL = test.getTTL(lk); // Capture the TTL entry's lastModifiedLedgerSeq before tx execution - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto ttlKey = getTTLKey(lk); - auto ttlEntry = ls.load(ttlKey); + auto ttlEntry = lrv.load(ttlKey); REQUIRE(ttlEntry); uint32_t ttlLastModifiedBeforeTx = ttlEntry.current().lastModifiedLedgerSeq; @@ -9794,9 +9749,9 @@ TEST_CASE("readonly ttl bumps across threads and stages", auto startingTTL = test.getTTL(lk); // Capture the TTL entry's lastModifiedLedgerSeq before tx execution - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto ttlKey = getTTLKey(lk); - auto ttlEntry = ls.load(ttlKey); + auto ttlEntry = lrv.load(ttlKey); REQUIRE(ttlEntry); uint32_t ttlLastModifiedBeforeTx = ttlEntry.current().lastModifiedLedgerSeq; @@ -9848,9 +9803,9 @@ TEST_CASE("readonly ttl bumps across threads and stages", auto startingTTL = test.getTTL(lk); // Capture the TTL entry's lastModifiedLedgerSeq before tx execution - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto ttlKey = getTTLKey(lk); - auto ttlEntry = ls.load(ttlKey); + auto ttlEntry = lrv.load(ttlKey); REQUIRE(ttlEntry); uint32_t ttlLastModifiedBeforeTx = ttlEntry.current().lastModifiedLedgerSeq; @@ -10115,10 +10070,9 @@ TEST_CASE("autorestore from another contract", "[tx][soroban][archival]") MinimumSorobanNetworkConfig::MINIMUM_PERSISTENT_ENTRY_LIFETIME; // Close ledgers until all entries are expired and evicted - for (uint32_t ledgerSeq = test.getLCLSeq() + 1; - ledgerSeq <= expirationLedger + 1; ++ledgerSeq) + while (test.getLCLSeq() < expirationLedger + 1) { - closeLedgerOn(test.getApp(), ledgerSeq, 2, 1, 2016); + closeLedger(test.getApp()); } auto lk1 = client1.getContract().getDataKey( @@ -10132,17 +10086,11 @@ TEST_CASE("autorestore from another contract", "[tx][soroban][archival]") REQUIRE(client2.get("key2", ContractDataDurability::PERSISTENT, std::nullopt) == INVOKE_HOST_FUNCTION_ENTRY_ARCHIVED); - auto hotArchiveSnapshot = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - auto liveSnapshot = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); + auto archivedSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); - REQUIRE(hotArchiveSnapshot->loadKeys({lk1, lk2}).size() == 2); - REQUIRE(liveSnapshot->loadKeys({lk1, lk2}, "load").size() == 0); + REQUIRE(archivedSnap.loadArchiveKeys({lk1, lk2}).size() == 2); + REQUIRE(archivedSnap.loadLiveKeys({lk1, lk2}, "load").size() == 0); // Now, invoke contract2, but also autorestore state from contract1. auto keysToRestore = client2.getContract().getKeys(); @@ -10167,17 +10115,11 @@ TEST_CASE("autorestore from another contract", "[tx][soroban][archival]") /*addContractKeys=*/false); REQUIRE(invocation.withExactNonRefundableResourceFee().invoke()); - liveSnapshot = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableLiveBucketListSnapshot(); - hotArchiveSnapshot = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); + auto restoredSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); - REQUIRE(liveSnapshot->loadKeys({lk1, lk2}, "load").size() == 2); - REQUIRE(hotArchiveSnapshot->loadKeys({lk1, lk2}).size() == 0); + REQUIRE(restoredSnap.loadLiveKeys({lk1, lk2}, "load").size() == 2); + REQUIRE(restoredSnap.loadArchiveKeys({lk1, lk2}).size() == 0); // Verify that the correct values were restored REQUIRE(client1.get("key1", ContractDataDurability::PERSISTENT, 111) == @@ -10250,8 +10192,8 @@ TEST_CASE_VERSIONS("fee bump inner account merged then used as inner account " REQUIRE(innerRes.result.code() == txNO_ACCOUNT); // Verify that innerAccount no longer exists after the merge - LedgerSnapshot ls(test.getApp()); - REQUIRE(!ls.getAccount(innerAccount.getPublicKey())); + LedgerReadView lrv(test.getApp()); + REQUIRE(!lrv.getAccount(innerAccount.getPublicKey())); auto expectedDestinationBalance = startingBalance + startingBalance; REQUIRE(destination.getBalance() == expectedDestinationBalance); diff --git a/src/transactions/test/MergeTests.cpp b/src/transactions/test/MergeTests.cpp index 6988358f5b..54972d0439 100644 --- a/src/transactions/test/MergeTests.cpp +++ b/src/transactions/test/MergeTests.cpp @@ -768,20 +768,15 @@ TEST_CASE_VERSIONS("merge", "[tx][merge]") {sponsoringAcc}); { - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, dest, signer.key, 2, &sponsoringAcc.getPublicKey()); checkSponsorship(ltx, sponsoringAcc, leExt, sponsoringID, numSubEntries, aeExt, numSponsoring, numSponsored); - ltx.commit(); } }; @@ -833,17 +828,12 @@ TEST_CASE_VERSIONS("merge", "[tx][merge]") {key}); { - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, key.getPublicKey(), 1, &sponsoringAcc.getPublicKey(), 0, 2, 0, 2); - ltx.commit(); } auto merge = [&](bool addSigner, AccountID const& dest) { @@ -907,15 +897,10 @@ TEST_CASE_VERSIONS("merge", "[tx][merge]") b1.op(endSponsoringFutureReserves())}, {b1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - REQUIRE(tx->getResult() - .result.results()[1] + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + REQUIRE(r.results[0] + .result.result.results()[1] .tr() .accountMergeResult() .code() == ACCOUNT_MERGE_IS_SPONSOR); @@ -932,17 +917,12 @@ TEST_CASE_VERSIONS("merge", "[tx][merge]") {sponsoringAcc}); { - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, sponsoringAcc, 0, nullptr, 0, 2, 1, 0); - ltx.commit(); } REQUIRE_THROWS_AS(sponsoringAcc.merge(b1), @@ -974,7 +954,7 @@ TEST_CASE_VERSIONS("merge event reconciler", "[tx][merge]") auto txfee = app->getLedgerManager().getLastTxFee(); int64_t const minBalance = - app->getLedgerManager().getLastMinBalance(0) + txfee * 2; + app->getLedgerManager().getLastMinBalance(0) + txfee * 10; auto a1 = root->create("A", minBalance); auto b1 = root->create("B", minBalance); @@ -982,12 +962,7 @@ TEST_CASE_VERSIONS("merge event reconciler", "[tx][merge]") for_versions_to(4, *app, [&] { auto txFrame = a1.tx({accountMerge(b1), accountMerge(b1)}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *txFrame, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(txFrame->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, - 0)); - REQUIRE(txFrame->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {txFrame}); + checkTx(0, r, txSUCCESS); }); } diff --git a/src/transactions/test/OfferTests.cpp b/src/transactions/test/OfferTests.cpp index c31fa305f3..b898ae060b 100644 --- a/src/transactions/test/OfferTests.cpp +++ b/src/transactions/test/OfferTests.cpp @@ -3004,14 +3004,8 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") source.op(endSponsoringFutureReserves())}, {sponsor}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); }; TestMarket market(*app); @@ -3032,27 +3026,28 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") acc.op(endSponsoringFutureReserves())}, {*sponsor}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - auto expOfferID = ltx.loadHeader().current().idPool + 1; + int64_t expOfferID; + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + expOfferID = ltx.loadHeader().current().idPool + 1; + } - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); - auto const& results = tx->getResult().result.results(); + auto const& results = r.results[0].result.result.results(); auto const& msoResult = results[1].tr().manageSellOfferResult(); int64_t offerID = 0; if (resState == OfferState::DELETED) { + LedgerTxn ltx(app->getLedgerTxnRoot()); REQUIRE(!loadOffer(ltx, acc.getPublicKey(), expOfferID)); } else { offerID = expOfferID; + LedgerTxn ltx(app->getLedgerTxnRoot()); auto offer = loadOffer(ltx, acc.getPublicKey(), expOfferID); REQUIRE(offer); auto& offerEntry = offer.current().data.offer(); @@ -3062,7 +3057,6 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") REQUIRE(offerEntry.buying == resState.buying); } - ltx.commit(); return TestMarketOffer{{acc, offerID}, resState}; }; @@ -3745,18 +3739,19 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") a1.op(endSponsoringFutureReserves())}, {a1, a2}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - auto expOfferID = ltx.loadHeader().current().idPool + 1; + int64_t expOfferID; + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + expOfferID = ltx.loadHeader().current().idPool + 1; + } - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); - REQUIRE(!loadOffer(ltx, a2.getPublicKey(), expOfferID)); - ltx.commit(); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + REQUIRE(!loadOffer(ltx, a2.getPublicKey(), expOfferID)); + } return TestMarketOffer{ {a2, static_cast(expOfferID)}, @@ -3792,14 +3787,8 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); } // the offer should still not be sponsored @@ -3856,14 +3845,15 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") offerIdUsdXlm = ltx.loadHeader().current().idPool + 1; offerIdXlmUsd = ltx.loadHeader().current().idPool + 2; offerIdIdrXlm = ltx.loadHeader().current().idPool + 3; + } - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + { + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + } + { + LedgerTxn ltx(app->getLedgerTxnRoot()); REQUIRE(loadOffer(ltx, acc1.getPublicKey(), offerIdUsdXlm)); REQUIRE(loadOffer(ltx, acc1.getPublicKey(), offerIdXlmUsd)); REQUIRE(loadOffer(ltx, acc1.getPublicKey(), offerIdIdrXlm)); @@ -3871,7 +3861,6 @@ TEST_CASE_VERSIONS("create offer", "[tx][offers]") checkSponsorship(ltx, acc1, 0, &sponsor.getPublicKey(), 5, 2, 0, 3); checkSponsorship(ltx, sponsor, 0, nullptr, 0, 2, 3, 0); - ltx.commit(); } // The two usd offers should get pulled diff --git a/src/transactions/test/ParallelApplyTest.cpp b/src/transactions/test/ParallelApplyTest.cpp index d0614962b7..699b31e9fd 100644 --- a/src/transactions/test/ParallelApplyTest.cpp +++ b/src/transactions/test/ParallelApplyTest.cpp @@ -10,7 +10,7 @@ #include -#include "bucket/BucketManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "main/Application.h" #include "test/TestUtils.h" #include "test/TxTests.h" @@ -1052,16 +1052,16 @@ applyTestTransactions(TestConfig const& testConfig, uint32_t protocolVersion, auto allTxs = classicTxs; allTxs.insert(allTxs.end(), sorobanTxs.begin(), sorobanTxs.end()); { - LedgerSnapshot ls(test.getApp()); + LedgerReadView lrv(test.getApp()); auto diag = DiagnosticEventManager::createDisabled(); for (auto const& tx : allTxs) { - bool isValid = tx->checkValid(test.getApp().getAppConnector(), ls, + bool isValid = tx->checkValid(test.getApp().getAppConnector(), lrv, 0, 0, 0, diag) ->isSuccess(); if (!isValid) { - tx->checkValid(test.getApp().getAppConnector(), ls, 0, 0, 0, + tx->checkValid(test.getApp().getAppConnector(), lrv, 0, 0, 0, diag); } REQUIRE(isValid); @@ -1120,17 +1120,14 @@ applyTestTransactions(TestConfig const& testConfig, uint32_t protocolVersion, std::vector, std::optional>>> finalEntries; - LedgerSnapshot ls(test.getApp()); - auto hotArchive = test.getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - releaseAssert(hotArchive); + LedgerReadView lrv(test.getApp()); + auto archiveSnap = + test.getApp().getLedgerManager().copyLedgerStateSnapshot(); for (auto const& k : allKeys) { std::optional liveEntry; std::optional archivedEntry; - if (auto e = ls.load(k)) + if (auto e = lrv.load(k)) { liveEntry = e.current(); // All the entries that were in the live state and were @@ -1145,7 +1142,7 @@ applyTestTransactions(TestConfig const& testConfig, uint32_t protocolVersion, } else if (isSorobanEntry(k)) { - if (auto e = hotArchive->load(k)) + if (auto e = archiveSnap.loadArchiveEntry(k)) { archivedEntry = e->archivedEntry(); } @@ -1157,7 +1154,7 @@ applyTestTransactions(TestConfig const& testConfig, uint32_t protocolVersion, { LedgerKey ttlKey = getTTLKey(k); std::optional liveTtlEntry; - if (auto e = ls.load(ttlKey)) + if (auto e = lrv.load(ttlKey)) { liveTtlEntry = e.current(); } diff --git a/src/transactions/test/PathPaymentTests.cpp b/src/transactions/test/PathPaymentTests.cpp index ff0beb622a..1c4d82381c 100644 --- a/src/transactions/test/PathPaymentTests.cpp +++ b/src/transactions/test/PathPaymentTests.cpp @@ -4438,14 +4438,8 @@ TEST_CASE_VERSIONS("pathpayment", "[tx][pathpayment]") source.op(endSponsoringFutureReserves())}, {sponsor}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); }; auto prepareAccount = [&](std::string const& seed) { @@ -4833,14 +4827,8 @@ TEST_CASE_VERSIONS("pathpayment", "[tx][pathpayment]") mm.op(endSponsoringFutureReserves())}, {payor, mm}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); } root->pay(payor, txfee); diff --git a/src/transactions/test/PaymentTests.cpp b/src/transactions/test/PaymentTests.cpp index 63ddb1d13c..dfedec54bd 100644 --- a/src/transactions/test/PaymentTests.cpp +++ b/src/transactions/test/PaymentTests.cpp @@ -1510,11 +1510,11 @@ TEST_CASE_VERSIONS("payment", "[tx][payment]") // Since a1 has a trustline, and there is only 1 trustline, we know // that gateway has no trustlines. - LedgerSnapshot lsg(*app); + LedgerReadView lrv(*app); LedgerKey trustKey(TRUSTLINE); trustKey.trustLine().accountID = gateway.getPublicKey(); trustKey.trustLine().asset = assetToTrustLineAsset(idr); - REQUIRE(!lsg.load(trustKey)); + REQUIRE(!lrv.load(trustKey)); }); } SECTION("authorize flag") diff --git a/src/transactions/test/RevokeSponsorshipTests.cpp b/src/transactions/test/RevokeSponsorshipTests.cpp index 8bf4358175..e03959a16a 100644 --- a/src/transactions/test/RevokeSponsorshipTests.cpp +++ b/src/transactions/test/RevokeSponsorshipTests.cpp @@ -23,6 +23,14 @@ getRevokeSponsorshipResultCode(TransactionTestFramePtr tx, size_t i) return opRes.tr().revokeSponsorshipResult().code(); } +static RevokeSponsorshipResultCode +getRevokeSponsorshipResultCode(TransactionResultSet const& r, size_t txIdx, + size_t opIdx) +{ + auto const& opRes = r.results[txIdx].result.result.results()[opIdx]; + return opRes.tr().revokeSponsorshipResult().code(); +} + static Claimant getClaimant(TestAccount const& account) { @@ -63,17 +71,12 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") app->getNetworkID(), a1, {a1.op(revokeSponsorship(accountKey(a1)))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, accountKey(a1), 0, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); - ltx.commit(); } SECTION("trust line") @@ -85,17 +88,12 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") app->getNetworkID(), a1, {a1.op(revokeSponsorship(trustlineKey(a1, cur1)))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, trustlineKey(a1, cur1), 0, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 0, 0, 0); - ltx.commit(); } SECTION("signer") @@ -108,17 +106,12 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") app->getNetworkID(), a1, {a1.op(revokeSponsorship(a1, signer.key))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, signer.key, 0, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 0, 0, 0); - ltx.commit(); } SECTION("claimable balances") @@ -134,21 +127,16 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") revokeSponsorship(claimableBalanceKey(balanceID)))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - - REQUIRE(getRevokeSponsorshipResultCode(tx, 0) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 0) == REVOKE_SPONSORSHIP_ONLY_TRANSFERABLE); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, claimableBalanceKey(balanceID), 1, &a1.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 0, 2, 1, 0); - ltx.commit(); } } @@ -166,19 +154,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {*root}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, accountKey(a1), 1, &root->getPublicKey()); checkSponsorship(ltx, a1, 1, &root->getPublicKey(), 0, 2, 0, 2); - ltx.commit(); } SECTION("trust line") { @@ -192,19 +175,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {*root}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, trustlineKey(a1, cur1), 1, &root->getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 1); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 1, 0); - ltx.commit(); } SECTION("signer") @@ -226,16 +204,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE( - tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); } auto tx = transactionFrameFromOps( @@ -245,14 +215,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {*root}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, signer.key, 2, &root->getPublicKey()); if (hasSponsoredEntry) @@ -267,7 +233,6 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 1, 0); } - ltx.commit(); }; SECTION("Account has sponsored entry") @@ -295,18 +260,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {*root}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, claimableBalanceKey(balanceID), 1, &root->getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } } } @@ -327,13 +287,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {key}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -341,18 +296,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") revokeSponsorship(accountKey(a1.getPublicKey())))}, {}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, accountKey(a1.getPublicKey()), 1, nullptr); checkSponsorship(ltx, a1, 1, nullptr, 0, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("trust line") @@ -367,30 +318,21 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, {root->op(revokeSponsorship(trustlineKey(a1, cur1)))}, {}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, trustlineKey(a1, cur1), 1, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("signer") @@ -405,29 +347,20 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, {root->op(revokeSponsorship(a1, signer.key))}, {}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, signer.key, 2, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("claimable balance") @@ -442,16 +375,11 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); - - auto balanceID = tx1->getResult() - .result.results()[1] + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); + + auto balanceID = r1.results[0] + .result.result.results()[1] .tr() .createClaimableBalanceResult() .balanceID(); @@ -462,20 +390,16 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") revokeSponsorship(claimableBalanceKey(balanceID)))}, {}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx2, 0) == + REQUIRE(getRevokeSponsorshipResultCode(r2, 0, 0) == REVOKE_SPONSORSHIP_ONLY_TRANSFERABLE); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, claimableBalanceKey(balanceID), 1, &root->getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); - ltx.commit(); } } @@ -495,13 +419,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {key}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -511,17 +430,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, 1, &a2.getPublicKey(), 0, 2, 0, 2); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 2, 0); - ltx.commit(); } SECTION("trust line") @@ -537,13 +452,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -552,19 +462,15 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, trustlineKey(a1, cur1), 1, &a2.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 1); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 1, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("signer") @@ -580,13 +486,9 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); + auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, {a2.op(beginSponsoringFutureReserves(*root)), @@ -594,19 +496,15 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, signer.key, 2, &a2.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 1); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 1, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("claimable balances") @@ -622,16 +520,11 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); - - auto balanceID = tx1->getResult() - .result.results()[1] + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); + + auto balanceID = r1.results[0] + .result.result.results()[1] .tr() .createClaimableBalanceResult() .balanceID(); @@ -644,18 +537,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, claimableBalanceKey(balanceID), 1, &a2.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 1, 0); - ltx.commit(); } SECTION("data") @@ -672,13 +561,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -687,19 +571,15 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, dataKey(a1, dataName), 1, &a2.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 1); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 1, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("offer") @@ -717,15 +597,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); - - auto offerID = ltx.loadHeader().current().idPool; + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); + + uint64_t offerID; + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + offerID = ltx.loadHeader().current().idPool; + } auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, {a2.op(beginSponsoringFutureReserves(*root)), @@ -733,19 +612,15 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, offerKey(a1, offerID), 1, &a2.getPublicKey()); checkSponsorship(ltx, a1, 0, nullptr, 2, 2, 0, 1); checkSponsorship(ltx, a2, 0, nullptr, 0, 2, 1, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } } @@ -762,13 +637,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {key}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -778,18 +648,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, accountKey(a1.getPublicKey()), 1, nullptr); checkSponsorship(ltx, a1, 1, nullptr, 0, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("trustline") @@ -804,13 +670,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -819,17 +680,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, trustlineKey(a1, cur1), 1, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("signer") @@ -844,13 +701,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -859,17 +711,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, signer.key, 2, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("data") @@ -885,13 +733,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, @@ -900,17 +743,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, dataKey(a1, dataName), 1, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } SECTION("offer") @@ -927,15 +766,14 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); - - auto offerID = ltx.loadHeader().current().idPool; + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); + + uint64_t offerID; + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + offerID = ltx.loadHeader().current().idPool; + } auto tx2 = transactionFrameFromOps( app->getNetworkID(), *root, {a1.op(beginSponsoringFutureReserves(*root)), @@ -943,17 +781,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a1}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, offerKey(a1, offerID), 1, nullptr); checkSponsorship(ltx, a1, 0, nullptr, 2, 2, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, 0, 0); - ltx.commit(); } } } @@ -971,17 +805,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") app->getNetworkID(), a1, {a1.op(revokeSponsorship(trustlineKey(a1, cur1)))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - - REQUIRE(getRevokeSponsorshipResultCode(tx, 0) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 0) == REVOKE_SPONSORSHIP_DOES_NOT_EXIST); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 0, 0, 0); } @@ -994,24 +824,24 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a2.manageOffer(0, native, cur1, Price{1, 1}, 10); - LedgerTxn ltx(app->getLedgerTxnRoot()); - auto offerID = ltx.loadHeader().current().idPool; + uint64_t offerID; + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + offerID = ltx.loadHeader().current().idPool; + } // put the wrong account on the offerKey auto tx = transactionFrameFromOps( app->getNetworkID(), a2, {a2.op(revokeSponsorship(offerKey(a1, offerID)))}, {}); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx, 0) == + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 0) == REVOKE_SPONSORSHIP_DOES_NOT_EXIST); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); checkSponsorship(ltx, a2, 0, nullptr, 2, 1, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 0, 0, 0); @@ -1029,15 +859,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") revokeSponsorship(s1.getPublicKey(), signer.key))}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - - REQUIRE(getRevokeSponsorshipResultCode(tx, 0) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 0) == REVOKE_SPONSORSHIP_DOES_NOT_EXIST); // known account, but unknown signer @@ -1045,16 +870,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") app->getNetworkID(), a1, {a1.op(revokeSponsorship(a1, signer.key))}, {}); - TransactionMetaBuilder txm2( - true, *tx2, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx2, 0) == + REQUIRE(getRevokeSponsorshipResultCode(r2, 0, 0) == REVOKE_SPONSORSHIP_DOES_NOT_EXIST); + LedgerTxn ltx(app->getLedgerTxnRoot()); checkSponsorship(ltx, a1, 0, nullptr, 0, 0, 0, 0); checkSponsorship(ltx, *root, 0, nullptr, 0, 0, 0, 0); } @@ -1081,16 +903,13 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm1)); - checkSponsorship(ltx, a1, 0, &root->getPublicKey(), 1, - 2, 0, 1); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, a1, 0, &root->getPublicKey(), + 1, 2, 0, 1); + } } else { @@ -1112,15 +931,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") auto tx = transactionFrameFromOps(app->getNetworkID(), a2, {op}, {}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm1)); - - REQUIRE(getRevokeSponsorshipResultCode(tx, 0) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 0) == REVOKE_SPONSORSHIP_NOT_SPONSOR); if (isSponsored) @@ -1137,27 +951,20 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") transactionFrameFromOps(app->getNetworkID(), *root, {opRemoveSponsorship}, {}); - TransactionMetaBuilder txm2( - true, *tx2, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx2->apply(app->getAppConnector(), ltx, txm2)); - checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txSUCCESS); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, a1, 0, nullptr, 1, 2, 0, 0); + } auto tx3 = transactionFrameFromOps(app->getNetworkID(), a2, {op}, {}); - TransactionMetaBuilder txm3( - true, *tx3, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx3->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx3->apply(app->getAppConnector(), ltx, txm3)); + auto r3 = closeLedger(*app, {tx3}); + checkTx(0, r3, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx3, 0) == + REQUIRE(getRevokeSponsorshipResultCode(r3, 0, 0) == REVOKE_SPONSORSHIP_NOT_SPONSOR); } }; @@ -1204,14 +1011,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") middleOpTx1, a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); Operation middleOpTx2 = entryTest @@ -1226,15 +1027,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") root->op(endSponsoringFutureReserves())}, {a2}); - TransactionMetaBuilder txm2( - true, *tx2, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx2, 1) == + REQUIRE(getRevokeSponsorshipResultCode(r2, 0, 1) == REVOKE_SPONSORSHIP_LOW_RESERVE); } SECTION("remove sponsorship") @@ -1252,14 +1048,8 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") middleOpTx1, a1.op(endSponsoringFutureReserves())}, {a1}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm1( - true, *tx1, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx1->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app->getAppConnector(), ltx, txm1)); + auto r1 = closeLedger(*app, {tx1}); + checkTx(0, r1, txSUCCESS); Operation opTx2 = entryTest @@ -1270,15 +1060,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") auto tx2 = transactionFrameFromOps(app->getNetworkID(), *root, {opTx2}, {}); - TransactionMetaBuilder txm2( - true, *tx2, - ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx2->checkValidForTesting( - app->getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app->getAppConnector(), ltx, txm2)); + auto r2 = closeLedger(*app, {tx2}); + checkTx(0, r2, txFAILED); - REQUIRE(getRevokeSponsorshipResultCode(tx2, 0) == + REQUIRE(getRevokeSponsorshipResultCode(r2, 0, 0) == REVOKE_SPONSORSHIP_LOW_RESERVE); } SECTION("establish sponsorship") @@ -1308,15 +1093,10 @@ TEST_CASE_VERSIONS("update sponsorship", "[tx][sponsorship]") a1.op(endSponsoringFutureReserves())}, {a1, a2}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app->getAppConnector(), ltx, txm)); - - REQUIRE(getRevokeSponsorshipResultCode(tx, 1) == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txFAILED); + + REQUIRE(getRevokeSponsorshipResultCode(r, 0, 1) == REVOKE_SPONSORSHIP_LOW_RESERVE); } }; diff --git a/src/transactions/test/SetOptionsTests.cpp b/src/transactions/test/SetOptionsTests.cpp index 245f311404..f2fdeff574 100644 --- a/src/transactions/test/SetOptionsTests.cpp +++ b/src/transactions/test/SetOptionsTests.cpp @@ -355,40 +355,37 @@ TEST_CASE_VERSIONS("set options", "[tx][setoptions]") acc1.op(setOptions(setSigner(makeSigner(s2, 1))))}, {acc1.getSecretKey()}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - - checkSponsorship(ltx, acc1.getPublicKey(), 0, nullptr, 2, 2, - 0, 1); - auto ltxe = stellar::loadAccount(ltx, acc1.getPublicKey()); - auto const& ae = ltxe.current().data.account(); - extV2 = ae.ext.v1().ext.v2(); - - REQUIRE(ae.signers.size() == 2); - REQUIRE(extV2.signerSponsoringIDs.size() == 2); - if (makeSigner(s1, 1).key < makeSigner(s2, 1).key) - { - REQUIRE(ae.signers[0] == makeSigner(s1, 1)); - REQUIRE(ae.signers[1] == makeSigner(s2, 1)); - REQUIRE(*extV2.signerSponsoringIDs[0] == - root->getPublicKey()); - REQUIRE(!extV2.signerSponsoringIDs[1]); - } - else + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + { - REQUIRE(ae.signers[0] == makeSigner(s2, 1)); - REQUIRE(ae.signers[1] == makeSigner(s1, 1)); - REQUIRE(!extV2.signerSponsoringIDs[0]); - REQUIRE(*extV2.signerSponsoringIDs[1] == - root->getPublicKey()); + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, acc1.getPublicKey(), 0, nullptr, + 2, 2, 0, 1); + auto ltxe = + stellar::loadAccount(ltx, acc1.getPublicKey()); + auto const& ae = ltxe.current().data.account(); + extV2 = ae.ext.v1().ext.v2(); + + REQUIRE(ae.signers.size() == 2); + REQUIRE(extV2.signerSponsoringIDs.size() == 2); + if (makeSigner(s1, 1).key < makeSigner(s2, 1).key) + { + REQUIRE(ae.signers[0] == makeSigner(s1, 1)); + REQUIRE(ae.signers[1] == makeSigner(s2, 1)); + REQUIRE(*extV2.signerSponsoringIDs[0] == + root->getPublicKey()); + REQUIRE(!extV2.signerSponsoringIDs[1]); + } + else + { + REQUIRE(ae.signers[0] == makeSigner(s2, 1)); + REQUIRE(ae.signers[1] == makeSigner(s1, 1)); + REQUIRE(!extV2.signerSponsoringIDs[0]); + REQUIRE(*extV2.signerSponsoringIDs[1] == + root->getPublicKey()); + } } - - ltx.commit(); } { @@ -397,20 +394,19 @@ TEST_CASE_VERSIONS("set options", "[tx][setoptions]") {acc1.op(setOptions(setSigner(makeSigner(s3, 0))))}, {acc1.getSecretKey()}); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), - ltx, 0, 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - - checkSponsorship(ltx, acc1.getPublicKey(), 0, nullptr, 2, 2, - 0, 1); - auto ltxe = stellar::loadAccount(ltx, acc1.getPublicKey()); - REQUIRE(extV2 == + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); + + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + checkSponsorship(ltx, acc1.getPublicKey(), 0, nullptr, + 2, 2, 0, 1); + auto ltxe = + stellar::loadAccount(ltx, acc1.getPublicKey()); + REQUIRE( + extV2 == ltxe.current().data.account().ext.v1().ext.v2()); - ltx.commit(); + } } }); } @@ -498,14 +494,8 @@ TEST_CASE_VERSIONS("set options", "[tx][setoptions]") auto tx = transactionFrameFromOps(app->getNetworkID(), *root, ops, keys); - LedgerTxn ltx(app->getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app->getAppConnector()); - REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); - ltx.commit(); + auto r = closeLedger(*app, {tx}); + checkTx(0, r, txSUCCESS); checkSigners(); }; diff --git a/src/transactions/test/SetTrustLineFlagsTests.cpp b/src/transactions/test/SetTrustLineFlagsTests.cpp index d84425b3d2..4d3ce07e8e 100644 --- a/src/transactions/test/SetTrustLineFlagsTests.cpp +++ b/src/transactions/test/SetTrustLineFlagsTests.cpp @@ -1646,3 +1646,260 @@ TEST_CASE_VERSIONS("revoke from pool", }); } } + +TEST_CASE("pool share revocation order test", "[tx][settrustlineflags]") +{ + VirtualClock clock; + auto app = createTestApplication( + clock, getTestConfig(0, Config::TESTDB_IN_MEMORY)); + auto root = app->getRoot(); + auto& lm = app->getLedgerManager(); + auto txFee = lm.getLastTxFee(); + auto minBal = [&](int32_t n) { return lm.getLastMinBalance(n); }; + + // Assets issued by root with AUTH_REVOCABLE + auto assetA = makeAsset(*root, "AAAA"); + auto assetC = makeAsset(*root, "CCCC"); + auto assetD = makeAsset(*root, "DDDD"); + root->setOptions(setFlags(AUTH_REVOCABLE_FLAG)); + + // Pool-share assets and pool IDs + auto shareAC = + makeChangeTrustAssetPoolShare(assetA, assetC, LIQUIDITY_POOL_FEE_V18); + auto poolAC = xdrSha256(shareAC.liquidityPool()); + auto shareAD = + makeChangeTrustAssetPoolShare(assetA, assetD, LIQUIDITY_POOL_FEE_V18); + auto poolAD = xdrSha256(shareAD.liquidityPool()); + + // sponsor1 (Y) - backs PS1; also the sandwich sponsor for B during revoke + // sponsor2 (B) - backs PS2; will be in a sandwich with Y + auto trustor = root->create("trustor", minBal(20)); + auto sponsor1 = root->create("sponsor1", minBal(10)); + auto sponsor2 = root->create("sponsor2", minBal(10)); + + // Upgrade to current protocol (>= 18, required for pool-share revocation) + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + ltx.loadHeader().current().ledgerVersion = + Config::CURRENT_LEDGER_PROTOCOL_VERSION; + ltx.commit(); + } + + // Set up trustor's asset trustlines + trustor.changeTrust(assetA, INT64_MAX); + trustor.changeTrust(assetC, INT64_MAX); + trustor.changeTrust(assetD, INT64_MAX); + root->pay(trustor, assetA, 2000); + root->pay(trustor, assetD, 2000); + + // sponsor1 (Y) sponsors trustor's pool-share TL for pool(A,C) (PS1) + { + auto tx = transactionFrameFromOps( + app->getNetworkID(), sponsor1, + {sponsor1.op(beginSponsoringFutureReserves(trustor)), + trustor.op(changeTrust(shareAC, INT64_MAX)), + trustor.op(endSponsoringFutureReserves())}, + {trustor}); + LedgerTxn ltx(app->getLedgerTxnRoot()); + TransactionMetaBuilder txm(true, *tx, + ltx.loadHeader().current().ledgerVersion, + app->getAppConnector()); + REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); + REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + REQUIRE(tx->getResultCode() == txSUCCESS); + ltx.commit(); + } + + // sponsor2 (B) sponsors trustor's pool-share TL for pool(A,D) (PS2) + { + auto tx = transactionFrameFromOps( + app->getNetworkID(), sponsor2, + {sponsor2.op(beginSponsoringFutureReserves(trustor)), + trustor.op(changeTrust(shareAD, INT64_MAX)), + trustor.op(endSponsoringFutureReserves())}, + {trustor}); + LedgerTxn ltx(app->getLedgerTxnRoot()); + TransactionMetaBuilder txm(true, *tx, + ltx.loadHeader().current().ledgerVersion, + app->getAppConnector()); + REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); + REQUIRE(tx->apply(app->getAppConnector(), ltx, txm)); + REQUIRE(tx->getResultCode() == txSUCCESS); + ltx.commit(); + } + + // KEY: only deposit into pool(A,D), NOT pool(A,C). + // PS1 (pool(A,C)) has balance=0 -> no CBs created on revocation. + // PS2 (pool(A,D)) has balance>0 -> 2 CBs created on revocation. + // + // When PS1 is processed first: + // PS1 TL deleted: Y.numSponsoring -= 2 (frees 2*baseReserve) + // No CBs (balance=0): Y.numSponsoring unchanged + // Net: Y.availableBalance += 2*baseReserve + // Then PS2's 2 CBs need 2*baseReserve from Y (sandwich) -> SUCCESS + // + // When PS2 is processed first: + // PS2's 2 CBs need 2*baseReserve from Y (sandwich) + // Y.availableBalance = 0 -> LOW_RESERVE -> FAIL + trustor.liquidityPoolDeposit(poolAD, 100, 100, Price{1, 1}, Price{1, 1}); + + // Verify sponsor1 (Y) numSponsoring = 2 (pool-share TL mult = 2) + REQUIRE(getNumSponsoring(*app, sponsor1) == 2); + + // Drain sponsor1's available balance to exactly 0. + sponsor1.pay(*root, sponsor1.getAvailableBalance() - txFee); + REQUIRE(sponsor1.getAvailableBalance() == 0); + + // Revocation transaction with a single sandwich: Y sponsors B + // Op 0: Y begins sponsoring B + // Op 1: root revokes trustor's auth for assetA + // Op 2: B ends being sponsored by Y + auto revokeOp = setTrustLineFlags( + trustor, assetA, clearTrustLineFlags(TRUSTLINE_AUTH_FLAGS)); + + auto tx = transactionFrameFromOps( + app->getNetworkID(), *root, + {sponsor1.op(beginSponsoringFutureReserves(sponsor2)), + root->op(revokeOp), sponsor2.op(endSponsoringFutureReserves())}, + {sponsor1, sponsor2}); + + LedgerTxn ltx(app->getLedgerTxnRoot()); + TransactionMetaBuilder txm(true, *tx, + ltx.loadHeader().current().ledgerVersion, + app->getAppConnector()); + REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); + bool success = tx->apply(app->getAppConnector(), ltx, txm); + + // PS2 (balance>0, backer=B, sandwich sponsor=Y) first: + // 2 CBs -> Y needs 2*baseReserve -> has 0 -> LOW_RESERVE + REQUIRE(!success); + REQUIRE(tx->getResultCode() == txFAILED); + REQUIRE(tx->getResult() + .result.results()[1] + .tr() + .setTrustLineFlagsResult() + .code() == SET_TRUST_LINE_FLAGS_LOW_RESERVE); +} + +// We need at least 3 pool-share trustlines (not just 2) to trigger +// reordering. With only 2 entries, libstdc++'s std::unordered_map uses +// bucket_count=2. The bucket for a key is (hash ^ gMixer) % bucket_count, +// and for bucket_count=2 that reduces to a single-bit test. XOR with +// gMixer flips the same bit in both hashes, so the relative bucket +// assignment is invariant — the iteration order never changes regardless +// of gMixer. With 3+ entries the bucket_count grows (e.g. 5 or 7 in +// libstdc++), and (hash ^ gMixer) % n with n > 2 is no longer XOR- +// invariant, allowing different gMixer values to reorder the entries. +// +// This test uses 6 pool-share trustlines to ensure a comfortable margin. +// Only pool(A,F) has a deposit; the other 5 are empty. sponsor1 backs the +// 5 empty pools; sponsor2 backs the funded pool. The sandwich makes sponsor1 +// the future-reserve backer for sponsor2. + +TEST_CASE("revocation result test across validators", "[tx][settrustlineflags]") +{ + VirtualClock clock; + auto app = createTestApplication( + clock, getTestConfig(0, Config::TESTDB_IN_MEMORY)); + auto root = app->getRoot(); + auto& lm = app->getLedgerManager(); + auto txFee = lm.getLastTxFee(); + auto minBal = [&](int32_t n) { return lm.getLastMinBalance(n); }; + + // assetA is the revocable asset; B through G pair with A. + auto assetA = makeAsset(*root, "AAAA"); + auto assetB = makeAsset(*root, "BBBB"); + auto assetC = makeAsset(*root, "CCCC"); + auto assetD = makeAsset(*root, "DDDD"); + auto assetE = makeAsset(*root, "EEEE"); + auto assetF = makeAsset(*root, "FFFF"); + auto assetG = makeAsset(*root, "GGGG"); + root->setOptions(setFlags(AUTH_REVOCABLE_FLAG)); + + auto shareAB = + makeChangeTrustAssetPoolShare(assetA, assetB, LIQUIDITY_POOL_FEE_V18); + auto shareAC = + makeChangeTrustAssetPoolShare(assetA, assetC, LIQUIDITY_POOL_FEE_V18); + auto shareAD = + makeChangeTrustAssetPoolShare(assetA, assetD, LIQUIDITY_POOL_FEE_V18); + auto shareAE = + makeChangeTrustAssetPoolShare(assetA, assetE, LIQUIDITY_POOL_FEE_V18); + auto shareAF = + makeChangeTrustAssetPoolShare(assetA, assetF, LIQUIDITY_POOL_FEE_V18); + auto shareAG = + makeChangeTrustAssetPoolShare(assetA, assetG, LIQUIDITY_POOL_FEE_V18); + auto poolAF = xdrSha256(shareAF.liquidityPool()); + + // sponsor1 backs 5 empty pools (numSponsoring = 10). + // sponsor2 backs 1 funded pool (numSponsoring = 2). + // Sandwich: sponsor1 begins sponsoring sponsor2. + auto trustor = root->create("trustor", minBal(30)); + auto sponsor1 = root->create("sponsor1", minBal(20)); + auto sponsor2 = root->create("sponsor2", minBal(10)); + + trustor.changeTrust(assetA, INT64_MAX); + trustor.changeTrust(assetB, INT64_MAX); + trustor.changeTrust(assetC, INT64_MAX); + trustor.changeTrust(assetD, INT64_MAX); + trustor.changeTrust(assetE, INT64_MAX); + trustor.changeTrust(assetF, INT64_MAX); + trustor.changeTrust(assetG, INT64_MAX); + root->pay(trustor, assetA, 10000); + root->pay(trustor, assetF, 10000); + + auto sponsorPoolShare = [&](TestAccount& sponsor, + ChangeTrustAsset const& share) { + auto tx = transactionFrameFromOps( + app->getNetworkID(), sponsor, + {sponsor.op(beginSponsoringFutureReserves(trustor)), + trustor.op(changeTrust(share, INT64_MAX)), + trustor.op(endSponsoringFutureReserves())}, + {trustor}); + LedgerTxn ltx(app->getLedgerTxnRoot()); + TransactionMetaBuilder txm(true, *tx, + ltx.loadHeader().current().ledgerVersion, + app->getAppConnector()); + tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0); + tx->apply(app->getAppConnector(), ltx, txm); + ltx.commit(); + }; + // sponsor1 backs 5 empty pools. + sponsorPoolShare(sponsor1, shareAB); + sponsorPoolShare(sponsor1, shareAC); + sponsorPoolShare(sponsor1, shareAD); + sponsorPoolShare(sponsor1, shareAE); + sponsorPoolShare(sponsor1, shareAG); + // sponsor2 backs the funded pool (A,F). + sponsorPoolShare(sponsor2, shareAF); + + // Only deposit into pool(A,F). All others have balance=0. + trustor.liquidityPoolDeposit(poolAF, 100, 100, Price{1, 1}, Price{1, 1}); + + // sponsor1 backs 5 pool TLs (numSponsoring = 10). + // Drain to exactly 0 available balance. + // + // If an empty pool-share TL (backed by sponsor1) is deleted before + // pool(A,F), the freed reserves let sponsor1 back the CBs -> SUCCESS. + // If pool(A,F) is processed first, sponsor1 has 0 -> LOW_RESERVE. + sponsor1.pay(*root, sponsor1.getAvailableBalance() - txFee); + REQUIRE(sponsor1.getAvailableBalance() == 0); + + auto revokeOp = setTrustLineFlags( + trustor, assetA, clearTrustLineFlags(TRUSTLINE_AUTH_FLAGS)); + auto tx = transactionFrameFromOps( + app->getNetworkID(), *root, + {sponsor1.op(beginSponsoringFutureReserves(sponsor2)), + root->op(revokeOp), sponsor2.op(endSponsoringFutureReserves())}, + {sponsor1, sponsor2}); + + LedgerTxn ltx(app->getLedgerTxnRoot()); + TransactionMetaBuilder txm(true, *tx, + ltx.loadHeader().current().ledgerVersion, + app->getAppConnector()); + REQUIRE(tx->checkValidForTesting(app->getAppConnector(), ltx, 0, 0, 0)); + bool success = tx->apply(app->getAppConnector(), ltx, txm); + + // A deterministic implementation must always produce the same result. + REQUIRE(success); + REQUIRE(tx->getResultCode() == txSUCCESS); +} diff --git a/src/transactions/test/SorobanTxTestUtils.cpp b/src/transactions/test/SorobanTxTestUtils.cpp index c1147e05ec..16725e00d9 100644 --- a/src/transactions/test/SorobanTxTestUtils.cpp +++ b/src/transactions/test/SorobanTxTestUtils.cpp @@ -3,7 +3,7 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "SorobanTxTestUtils.h" -#include "bucket/BucketManager.h" +#include "ledger/LedgerStateSnapshot.h" #include "ledger/LedgerTypeUtils.h" #include "rust/RustBridge.h" #include "test/Catch2.h" @@ -12,6 +12,7 @@ #include "test/TxTests.h" #include "transactions/InvokeHostFunctionOpFrame.h" #include "transactions/TransactionUtils.h" +#include "util/Logging.h" #include "util/XDRCereal.h" #include "xdrpp/printer.h" @@ -1368,10 +1369,10 @@ SorobanTest::createRestoreTx(SorobanResources const& resources, bool SorobanTest::isTxValid(TransactionFrameBaseConstPtr tx) { - LedgerSnapshot ls(getApp()); + LedgerReadView lrv(getApp()); auto diagnostics = DiagnosticEventManager::createDisabled(); auto ret = - tx->checkValid(getApp().getAppConnector(), ls, 0, 0, 0, diagnostics); + tx->checkValid(getApp().getAppConnector(), lrv, 0, 0, 0, diagnostics); return ret->isSuccess(); } @@ -1380,10 +1381,10 @@ SorobanTest::invokeTx(TransactionFrameBaseConstPtr tx) { { auto diagnostics = DiagnosticEventManager::createDisabled(); - LedgerSnapshot ls(getApp()); - REQUIRE( - tx->checkValid(getApp().getAppConnector(), ls, 0, 0, 0, diagnostics) - ->isSuccess()); + LedgerReadView lrv(getApp()); + REQUIRE(tx->checkValid(getApp().getAppConnector(), lrv, 0, 0, 0, + diagnostics) + ->isSuccess()); } auto resultSet = closeLedger(*mApp, {tx}); @@ -1434,21 +1435,17 @@ ExpirationStatus SorobanTest::getEntryExpirationStatus(LedgerKey const& key) { auto ttlKey = getTTLKey(key); - LedgerSnapshot ls(getApp()); - if (auto lse = ls.load(ttlKey)) + LedgerReadView lrv(getApp()); + if (auto le = lrv.load(ttlKey)) { - if (lse.current().data.ttl().liveUntilLedgerSeq <= getLCLSeq()) + if (le.current().data.ttl().liveUntilLedgerSeq <= getLCLSeq()) { return ExpirationStatus::EXPIRED_IN_LIVE_STATE; } return ExpirationStatus::LIVE; } - auto hotArchive = getApp() - .getBucketManager() - .getBucketSnapshotManager() - .copySearchableHotArchiveBucketListSnapshot(); - releaseAssert(hotArchive); - if (hotArchive->load(key) != nullptr) + auto snap = getApp().getLedgerManager().copyLedgerStateSnapshot(); + if (snap.loadArchiveEntry(key) != nullptr) { return ExpirationStatus::HOT_ARCHIVE; } @@ -2325,5 +2322,5 @@ AuthTestTreeNode::toAuthorizedInvocation() const return invocation; } -} // namespace txtext +} // namespace txtest } // namespace stellar diff --git a/src/transactions/test/SponsorshipTestUtils.cpp b/src/transactions/test/SponsorshipTestUtils.cpp index a39339c5df..a56970a6a9 100644 --- a/src/transactions/test/SponsorshipTestUtils.cpp +++ b/src/transactions/test/SponsorshipTestUtils.cpp @@ -149,15 +149,9 @@ createSponsoredEntryButSponsorHasInsufficientBalance( sponsoredAcc.op(endSponsoringFutureReserves())}, {sponsoringAcc.getSecretKey(), sponsoredAcc.getSecretKey()}); - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm(true, *tx, - ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE( - tx->checkValidForTesting(app.getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx->apply(app.getAppConnector(), ltx, txm)); - REQUIRE(check(getOperationResult(tx, 1))); - ltx.commit(); + auto r = closeLedger(app, {tx}); + checkTx(0, r, txFAILED); + REQUIRE(check(r.results[0].result.result.results()[1])); }); } } @@ -256,73 +250,53 @@ createModifyAndRemoveSponsoredEntry(Application& app, TestAccount& sponsoredAcc, auto numReserves = getNumReservesRequiredForOperation(opCreate); { - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm( - true, *tx, ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx->checkValidForTesting(app.getAppConnector(), ltx, 0, - 0, 0)); - REQUIRE(tx->apply(app.getAppConnector(), ltx, txm)); + auto r = closeLedger(app, {tx}); + checkTx(0, r, txSUCCESS); + LedgerTxn ltx(app.getLedgerTxnRoot()); check(ltx); checkSponsorship(ltx, sponsoredAcc, 0, nullptr, nse + numReserves, 2, 0, numReserves); checkSponsorship(ltx, *root, 0, nullptr, 0, 2, numReserves, 0); - ltx.commit(); } // Modify sponsored entry { - LedgerTxn ltx2(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm2( - true, *tx2, ltx2.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app.getAppConnector(), ltx2, - 0, 0, 0)); - REQUIRE(tx2->apply(app.getAppConnector(), ltx2, txm2)); + auto r2 = closeLedger(app, {tx2}); + checkTx(0, r2, txSUCCESS); + LedgerTxn ltx2(app.getLedgerTxnRoot()); check(ltx2); checkSponsorship(ltx2, sponsoredAcc, 0, nullptr, nse + numReserves, 2, 0, numReserves); checkSponsorship(ltx2, *root, 0, nullptr, 0, 2, numReserves, 0); - ltx2.commit(); } // Modify sponsored entry while sponsored { - LedgerTxn ltx3(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm3( - true, *tx3, ltx3.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx3->checkValidForTesting(app.getAppConnector(), ltx3, - 0, 0, 0)); - REQUIRE(tx3->apply(app.getAppConnector(), ltx3, txm3)); + auto r3 = closeLedger(app, {tx3}); + checkTx(0, r3, txSUCCESS); + LedgerTxn ltx3(app.getLedgerTxnRoot()); check(ltx3); checkSponsorship(ltx3, sponsoredAcc, 0, nullptr, nse + numReserves, 2, 0, numReserves); checkSponsorship(ltx3, *root, 0, nullptr, 0, 2, numReserves, 0); checkSponsorship(ltx3, a2, 0, nullptr, 0, 0, 0, 0); - ltx3.commit(); } // Remove sponsored entry { - LedgerTxn ltx4(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm4( - true, *tx4, ltx4.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx4->checkValidForTesting(app.getAppConnector(), ltx4, - 0, 0, 0)); - REQUIRE(tx4->apply(app.getAppConnector(), ltx4, txm4)); + auto r4 = closeLedger(app, {tx4}); + checkTx(0, r4, txSUCCESS); + LedgerTxn ltx4(app.getLedgerTxnRoot()); if (rso.type() == REVOKE_SPONSORSHIP_LEDGER_ENTRY) { REQUIRE(!ltx4.load(rso.ledgerKey())); } checkSponsorship(ltx4, sponsoredAcc, 0, nullptr, nse, 2, 0, 0); checkSponsorship(ltx4, *root, 0, nullptr, 0, 2, 0, 0); - ltx4.commit(); } }); } @@ -409,13 +383,8 @@ submitTooManySponsoringTxs(Application& app, TestAccount& successfulOpAcc, successfulOp, successfulOpAcc.op(endSponsoringFutureReserves())}, {successfulOpAcc}); - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm1(true, *tx1, - ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app.getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app.getAppConnector(), ltx, txm1)); - ltx.commit(); + auto r1 = closeLedger(app, {tx1}); + checkTx(0, r1, txSUCCESS); } { @@ -425,13 +394,9 @@ submitTooManySponsoringTxs(Application& app, TestAccount& successfulOpAcc, failOpAcc.op(endSponsoringFutureReserves())}, {failOpAcc}); - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm2(true, *tx2, - ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app.getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app.getAppConnector(), ltx, txm2)); - REQUIRE(tx2->getResult().result.results()[1].code() == + auto r2 = closeLedger(app, {tx2}); + checkTx(0, r2, txFAILED); + REQUIRE(r2.results[0].result.result.results()[1].code() == opTOO_MANY_SPONSORING); } } @@ -556,26 +521,17 @@ submitTooManyNumSubEntries(Application& app, TestAccount& testAcc, auto tx1 = transactionFrameFromOps(app.getNetworkID(), testAcc, {successfulOp}, {}); - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm1(true, *tx1, - ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx1->checkValidForTesting(app.getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(tx1->apply(app.getAppConnector(), ltx, txm1)); - ltx.commit(); + auto r1 = closeLedger(app, {tx1}); + checkTx(0, r1, txSUCCESS); } { auto tx2 = transactionFrameFromOps(app.getNetworkID(), testAcc, {failOp}, {}); - LedgerTxn ltx(app.getLedgerTxnRoot()); - TransactionMetaBuilder txm2(true, *tx2, - ltx.loadHeader().current().ledgerVersion, - app.getAppConnector()); - REQUIRE(tx2->checkValidForTesting(app.getAppConnector(), ltx, 0, 0, 0)); - REQUIRE(!tx2->apply(app.getAppConnector(), ltx, txm2)); - REQUIRE(tx2->getResult().result.results()[0].code() == + auto r2 = closeLedger(app, {tx2}); + checkTx(0, r2, txFAILED); + REQUIRE(r2.results[0].result.result.results()[0].code() == opTOO_MANY_SUBENTRIES); } } diff --git a/src/transactions/test/TransactionTestFrame.cpp b/src/transactions/test/TransactionTestFrame.cpp index 37ba038267..45cc823ead 100644 --- a/src/transactions/test/TransactionTestFrame.cpp +++ b/src/transactions/test/TransactionTestFrame.cpp @@ -86,35 +86,36 @@ TransactionTestFrame::checkValid(AppConnector& app, AbstractLedgerTxn& ltxOuter, uint64_t upperBoundCloseTimeOffset) const { LedgerTxn ltx(ltxOuter); - auto ls = LedgerSnapshot(ltx); + auto lrv = LedgerReadView(ltx); auto diagnostics = DiagnosticEventManager::createDisabled(); mTransactionTxResult = mTransactionFrame->checkValid( - app, ls, current, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, + app, lrv, current, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, diagnostics); return mTransactionTxResult->clone(); } MutableTxResultPtr -TransactionTestFrame::checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset) const +TransactionTestFrame::checkValid( + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + std::optional validationLedgerSeq) const { auto diagnostics = DiagnosticEventManager::createDisabled(); - return checkValid(app, ls, current, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, diagnostics); + return checkValid(app, lrv, current, lowerBoundCloseTimeOffset, + upperBoundCloseTimeOffset, diagnostics, + validationLedgerSeq); } MutableTxResultPtr -TransactionTestFrame::checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const +TransactionTestFrame::checkValid( + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq) const { mTransactionTxResult = mTransactionFrame->checkValid( - app, ls, current, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, - diagnosticEvents); + app, lrv, current, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, + diagnosticEvents, validationLedgerSeq); return mTransactionTxResult->clone(); } @@ -187,6 +188,14 @@ TransactionTestFrame::validateSorobanTxForFlooding( return mTransactionFrame->validateSorobanTxForFlooding(keysToFilter); } +bool +TransactionTestFrame::validateAccountFilterForFlooding( + std::set const& filteredAccounts) const +{ + return mTransactionFrame->validateAccountFilterForFlooding( + filteredAccounts); +} + bool TransactionTestFrame::validateSorobanMemo() const { @@ -230,10 +239,10 @@ TransactionTestFrame::checkSignature(SignatureChecker& signatureChecker, bool TransactionTestFrame::checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const { - return mTransactionFrame->checkOperationSignatures(signatureChecker, ls, + return mTransactionFrame->checkOperationSignatures(signatureChecker, lrv, txResult); } @@ -355,7 +364,7 @@ TransactionTestFrame::preParallelApply( sorobanConfig); } -ParallelTxReturnVal +std::optional TransactionTestFrame::parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, diff --git a/src/transactions/test/TransactionTestFrame.h b/src/transactions/test/TransactionTestFrame.h index 5bafe0d71e..f3384c86de 100644 --- a/src/transactions/test/TransactionTestFrame.h +++ b/src/transactions/test/TransactionTestFrame.h @@ -68,15 +68,17 @@ class TransactionTestFrame : public TransactionFrameBase SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset) const; - MutableTxResultPtr checkValid(AppConnector& app, LedgerSnapshot const& ls, + MutableTxResultPtr checkValid( + AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, + uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + std::optional validationLedgerSeq = std::nullopt) const; + MutableTxResultPtr checkValid(AppConnector& app, LedgerReadView const& lrv, SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset) const; - MutableTxResultPtr - checkValid(AppConnector& app, LedgerSnapshot const& ls, - SequenceNumber current, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, - DiagnosticEventManager& diagnosticEvents) const override; + uint64_t upperBoundCloseTimeOffset, + DiagnosticEventManager& diagnosticEvents, + std::optional validationLedgerSeq = + std::nullopt) const override; bool checkSorobanResources( SorobanNetworkConfig const& cfg, uint32_t ledgerVersion, DiagnosticEventManager& diagnosticEvents) const override; @@ -94,6 +96,8 @@ class TransactionTestFrame : public TransactionFrameBase bool validateSorobanTxForFlooding( UnorderedSet const& keysToFilter) const override; + bool validateAccountFilterForFlooding( + std::set const& filteredAccounts) const override; bool validateSorobanMemo() const override; bool validateHostFn() const override; @@ -111,7 +115,7 @@ class TransactionTestFrame : public TransactionFrameBase int32_t neededWeight) const override; bool checkOperationSignatures( - SignatureChecker& signatureChecker, LedgerSnapshot const& ls, + SignatureChecker& signatureChecker, LedgerReadView const& lrv, MutableTransactionResultBase* txResult) const override; bool checkAllTransactionSignatures(SignatureChecker& signatureChecker, @@ -149,7 +153,7 @@ class TransactionTestFrame : public TransactionFrameBase MutableTransactionResultBase& resPayload, SorobanNetworkConfig const& sorobanConfig) const override; - ParallelTxReturnVal parallelApply( + std::optional parallelApply( AppConnector& app, ThreadParallelApplyLedgerState const& threadState, Config const& config, ParallelLedgerInfo const& ledgerInfo, MutableTransactionResultBase& resPayload, diff --git a/src/transactions/test/TxEnvelopeTests.cpp b/src/transactions/test/TxEnvelopeTests.cpp index 982fad3938..a7a5ba81ba 100644 --- a/src/transactions/test/TxEnvelopeTests.cpp +++ b/src/transactions/test/TxEnvelopeTests.cpp @@ -1484,10 +1484,12 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") REQUIRE(getAccountSigners(a1, *app).size() == 4); alternative.sign(tx); - applyTx(tx, *app); - REQUIRE(tx->getResultCode() == txSUCCESS); + auto txr = closeLedger(*app, {tx}); + checkTx(0, txr, txSUCCESS); REQUIRE(PaymentOpFrame::getInnerCode( - getFirstResult(tx)) == PAYMENT_SUCCESS); + txr.results[0] + .result.result.results()[0]) == + PAYMENT_SUCCESS); REQUIRE(getAccountSigners(a1, *app).size() == (alternative.autoRemove ? 3 : 4)); @@ -1876,14 +1878,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") TransactionTestFramePtr txFrame; auto setup = [&]() { txFrame = root->tx({createAccount(a1, paymentAmount)}); - auto txSet = makeTxSetFromTransactions({txFrame}, *app, 0, 0).first; - // Close this ledger - auto lastCloseTime = app->getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; - app->getHerder().externalizeValue(txSet, 3, lastCloseTime, - emptyUpgradeSteps); + closeLedger(*app, {txFrame}); REQUIRE(app->getLedgerManager().getLastClosedLedgerNum() == 3); }; diff --git a/src/util/DebugMetaUtils.h b/src/util/DebugMetaUtils.h index a70f3e826a..57042b59c9 100644 --- a/src/util/DebugMetaUtils.h +++ b/src/util/DebugMetaUtils.h @@ -15,7 +15,7 @@ namespace metautils std::string const META_DEBUG_DIRNAME{"meta-debug"}; std::string const DEBUG_TX_SET_FILENAME{"debug-tx-set.xdr"}; -std::string const META_DEBUG_FILE_FMT_STR{"meta-debug-{:08x}-{}.xdr"}; +constexpr char META_DEBUG_FILE_FMT_STR[]{"meta-debug-{:08x}-{}.xdr"}; std::regex const META_DEBUG_FILE_REGEX{ "meta-debug-[[:xdigit:]]+-[[:xdigit:]]+\\.xdr(\\.gz)?"}; std::regex const META_DEBUG_ZIP_FILE_REGEX{ diff --git a/src/util/GlobalChecks.h b/src/util/GlobalChecks.h index 0e8b51b7b2..f87a87463e 100644 --- a/src/util/GlobalChecks.h +++ b/src/util/GlobalChecks.h @@ -46,13 +46,8 @@ void dbgAbort(); #endif -#ifndef USE_TRACY using RecursiveLockGuard = RecursiveMutexLocker; using LockGuard = MutexLocker; -#else -using RecursiveLockGuard = std::lock_guard; -using LockGuard = std::lock_guard; -#endif #define RECURSIVE_LOCK_GUARD(mutex_, guardName) \ RecursiveLockGuard guardName(mutex_) #define LOCK_GUARD(mutex_, guardName) LockGuard guardName(mutex_) diff --git a/src/util/JitterInjection.cpp b/src/util/JitterInjection.cpp index d6520c489a..0fa07ec11a 100644 --- a/src/util/JitterInjection.cpp +++ b/src/util/JitterInjection.cpp @@ -49,7 +49,7 @@ JitterInjector::resetStats() } void -JitterInjector::configure(const Config& cfg) +JitterInjector::configure(Config const& cfg) { gJitterConfig = cfg; } @@ -90,7 +90,7 @@ JitterInjector::injectDelay(int32_t probability, uint64_t minUsec, probability = std::max(0, std::min(100, probability)); // Generate random number in [0, 100) - int roll = rand_uniform(0, 100, gJitterRandEngine); + int roll = rand_uniform(0, 99, gJitterRandEngine); if (roll >= probability) { diff --git a/src/util/JitterInjection.h b/src/util/JitterInjection.h index b5424700fc..1b5e558e41 100644 --- a/src/util/JitterInjection.h +++ b/src/util/JitterInjection.h @@ -102,7 +102,7 @@ class JitterInjector } // Configure jitter behavior - static void configure(const Config& cfg); + static void configure(Config const& cfg); // Main injection point: probabilistically delay with random duration // Returns true if a delay was injected, false otherwise diff --git a/src/util/Logging.cpp b/src/util/Logging.cpp index 1e2ed5d264..703241f4a4 100644 --- a/src/util/Logging.cpp +++ b/src/util/Logging.cpp @@ -109,8 +109,8 @@ Logging::init(bool truncate) VirtualClock clock(VirtualClock::REAL_TIME); std::time_t time = VirtualClock::to_time_t(clock.system_now()); auto filename = - fmt::format(mLastFilenamePattern, - fmt::arg("datetime", fmt::localtime(time))); + fmt::format(fmt::runtime(mLastFilenamePattern), + fmt::arg("datetime", *std::localtime(&time))); // NB: We do _not_ pass 'truncate' through to spdlog here -- spdlog // interprets 'truncate=true' as a request to open the file in "wb" diff --git a/src/util/Logging.h b/src/util/Logging.h index cd20817259..8fcf37f2d6 100644 --- a/src/util/Logging.h +++ b/src/util/Logging.h @@ -34,46 +34,46 @@ #define CLOG_TRACE(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::trace, \ - SPDLOG_LOGGER_TRACE(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_TRACE(lg, f, ##__VA_ARGS__)) #define CLOG_DEBUG(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::debug, \ - SPDLOG_LOGGER_DEBUG(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_DEBUG(lg, f, ##__VA_ARGS__)) #define CLOG_INFO(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::info, \ - SPDLOG_LOGGER_INFO(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_INFO(lg, f, ##__VA_ARGS__)) #define CLOG_WARNING(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::warn, \ - SPDLOG_LOGGER_WARN(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_WARN(lg, f, ##__VA_ARGS__)) #define CLOG_ERROR(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::err, \ - SPDLOG_LOGGER_ERROR(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_ERROR(lg, f, ##__VA_ARGS__)) #define CLOG_FATAL(partition, f, ...) \ LOG_CHECK(Logging::get##partition##LogPtr(), spdlog::level::critical, \ - SPDLOG_LOGGER_CRITICAL(lg, FMT_STRING(f), ##__VA_ARGS__)) + SPDLOG_LOGGER_CRITICAL(lg, f, ##__VA_ARGS__)) #define LOG_TRACE(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::trace, \ - SPDLOG_LOGGER_TRACE(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_TRACE(lg, fmt, ##__VA_ARGS__)) #define LOG_DEBUG(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::debug, \ - SPDLOG_LOGGER_DEBUG(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_DEBUG(lg, fmt, ##__VA_ARGS__)) #define LOG_INFO(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::info, \ - SPDLOG_LOGGER_INFO(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_INFO(lg, fmt, ##__VA_ARGS__)) #define LOG_WARNING(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::warn, \ - SPDLOG_LOGGER_WARN(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_WARN(lg, fmt, ##__VA_ARGS__)) #define LOG_ERROR(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::err, \ - SPDLOG_LOGGER_ERROR(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_ERROR(lg, fmt, ##__VA_ARGS__)) #define LOG_FATAL(lg, fmt, ...) \ LOG_CHECK(lg, spdlog::level::critical, \ - SPDLOG_LOGGER_CRITICAL(lg, FMT_STRING(fmt), ##__VA_ARGS__)) + SPDLOG_LOGGER_CRITICAL(lg, fmt, ##__VA_ARGS__)) #define GET_LOG(name) spdlog::get(name) #define DEFAULT_LOG spdlog::default_logger() diff --git a/src/util/Math.cpp b/src/util/Math.cpp index 9bdc4f12c6..2f6e6190e0 100644 --- a/src/util/Math.cpp +++ b/src/util/Math.cpp @@ -189,6 +189,7 @@ reinitializeAllGlobalStateWithSeedInternal(unsigned int seed) PubKeyUtils::seedVerifySigCache(seed); srand(seed); getGlobalRandomEngine().seed(seed); + randHash::gHaveInitialized = false; randHash::initialize(); randomEvictionCacheSeed = seed; #ifdef BUILD_THREAD_JITTER diff --git a/src/util/MetaUtils.cpp b/src/util/MetaUtils.cpp index 036765cd06..316a9500b0 100644 --- a/src/util/MetaUtils.cpp +++ b/src/util/MetaUtils.cpp @@ -88,6 +88,62 @@ normalizeOps(xdr::xvector& oms) } } +namespace +{ + +bool +isCoreMetricsTimingEvent(DiagnosticEvent const& de) +{ + if (de.event.type != ContractEventType::DIAGNOSTIC) + { + return false; + } + auto const& topics = de.event.body.v0().topics; + if (topics.size() != 2) + { + return false; + } + if (topics[0].type() != SCV_SYMBOL || topics[1].type() != SCV_SYMBOL) + { + return false; + } + return topics[0].sym() == "core_metrics" && + topics[1].sym() == "invoke_time_nsecs"; +} + +void +zeroDiagnosticTimingEvents(xdr::xvector& events) +{ + for (auto& de : events) + { + if (isCoreMetricsTimingEvent(de)) + { + de.event.body.v0().data.u64() = 0; + } + } +} + +void +zeroNonDeterministicTransactionMeta(TransactionMeta& m) +{ + switch (m.v()) + { + case 3: + if (m.v3().sorobanMeta) + { + zeroDiagnosticTimingEvents(m.v3().sorobanMeta->diagnosticEvents); + } + break; + case 4: + zeroDiagnosticTimingEvents(m.v4().diagnosticEvents); + break; + default: + break; + } +} + +} // namespace + namespace stellar { @@ -174,4 +230,30 @@ normalizeMeta(LedgerCloseMeta& lcm) abort(); } } + +void +zeroNonDeterministicDiagnostics(LedgerCloseMeta& lcm) +{ + auto zeroTxProcessing = [](auto& txProcessing) { + for (auto& tx : txProcessing) + { + zeroNonDeterministicTransactionMeta(tx.txApplyProcessing); + } + }; + + switch (lcm.v()) + { + case 0: + zeroTxProcessing(lcm.v0().txProcessing); + break; + case 1: + zeroTxProcessing(lcm.v1().txProcessing); + break; + case 2: + zeroTxProcessing(lcm.v2().txProcessing); + break; + default: + abort(); + } +} } diff --git a/src/util/MetaUtils.h b/src/util/MetaUtils.h index dd8679a267..69bf717a15 100644 --- a/src/util/MetaUtils.h +++ b/src/util/MetaUtils.h @@ -15,4 +15,8 @@ void normalizeMeta(TransactionMeta& m); struct LedgerCloseMeta; void normalizeMeta(LedgerCloseMeta& lcm); + +// Zeros out wall-clock timing fields (e.g. invoke_time_nsecs) in diagnostic +// events so that LCM is deterministic across runs. +void zeroNonDeterministicDiagnostics(LedgerCloseMeta& lcm); } diff --git a/src/util/MetricsRegistry.h b/src/util/MetricsRegistry.h index b2c057f83d..9cd0656ebe 100644 --- a/src/util/MetricsRegistry.h +++ b/src/util/MetricsRegistry.h @@ -10,7 +10,7 @@ namespace stellar // Wrapper around medida::MetricsRegistry to support registering `SimpleTimer`s class MetricsRegistry : public medida::MetricsRegistry { - Mutex mLock; + ANNOTATED_MUTEX(mLock); // Note that it is safe to hand out references to this map because values // have pointer stability. std::map mSimpleTimers GUARDED_BY(mLock); diff --git a/src/util/Scheduler.h b/src/util/Scheduler.h index 7fb25aa527..6f1b2a5860 100644 --- a/src/util/Scheduler.h +++ b/src/util/Scheduler.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -183,7 +184,7 @@ class Scheduler // or run. size_t mSize{0}; - bool mIsShutdown{false}; + std::atomic mIsShutdown{false}; void trimSingleActionQueue(Qptr q, std::chrono::steady_clock::time_point now); diff --git a/src/util/SecretManager.cpp b/src/util/SecretManager.cpp new file mode 100644 index 0000000000..3da90091dc --- /dev/null +++ b/src/util/SecretManager.cpp @@ -0,0 +1,92 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#include "util/SecretManager.h" +#include "util/Logging.h" + +#include +#include +#include +#include + +namespace stellar +{ +namespace secretmanager +{ + +namespace stdfs = std::filesystem; + +static std::string const FILE_PREFIX = "$FILE:"; + +static std::string +rtrim(std::string s) +{ + auto end = s.find_last_not_of(" \t\n\r"); + if (end == std::string::npos) + { + return ""; + } + return s.substr(0, end + 1); +} + +static void +checkFilePermissions(std::string const& filePath) +{ + stdfs::path p(filePath); + auto status = stdfs::status(p); + if (!stdfs::is_regular_file(status)) + { + throw std::runtime_error("Secret path is not a regular file: " + + filePath); + } + auto perms = status.permissions(); + // Reject if group or others have any access + auto forbidden = stdfs::perms::group_all | stdfs::perms::others_all; + if ((perms & forbidden) != stdfs::perms::none) + { + throw std::runtime_error( + "Secret file has overly permissive permissions " + "(must not be accessible by group or others): " + + filePath); + } +} + +static std::string +resolveFromFile(std::string const& filePath) +{ + LOG_INFO(DEFAULT_LOG, "Resolving secret from file"); + checkFilePermissions(filePath); + std::ifstream ifs(filePath); + if (!ifs.is_open()) + { + throw std::runtime_error("Cannot open secret file: " + filePath); + } + std::stringstream ss; + ss << ifs.rdbuf(); + std::string result = rtrim(ss.str()); + if (result.empty()) + { + throw std::runtime_error("Secret file is empty: " + filePath); + } + return result; +} + +std::string +resolve(std::string const& configValue) +{ + if (configValue.substr(0, FILE_PREFIX.size()) == FILE_PREFIX) + { + return resolveFromFile(configValue.substr(FILE_PREFIX.size())); + } + return configValue; +} + +bool +isExternalSecret(std::string const& configValue) +{ + return configValue.substr(0, FILE_PREFIX.size()) == FILE_PREFIX; +} + +} // namespace secretmanager +} // namespace stellar diff --git a/src/util/SecretManager.h b/src/util/SecretManager.h new file mode 100644 index 0000000000..4eb48d61c3 --- /dev/null +++ b/src/util/SecretManager.h @@ -0,0 +1,29 @@ +// Copyright 2026 Stellar Development Foundation and contributors. Licensed +// under the Apache License, Version 2.0. See the COPYING file at the root +// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 + +#pragma once + +#include + +namespace stellar +{ +namespace secretmanager +{ + +// Resolve a config value that may reference an external secret source. +// +// Supported prefixes: +// "$FILE:/path/file" - read from file (must have permissions 0600 or +// stricter) +// no prefix - return the value unchanged (backward compatible) +// +// Throws std::runtime_error on failure (unreadable file, bad permissions, +// empty resolved value). +std::string resolve(std::string const& configValue); + +// Returns true if the value uses an external secret reference ($FILE: prefix). +bool isExternalSecret(std::string const& configValue); + +} // namespace secretmanager +} // namespace stellar diff --git a/src/util/SimpleTimer.h b/src/util/SimpleTimer.h index d247eaefde..91d0cc4698 100644 --- a/src/util/SimpleTimer.h +++ b/src/util/SimpleTimer.h @@ -43,7 +43,7 @@ class SimpleTimer medida::Counter& mMaxSampleValue; std::int64_t mMax GUARDED_BY(mLock); - Mutex mLock; + ANNOTATED_MUTEX(mLock); std::chrono::nanoseconds const mDurationUnit; diff --git a/src/util/ThreadAnnotations.h b/src/util/ThreadAnnotations.h index 5f878f9d91..d1bfd6f539 100644 --- a/src/util/ThreadAnnotations.h +++ b/src/util/ThreadAnnotations.h @@ -11,13 +11,14 @@ // Documentation for the annotations is available at: // https://clang.llvm.org/docs/ThreadSafetyAnalysis.html -#ifndef THREAD_ANNOTATIONS_H_ -#define THREAD_ANNOTATIONS_H_ - #include "util/NonCopyable.h" #include #include +#ifdef USE_TRACY +#include +#endif + #if defined(__clang__) && (!defined(SWIG)) #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) #else @@ -130,8 +131,22 @@ // class). #define SCOPED_LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) -// Defines an annotated interface for mutexes. -// These methods can be implemented to use any internal mutex implementation. +// Helper macros for declaring mutexes with optional thread safety annotations. +// These macros handle the conditional compilation based on THREAD_SAFETY and +// USE_TRACY flags, eliminating scattered #ifdef blocks in user code. + +// When THREAD_SAFETY is enabled, applies the given annotations to the mutex +// declaration. Otherwise, the annotations are stripped (becoming a no-op). +#ifdef THREAD_SAFETY +#define ANNOTATE_FOR_THREAD_SAFETY(...) __VA_ARGS__ +#else +#define ANNOTATE_FOR_THREAD_SAFETY(...) +#endif + +// Mutex wrapper that conditionally uses Tracy instrumentation. +// When USE_TRACY is enabled, this wraps std::mutex with Tracy tracking. +// When THREAD_SAFETY is enabled, it enables static thread safety checks. +#ifndef USE_TRACY class LOCKABLE Mutex : public stellar::NonMovableOrCopyable { private: @@ -155,9 +170,11 @@ class LOCKABLE Mutex : public stellar::NonMovableOrCopyable mMutex.unlock(); } }; +#endif // MutexLocker is an RAII class that acquires a mutex in its constructor, and // releases it in its destructor. +#ifndef USE_TRACY template class SCOPED_LOCKABLE MutexLockerT : public stellar::NonMovableOrCopyable { @@ -174,6 +191,25 @@ class SCOPED_LOCKABLE MutexLockerT : public stellar::NonMovableOrCopyable mut.Unlock(); } }; +#else +// Tracy's Lockable uses standard lock()/unlock() interface +template +class MutexLockerT : public stellar::NonMovableOrCopyable +{ + private: + MutexType& mut; + + public: + MutexLockerT(MutexType& mu) : mut(mu) + { + mu.lock(); + } + ~MutexLockerT() + { + mut.unlock(); + } +}; +#endif // Defines an annotated interface for shared mutexes (read-write locks). // These methods can be implemented to use any internal shared_mutex @@ -217,6 +253,7 @@ class LOCKABLE SharedMutex : public stellar::NonMovableOrCopyable // SharedLockShared is an RAII class that acquires a shared mutex in shared // mode in its constructor, and releases it in its destructor. +#ifndef USE_TRACY class SCOPED_LOCKABLE SharedLockShared : public stellar::NonMovableOrCopyable { private: @@ -232,6 +269,24 @@ class SCOPED_LOCKABLE SharedLockShared : public stellar::NonMovableOrCopyable mut.UnlockShared(); } }; +#else +// Tracy's SharedLockable uses standard lock_shared()/unlock_shared() +class SharedLockShared : public stellar::NonMovableOrCopyable +{ + private: + tracy::SharedLockable& mut; + + public: + SharedLockShared(tracy::SharedLockable& mu) : mut(mu) + { + mu.lock_shared(); + } + ~SharedLockShared() + { + mut.unlock_shared(); + } +}; +#endif // Defines an annotated interface for recursive mutexes. // These methods can be implemented to use any internal recursive_mutex @@ -260,8 +315,54 @@ class LOCKABLE RecursiveMutex : public stellar::NonMovableOrCopyable } }; +#ifndef USE_TRACY using MutexLocker = MutexLockerT; using RecursiveMutexLocker = MutexLockerT; using SharedLockExclusive = MutexLockerT; +#else +using MutexLocker = MutexLockerT>; +using RecursiveMutexLocker = + MutexLockerT>; +using SharedLockExclusive = + MutexLockerT>; +#endif + +// Mutex declaration macros that handle conditional compilation. +// These macros eliminate the need for scattered #ifdef blocks throughout the +// code. +// +// Usage examples: +// ANNOTATED_MUTEX(mMyMutex) +// ANNOTATED_RECURSIVE_MUTEX(mMyMutex, ACQUIRED_BEFORE(other)) +// +// The macros automatically: +// - Choose between TracyLockable and standard Mutex based on USE_TRACY +// - Apply thread safety annotations only when THREAD_SAFETY is enabled + +// Standard mutex declaration with optional thread safety annotations. +// The annotations parameter can be empty or contain one or more annotations. +#ifndef USE_TRACY +#define ANNOTATED_MUTEX(VarName, ...) \ + Mutex VarName ANNOTATE_FOR_THREAD_SAFETY(__VA_ARGS__) +#else +#define ANNOTATED_MUTEX(VarName, ...) TracyLockable(std::mutex, VarName) +#endif -#endif // THREAD_ANNOTATIONS_H_ +// Recursive mutex declaration with optional thread safety annotations. +#ifndef USE_TRACY +#define ANNOTATED_RECURSIVE_MUTEX(VarName, ...) \ + RecursiveMutex VarName ANNOTATE_FOR_THREAD_SAFETY(__VA_ARGS__) +#else +#define ANNOTATED_RECURSIVE_MUTEX(VarName, ...) \ + TracyLockable(std::recursive_mutex, VarName) +#endif + +// Shared (read-write) mutex declaration with optional thread safety +// annotations. +#ifndef USE_TRACY +#define ANNOTATED_SHARED_MUTEX(VarName, ...) \ + SharedMutex VarName ANNOTATE_FOR_THREAD_SAFETY(__VA_ARGS__) +#else +#define ANNOTATED_SHARED_MUTEX(VarName, ...) \ + TracySharedLockable(std::shared_mutex, VarName) +#endif diff --git a/src/util/Timer.cpp b/src/util/Timer.cpp index 9f46b26e1e..2d776faccf 100644 --- a/src/util/Timer.cpp +++ b/src/util/Timer.cpp @@ -38,7 +38,7 @@ VirtualClock::now() const noexcept } else { - std::lock_guard lock(mVirtualNowMutex); + LOCK_GUARD(mVirtualNowMutex, lock); return mVirtualNow; } } @@ -52,7 +52,7 @@ VirtualClock::system_now() const noexcept } else { - std::lock_guard lock(mVirtualNowMutex); + LOCK_GUARD(mVirtualNowMutex, lock); auto offset = mVirtualNow.time_since_epoch(); return std::chrono::system_clock::time_point( std::chrono::duration_cast< @@ -260,7 +260,7 @@ VirtualClock::shutdown() // Clear pending queue for the scheduler { - std::lock_guard guard(mPendingActionQueueMutex); + LOCK_GUARD(mPendingActionQueueMutex, guard); mPendingActionQueue = std::queue, std::string, Scheduler::ActionType>>(); @@ -275,7 +275,7 @@ void VirtualClock::setCurrentVirtualTime(time_point t) { releaseAssert(mMode == VIRTUAL_TIME); - std::lock_guard lock(mVirtualNowMutex); + LOCK_GUARD(mVirtualNowMutex, lock); // Maintain monotonicity in VIRTUAL_TIME mode. releaseAssert(t >= mVirtualNow); mVirtualNow = t; @@ -398,7 +398,7 @@ VirtualClock::crank(bool block) // results are waiting in the pending queue. bool hasPendingActions = false; { - std::lock_guard guard(mPendingActionQueueMutex); + LOCK_GUARD(mPendingActionQueueMutex, guard); hasPendingActions = !mPendingActionQueue.empty(); } if (!hasPendingActions) @@ -414,7 +414,7 @@ VirtualClock::crank(bool block) // Transfer any pending actions to the scheduler, counting them as // "progress" also. { - std::lock_guard guard(mPendingActionQueueMutex); + LOCK_GUARD(mPendingActionQueueMutex, guard); while (!mPendingActionQueue.empty()) { auto& f = mPendingActionQueue.front(); @@ -464,7 +464,7 @@ VirtualClock::postAction(std::function&& f, std::string&& name, bool queueWasEmpty = false; { - std::lock_guard lock(mPendingActionQueueMutex); + LOCK_GUARD(mPendingActionQueueMutex, lock); queueWasEmpty = mPendingActionQueue.empty(); mPendingActionQueue.emplace(std::move(f), std::move(name), type); } @@ -497,7 +497,7 @@ VirtualClock::getActionQueueSize() const { size_t pending = 0; { - std::lock_guard guard(mPendingActionQueueMutex); + LOCK_GUARD(mPendingActionQueueMutex, guard); pending = mPendingActionQueue.size(); } return pending + mActionScheduler->size(); @@ -574,7 +574,7 @@ VirtualClock::advanceToNext() auto nextEvent = next(); // jump forward in time, if needed { - std::lock_guard lock(mVirtualNowMutex); + LOCK_GUARD(mVirtualNowMutex, lock); if (mVirtualNow < nextEvent) { mVirtualNow = nextEvent; diff --git a/src/util/Timer.h b/src/util/Timer.h index 8ac82fc4d9..3ae767591c 100644 --- a/src/util/Timer.h +++ b/src/util/Timer.h @@ -10,13 +10,12 @@ #include "util/asio.h" #include "util/NonCopyable.h" #include "util/Scheduler.h" +#include "util/ThreadAnnotations.h" #include #include #include -#include #include -#include #include namespace stellar @@ -166,7 +165,7 @@ class VirtualClock Mode const mMode; size_t nRealTimerCancelEvents{0}; - time_point mVirtualNow; + time_point mVirtualNow GUARDED_BY(mVirtualNowMutex); std::atomic mBackgroundWorkCount{0}; @@ -188,10 +187,10 @@ class VirtualClock std::chrono::steady_clock::time_point mLastDispatchStart; std::unique_ptr mActionScheduler; - mutable std::mutex mPendingActionQueueMutex; + mutable ANNOTATED_MUTEX(mPendingActionQueueMutex); std::queue< std::tuple, std::string, Scheduler::ActionType>> - mPendingActionQueue; + mPendingActionQueue GUARDED_BY(mPendingActionQueueMutex); using PrQueue = std::priority_queue, @@ -208,7 +207,7 @@ class VirtualClock // timer should be last to ensure it gets destroyed first RealSteadyTimer mRealTimer; - std::mutex mutable mVirtualNowMutex; + mutable ANNOTATED_MUTEX(mVirtualNowMutex); public: // A VirtualClock is instantiated in either real or virtual mode. In real diff --git a/src/util/XDROperators.h b/src/util/XDROperators.h index e4d15018df..8a3591273e 100644 --- a/src/util/XDROperators.h +++ b/src/util/XDROperators.h @@ -9,5 +9,5 @@ namespace stellar { using xdr::operator==; -using xdr::operator<; +using xdr::operator<=>; } diff --git a/src/util/XDRStream.h b/src/util/XDRStream.h index 36e293e703..5af0825f47 100644 --- a/src/util/XDRStream.h +++ b/src/util/XDRStream.h @@ -28,6 +28,13 @@ namespace stellar /** * Helper for loading a sequence of XDR objects from a file one at a time, * rather than all at once. + * + * Each object in the file is framed using the Record Marking Standard defined + * in RFC 5531 Section 11 (https://www.rfc-editor.org/rfc/rfc5531#section-11). + * Every object is preceded by a 4-byte big-endian fragment header where bit 31 + * (high bit) is the last-fragment flag and bits 0-30 encode the byte length of + * the fragment data that follows. In Stellar's usage each record is a single + * fragment with the last-fragment bit always set. */ class XDRInputFileStream { @@ -98,10 +105,12 @@ class XDRInputFileStream mIn.seekg(pos); } + // Reads the fragment header, clears the last-fragment flag bit, and + // returns the length. See the class comment for the header format. static inline uint32_t getXDRSize(char* buf) { - // Read 4 bytes of size, big-endian, with XDR 'continuation' bit cleared + // Read 4 bytes of size, big-endian, with last-fragment flag bit cleared // (high bit of high byte). uint32_t sz = 0; sz |= static_cast(buf[0] & '\x7f'); @@ -439,6 +448,16 @@ class OutputFileStream } }; +/** + * Helper for writing a sequence of XDR objects to a file one at a time. + * + * Each object is framed using the Record Marking Standard defined in RFC 5531 + * Section 11 (https://www.rfc-editor.org/rfc/rfc5531#section-11). Every object + * is preceded by a 4-byte big-endian fragment header where bit 31 (high bit) is + * the last-fragment flag and bits 0-30 encode the byte length of the fragment + * data that follows. Each record is written as a single fragment with the + * last-fragment bit set. + */ class XDROutputFileStream : public OutputFileStream { public: @@ -457,6 +476,8 @@ class XDROutputFileStream : public OutputFileStream fs::flushFileChanges(getHandle()); } + // Writes a single XDR object as a one-fragment record. See the class + // comment for the header format. template void writeOne(T const& t, SHA256* hasher = nullptr, size_t* bytesPut = nullptr) @@ -470,8 +491,8 @@ class XDROutputFileStream : public OutputFileStream mBuf.resize(sz + 4); } - // Write 4 bytes of size, big-endian, with XDR 'continuation' bit set on - // high bit of high byte. + // Write 4 bytes of size, big-endian, with the last-fragment flag set + // on high bit of high byte. mBuf[0] = static_cast((sz >> 24) & 0xFF) | '\x80'; mBuf[1] = static_cast((sz >> 16) & 0xFF); mBuf[2] = static_cast((sz >> 8) & 0xFF); diff --git a/src/util/numeric.h b/src/util/numeric.h index 56e3e726e3..73e5e53350 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace stellar { @@ -83,16 +84,31 @@ saturatingMultiply(int64_t a, int64_t b) return a * b; } -// Saturating addition for unsigned ints: returns a + b, capped at type max. +// Saturating addition for ints: returns a + b, capped at type min/max. template inline T saturatingAdd(T a, T b) { - static_assert(std::is_unsigned()); - if (a > std::numeric_limits::max() - b) + static_assert(std::is_integral()); + if constexpr (std::is_unsigned()) { - return std::numeric_limits::max(); + if (a > std::numeric_limits::max() - b) + { + return std::numeric_limits::max(); + } + return a + b; + } + else + { + if (b > 0 && a > std::numeric_limits::max() - b) + { + return std::numeric_limits::max(); + } + if (b < 0 && a < std::numeric_limits::min() - b) + { + return std::numeric_limits::min(); + } + return a + b; } - return a + b; } } diff --git a/src/util/xdrquery/XDRFieldResolver.h b/src/util/xdrquery/XDRFieldResolver.h index 805c7e8155..f288643ea9 100644 --- a/src/util/xdrquery/XDRFieldResolver.h +++ b/src/util/xdrquery/XDRFieldResolver.h @@ -6,6 +6,7 @@ #include #include +#include #include #include "crypto/Hex.h" diff --git a/src/util/xdrquery/XDRQueryEval.cpp b/src/util/xdrquery/XDRQueryEval.cpp index 1d312d51dd..d1b6e763c6 100644 --- a/src/util/xdrquery/XDRQueryEval.cpp +++ b/src/util/xdrquery/XDRQueryEval.cpp @@ -4,6 +4,7 @@ #include "util/xdrquery/XDRQueryEval.h" #include "fmt/format.h" +#include "fmt/ranges.h" #include "util/xdrquery/XDRQueryError.h" namespace xdrquery diff --git a/src/work/BatchWork.cpp b/src/work/BatchWork.cpp index 07ea54daf9..ac1be51c66 100644 --- a/src/work/BatchWork.cpp +++ b/src/work/BatchWork.cpp @@ -11,8 +11,8 @@ namespace stellar { -BatchWork::BatchWork(Application& app, std::string name) - : Work(app, name, BasicWork::RETRY_NEVER) +BatchWork::BatchWork(Application& app, std::string name, size_t retries) + : Work(app, name, retries) { } diff --git a/src/work/BatchWork.h b/src/work/BatchWork.h index 0ab0fd8010..547aab08e0 100644 --- a/src/work/BatchWork.h +++ b/src/work/BatchWork.h @@ -24,7 +24,8 @@ class BatchWork : public Work void addMoreWorkIfNeeded(); public: - BatchWork(Application& app, std::string name); + BatchWork(Application& app, std::string name, + size_t retries = BasicWork::RETRY_NEVER); ~BatchWork() = default; size_t diff --git a/test-lcm/BeginSponsoringFutureReservesTests/3b6d924921f59f9f.xdr b/test-lcm/BeginSponsoringFutureReservesTests/3b6d924921f59f9f.xdr new file mode 100644 index 0000000000..c4071f8bd1 Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/3b6d924921f59f9f.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/3cb8cdd0c21fcfb1.xdr b/test-lcm/BeginSponsoringFutureReservesTests/3cb8cdd0c21fcfb1.xdr new file mode 100644 index 0000000000..dafe2119ae Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/3cb8cdd0c21fcfb1.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/507604981827c989.xdr b/test-lcm/BeginSponsoringFutureReservesTests/507604981827c989.xdr new file mode 100644 index 0000000000..fddc3af197 Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/507604981827c989.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/5a61e6aac9038144.xdr b/test-lcm/BeginSponsoringFutureReservesTests/5a61e6aac9038144.xdr new file mode 100644 index 0000000000..09c2543d9f Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/5a61e6aac9038144.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/9bc0a679d6d62183.xdr b/test-lcm/BeginSponsoringFutureReservesTests/9bc0a679d6d62183.xdr new file mode 100644 index 0000000000..16c313e8f3 Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/9bc0a679d6d62183.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/e55c615e3d4d0fb9.xdr b/test-lcm/BeginSponsoringFutureReservesTests/e55c615e3d4d0fb9.xdr new file mode 100644 index 0000000000..3cc650740d Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/e55c615e3d4d0fb9.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/e9b0303fe49e8211.xdr b/test-lcm/BeginSponsoringFutureReservesTests/e9b0303fe49e8211.xdr new file mode 100644 index 0000000000..ac2be4c21e Binary files /dev/null and b/test-lcm/BeginSponsoringFutureReservesTests/e9b0303fe49e8211.xdr differ diff --git a/test-lcm/BeginSponsoringFutureReservesTests/index.json b/test-lcm/BeginSponsoringFutureReservesTests/index.json new file mode 100644 index 0000000000..5527759de9 --- /dev/null +++ b/test-lcm/BeginSponsoringFutureReservesTests/index.json @@ -0,0 +1,9 @@ +{ + "3b6d924921f59f9f" : "sponsor_future_reserves-protocol_version_26-add_sponsored_entry_before_adding_first_sponsored_signer", + "3cb8cdd0c21fcfb1" : "sponsor_future_reserves-protocol_version_26-sponsoring_account_is_sponsored", + "507604981827c989" : "sponsor_future_reserves-protocol_version_26-already_sponsored", + "5a61e6aac9038144" : "sponsor_future_reserves-protocol_version_26-success", + "9bc0a679d6d62183" : "sponsor_future_reserves-protocol_version_26-bad_sponsorship", + "e55c615e3d4d0fb9" : "sponsor_future_reserves-protocol_version_26-sponsored_account_is_sponsoring", + "e9b0303fe49e8211" : "sponsor_future_reserves-protocol_version_26-sponsorships_with_precondition_that_uses_v3_extension" +} diff --git a/test-lcm/FrozenLedgerKeysTests/0130d32614dbc252.xdr b/test-lcm/FrozenLedgerKeysTests/0130d32614dbc252.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/0130d32614dbc252.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/0269778d4c3c115b.xdr b/test-lcm/FrozenLedgerKeysTests/0269778d4c3c115b.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/0269778d4c3c115b.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr b/test-lcm/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr new file mode 100644 index 0000000000..9292b3f41e Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr b/test-lcm/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr new file mode 100644 index 0000000000..49a8bf49c1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr b/test-lcm/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr b/test-lcm/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr new file mode 100644 index 0000000000..b69ade7449 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr b/test-lcm/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr new file mode 100644 index 0000000000..5d5f8e2b5b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr b/test-lcm/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr new file mode 100644 index 0000000000..2cb64b0ca3 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/104f5d62fa026b98.xdr b/test-lcm/FrozenLedgerKeysTests/104f5d62fa026b98.xdr new file mode 100644 index 0000000000..3a8c0d9ef5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/104f5d62fa026b98.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr b/test-lcm/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr new file mode 100644 index 0000000000..76e786ebba Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/12a1f394aac5f093.xdr b/test-lcm/FrozenLedgerKeysTests/12a1f394aac5f093.xdr new file mode 100644 index 0000000000..4f7a61c4b1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/12a1f394aac5f093.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr b/test-lcm/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr new file mode 100644 index 0000000000..72e232b241 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/137b73a35107c4c5.xdr b/test-lcm/FrozenLedgerKeysTests/137b73a35107c4c5.xdr new file mode 100644 index 0000000000..5a838b11e2 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/137b73a35107c4c5.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr b/test-lcm/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr new file mode 100644 index 0000000000..4f7a61c4b1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr b/test-lcm/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr new file mode 100644 index 0000000000..e22b75ff96 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr b/test-lcm/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr new file mode 100644 index 0000000000..4935cd51c4 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr b/test-lcm/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr new file mode 100644 index 0000000000..ed8a7487ff Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/233d74d8369feacb.xdr b/test-lcm/FrozenLedgerKeysTests/233d74d8369feacb.xdr new file mode 100644 index 0000000000..f95ba9f689 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/233d74d8369feacb.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/27e094a33ea270ce.xdr b/test-lcm/FrozenLedgerKeysTests/27e094a33ea270ce.xdr new file mode 100644 index 0000000000..404e3ef005 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/27e094a33ea270ce.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/2c135153a34652ed.xdr b/test-lcm/FrozenLedgerKeysTests/2c135153a34652ed.xdr new file mode 100644 index 0000000000..6f1a37bac1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/2c135153a34652ed.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr b/test-lcm/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr new file mode 100644 index 0000000000..29d5d8db62 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/2d300368c9082831.xdr b/test-lcm/FrozenLedgerKeysTests/2d300368c9082831.xdr new file mode 100644 index 0000000000..19621e1709 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/2d300368c9082831.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr b/test-lcm/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr new file mode 100644 index 0000000000..aed53529b5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/33d3622012e7482d.xdr b/test-lcm/FrozenLedgerKeysTests/33d3622012e7482d.xdr new file mode 100644 index 0000000000..2a4ebccb99 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/33d3622012e7482d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/352575440c65c590.xdr b/test-lcm/FrozenLedgerKeysTests/352575440c65c590.xdr new file mode 100644 index 0000000000..6669bfc728 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/352575440c65c590.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/37c2d3c744db057c.xdr b/test-lcm/FrozenLedgerKeysTests/37c2d3c744db057c.xdr new file mode 100644 index 0000000000..a58d524879 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/37c2d3c744db057c.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr b/test-lcm/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr new file mode 100644 index 0000000000..f0148d9444 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/395da6fd76d7d649.xdr b/test-lcm/FrozenLedgerKeysTests/395da6fd76d7d649.xdr new file mode 100644 index 0000000000..a5353c7dd4 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/395da6fd76d7d649.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr b/test-lcm/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr new file mode 100644 index 0000000000..26327ba65c Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr b/test-lcm/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr b/test-lcm/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr new file mode 100644 index 0000000000..871f3a950d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr b/test-lcm/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr new file mode 100644 index 0000000000..cfb6911626 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/3e53ab37c0265962.xdr b/test-lcm/FrozenLedgerKeysTests/3e53ab37c0265962.xdr new file mode 100644 index 0000000000..f4e2b0963d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/3e53ab37c0265962.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr b/test-lcm/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr new file mode 100644 index 0000000000..4cebd44bb9 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr b/test-lcm/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr new file mode 100644 index 0000000000..fb1fa0d7aa Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/59ef7f546d376c85.xdr b/test-lcm/FrozenLedgerKeysTests/59ef7f546d376c85.xdr new file mode 100644 index 0000000000..c97ee3bba1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/59ef7f546d376c85.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/5b465c56327dab17.xdr b/test-lcm/FrozenLedgerKeysTests/5b465c56327dab17.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/5b465c56327dab17.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr b/test-lcm/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/5e98f6024777fd63.xdr b/test-lcm/FrozenLedgerKeysTests/5e98f6024777fd63.xdr new file mode 100644 index 0000000000..d052f0bdd5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/5e98f6024777fd63.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/5f5d524416da196a.xdr b/test-lcm/FrozenLedgerKeysTests/5f5d524416da196a.xdr new file mode 100644 index 0000000000..bd0f8467a1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/5f5d524416da196a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr b/test-lcm/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr new file mode 100644 index 0000000000..8c52fc98f3 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/61a97d20a77d2460.xdr b/test-lcm/FrozenLedgerKeysTests/61a97d20a77d2460.xdr new file mode 100644 index 0000000000..f4e2b0963d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/61a97d20a77d2460.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/66bd677986a05b7d.xdr b/test-lcm/FrozenLedgerKeysTests/66bd677986a05b7d.xdr new file mode 100644 index 0000000000..0717396347 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/66bd677986a05b7d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr b/test-lcm/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr new file mode 100644 index 0000000000..e053cca732 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/6a558ed58db514ee.xdr b/test-lcm/FrozenLedgerKeysTests/6a558ed58db514ee.xdr new file mode 100644 index 0000000000..0edc178191 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/6a558ed58db514ee.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr b/test-lcm/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr new file mode 100644 index 0000000000..67fd05a67a Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/6c91038331995c3f.xdr b/test-lcm/FrozenLedgerKeysTests/6c91038331995c3f.xdr new file mode 100644 index 0000000000..bc57fe7e89 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/6c91038331995c3f.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr b/test-lcm/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr new file mode 100644 index 0000000000..68dd63d196 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr b/test-lcm/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr new file mode 100644 index 0000000000..5e40b45947 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr b/test-lcm/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr new file mode 100644 index 0000000000..dc8f311705 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7832644d33f07016.xdr b/test-lcm/FrozenLedgerKeysTests/7832644d33f07016.xdr new file mode 100644 index 0000000000..88d02c01e2 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7832644d33f07016.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr b/test-lcm/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr new file mode 100644 index 0000000000..128530cd4d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr b/test-lcm/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr new file mode 100644 index 0000000000..37e36391ca Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr b/test-lcm/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr new file mode 100644 index 0000000000..0c6fbf219c Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr b/test-lcm/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr b/test-lcm/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr new file mode 100644 index 0000000000..694de8ff16 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/82e842e08727efde.xdr b/test-lcm/FrozenLedgerKeysTests/82e842e08727efde.xdr new file mode 100644 index 0000000000..fd3f354e26 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/82e842e08727efde.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr b/test-lcm/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr new file mode 100644 index 0000000000..20eb0f7d35 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/88686096bda31fb9.xdr b/test-lcm/FrozenLedgerKeysTests/88686096bda31fb9.xdr new file mode 100644 index 0000000000..2549b85a03 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/88686096bda31fb9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/8b16614bc082b932.xdr b/test-lcm/FrozenLedgerKeysTests/8b16614bc082b932.xdr new file mode 100644 index 0000000000..930efad3b5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/8b16614bc082b932.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/90d52c9f9531509f.xdr b/test-lcm/FrozenLedgerKeysTests/90d52c9f9531509f.xdr new file mode 100644 index 0000000000..a62f5cbea6 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/90d52c9f9531509f.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/92c3ac2898780b73.xdr b/test-lcm/FrozenLedgerKeysTests/92c3ac2898780b73.xdr new file mode 100644 index 0000000000..104461939c Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/92c3ac2898780b73.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr b/test-lcm/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr new file mode 100644 index 0000000000..fd04038aee Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/95c3de7b21facafb.xdr b/test-lcm/FrozenLedgerKeysTests/95c3de7b21facafb.xdr new file mode 100644 index 0000000000..9bff25d739 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/95c3de7b21facafb.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/968502a58dcf1de3.xdr b/test-lcm/FrozenLedgerKeysTests/968502a58dcf1de3.xdr new file mode 100644 index 0000000000..e6013bb709 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/968502a58dcf1de3.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/971412d60c95c2db.xdr b/test-lcm/FrozenLedgerKeysTests/971412d60c95c2db.xdr new file mode 100644 index 0000000000..5d457cff8b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/971412d60c95c2db.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr b/test-lcm/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr new file mode 100644 index 0000000000..b9f76f050a Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr b/test-lcm/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr new file mode 100644 index 0000000000..8af605940e Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9b73d1cab44af790.xdr b/test-lcm/FrozenLedgerKeysTests/9b73d1cab44af790.xdr new file mode 100644 index 0000000000..0b4cf89eb0 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9b73d1cab44af790.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9de21df1739fe25b.xdr b/test-lcm/FrozenLedgerKeysTests/9de21df1739fe25b.xdr new file mode 100644 index 0000000000..9222e7ddbb Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9de21df1739fe25b.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr b/test-lcm/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9f45874d5e43989d.xdr b/test-lcm/FrozenLedgerKeysTests/9f45874d5e43989d.xdr new file mode 100644 index 0000000000..9449ac2817 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9f45874d5e43989d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr b/test-lcm/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr new file mode 100644 index 0000000000..0986f151ca Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr b/test-lcm/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr new file mode 100644 index 0000000000..257877f977 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr b/test-lcm/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr new file mode 100644 index 0000000000..d04bfc81f4 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a6cf4357be0adade.xdr b/test-lcm/FrozenLedgerKeysTests/a6cf4357be0adade.xdr new file mode 100644 index 0000000000..f4e2b0963d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a6cf4357be0adade.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a7277d96a361ea72.xdr b/test-lcm/FrozenLedgerKeysTests/a7277d96a361ea72.xdr new file mode 100644 index 0000000000..3c354a4eea Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a7277d96a361ea72.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr b/test-lcm/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr new file mode 100644 index 0000000000..551421880b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr b/test-lcm/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/a99193a97590525a.xdr b/test-lcm/FrozenLedgerKeysTests/a99193a97590525a.xdr new file mode 100644 index 0000000000..30eb1beeda Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/a99193a97590525a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr b/test-lcm/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr new file mode 100644 index 0000000000..f4d7b21e58 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b0eee42015a2800e.xdr b/test-lcm/FrozenLedgerKeysTests/b0eee42015a2800e.xdr new file mode 100644 index 0000000000..efd221d64f Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b0eee42015a2800e.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr b/test-lcm/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr new file mode 100644 index 0000000000..c3eff7f14e Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr b/test-lcm/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr new file mode 100644 index 0000000000..a764221790 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b56fb200a9935407.xdr b/test-lcm/FrozenLedgerKeysTests/b56fb200a9935407.xdr new file mode 100644 index 0000000000..6db837cb4e Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b56fb200a9935407.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr b/test-lcm/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr new file mode 100644 index 0000000000..3021fc8b53 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr b/test-lcm/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr new file mode 100644 index 0000000000..81bcd476a0 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr b/test-lcm/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr new file mode 100644 index 0000000000..f95ba9f689 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr b/test-lcm/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr new file mode 100644 index 0000000000..4f7a61c4b1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr b/test-lcm/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/c56e571da1b376c9.xdr b/test-lcm/FrozenLedgerKeysTests/c56e571da1b376c9.xdr new file mode 100644 index 0000000000..7880d07e88 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/c56e571da1b376c9.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/c981497abd448c3f.xdr b/test-lcm/FrozenLedgerKeysTests/c981497abd448c3f.xdr new file mode 100644 index 0000000000..c18ffd2ca5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/c981497abd448c3f.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr b/test-lcm/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr b/test-lcm/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr new file mode 100644 index 0000000000..f61e56dfa5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr b/test-lcm/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr new file mode 100644 index 0000000000..93f79b0d54 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr b/test-lcm/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr new file mode 100644 index 0000000000..295daa9246 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr b/test-lcm/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr new file mode 100644 index 0000000000..f64508c4bb Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr b/test-lcm/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr new file mode 100644 index 0000000000..e365c6f95a Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr b/test-lcm/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr new file mode 100644 index 0000000000..798ce3da83 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr b/test-lcm/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr new file mode 100644 index 0000000000..9c5679290b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr b/test-lcm/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr new file mode 100644 index 0000000000..46249d97f7 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d9197ac0364b429d.xdr b/test-lcm/FrozenLedgerKeysTests/d9197ac0364b429d.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d9197ac0364b429d.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr b/test-lcm/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr new file mode 100644 index 0000000000..ca13650156 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr b/test-lcm/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr new file mode 100644 index 0000000000..ef32a4d187 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr b/test-lcm/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr new file mode 100644 index 0000000000..8e7c0fba9d Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr b/test-lcm/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr new file mode 100644 index 0000000000..fd8a2a0295 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr b/test-lcm/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr new file mode 100644 index 0000000000..ea8e5e6d6b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr b/test-lcm/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr new file mode 100644 index 0000000000..4f7a61c4b1 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr b/test-lcm/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr new file mode 100644 index 0000000000..c7300d4e02 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr b/test-lcm/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr new file mode 100644 index 0000000000..5a347159a5 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f4bb246ec9780039.xdr b/test-lcm/FrozenLedgerKeysTests/f4bb246ec9780039.xdr new file mode 100644 index 0000000000..c6874aad2b Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f4bb246ec9780039.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr b/test-lcm/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr new file mode 100644 index 0000000000..d4dc19f816 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr b/test-lcm/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr new file mode 100644 index 0000000000..5586728ebd Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f790a9565ea4b914.xdr b/test-lcm/FrozenLedgerKeysTests/f790a9565ea4b914.xdr new file mode 100644 index 0000000000..8cc1e26b61 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f790a9565ea4b914.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr b/test-lcm/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr new file mode 100644 index 0000000000..8e4831ddae Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/f84821960123588e.xdr b/test-lcm/FrozenLedgerKeysTests/f84821960123588e.xdr new file mode 100644 index 0000000000..9b87770ca7 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/f84821960123588e.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr b/test-lcm/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr new file mode 100644 index 0000000000..d66b31cc80 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/fe99942900ae7d38.xdr b/test-lcm/FrozenLedgerKeysTests/fe99942900ae7d38.xdr new file mode 100644 index 0000000000..2f8f0bb036 Binary files /dev/null and b/test-lcm/FrozenLedgerKeysTests/fe99942900ae7d38.xdr differ diff --git a/test-lcm/FrozenLedgerKeysTests/index.json b/test-lcm/FrozenLedgerKeysTests/index.json new file mode 100644 index 0000000000..a1aa219356 --- /dev/null +++ b/test-lcm/FrozenLedgerKeysTests/index.json @@ -0,0 +1,120 @@ +{ + "0130d32614dbc252" : "source_trustline_frozen-ManageSellOffer_selling_trustline_frozen", + "0269778d4c3c115b" : "source_trustline_frozen-ChangeTrustOp_trustline_frozen", + "03768f1cbe0eed0d" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-native][selling-frozen]", + "0450c26d5d536a6e" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][native-credit][selling-frozen]", + "05d2d1b6ad2f25b9" : "source_trustline_frozen-CreateClaimableBalance_source_trustline_frozen", + "09bc2d8793dcee32" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-credit][buying-frozen]", + "0ee7224ee3fe8e71" : "operation_destination_frozen-CreateAccountOp_destination_account_frozen", + "0feb6c306147fd3a" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-credit][both-frozen]", + "104f5d62fa026b98" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=2][selling-frozen]", + "11196eb4ceadfd80" : "source_account_frozen-tx_source_AND_destination_both_frozen", + "12a1f394aac5f093" : "operation_destination_frozen-PaymentOp_destination_trustline_frozen", + "12dc44e49c5507a9" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=0][buying-frozen]", + "137b73a35107c4c5" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-credit][selling-frozen]", + "1c2cdf10f2e47111" : "operation_destination_frozen-AllowTrustOp_trustor_trustline_frozen", + "1d6ae312fba487bb" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-native][both-frozen]", + "1e016cd08d89d64c" : "frozen_ledger_keys_in_Soroban_footprint", + "22c18bc7dafd431d" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=1][buying-frozen]", + "233d74d8369feacb" : "source_account_frozen-tx_source_frozen_via_muxed_account_ID", + "27e094a33ea270ce" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-credit][buying-frozen]", + "2c135153a34652ed" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-native][both-frozen]", + "2cc7de6ca7052b69" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-native][both-frozen]", + "2d300368c9082831" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=0][both-frozen]", + "2ecd5ac1d64a632a" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-bypass_frozen_tx_source_account_in_regular_tx", + "33d3622012e7482d" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][native-credit][buying-frozen]", + "352575440c65c590" : "source_account_frozen-unfreeze_restores_tx_validity", + "37c2d3c744db057c" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=2][buying-frozen]", + "37dc6f1b853351d3" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=2][both-frozen]", + "395da6fd76d7d649" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][native-credit][buying-frozen]", + "3d6e5e32a6b48567" : "source_account_frozen-op_source_frozen_via_muxed_account_ID", + "3dc9dab4e5a340ba" : "source_trustline_frozen-PathPaymentStrictSend_sendAsset_trustline_frozen", + "3dd2b1f80c573d23" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=1][selling-frozen]", + "3dd600739a73c9cd" : "frozen_ledger_keys_apply_time_validation-liquidity_pool_deposit_assetA_trustline_frozen", + "3e53ab37c0265962" : "source_trustline_frozen-ManageSellOffer_buying_trustline_frozen", + "4e7a95b40ba45ec4" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][native-credit][selling-frozen]", + "4f462cc49f7a3568" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-credit][both-frozen]", + "59ef7f546d376c85" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-credit][selling-frozen]", + "5b465c56327dab17" : "operation_destination_frozen-RevokeSponsorshipOp_ledger_key_frozen", + "5dd915bcf807a0c3" : "operation_destination_frozen-RevokeSponsorshipOp_signer_account_frozen", + "5e98f6024777fd63" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][native-credit][buying-frozen]", + "5f5d524416da196a" : "source_account_frozen-one_of_multiple_ops_source_account_frozen", + "5f9dc515f9af2b30" : "sponsorship_can_be_removed_with_frozen_sponsor", + "61a97d20a77d2460" : "source_trustline_frozen-CreatePassiveSellOffer_buying_trustline_frozen", + "66bd677986a05b7d" : "frozen_ledger_keys_apply_time_validation-claim_claimable_balance_trustline_frozen", + "693594ca2a8ed1db" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=1][both-frozen]", + "6a558ed58db514ee" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-credit][both-frozen]", + "6a5abe9a6365c9b2" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-native][buying-frozen]", + "6c91038331995c3f" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][native-credit][buying-frozen]", + "6fa3cd786ce04dd9" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-credit][selling-frozen]", + "6fae3a68c806ec2d" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][native-credit][both-frozen]", + "74c8bfeabe26560a" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-native][buying-frozen]", + "7832644d33f07016" : "frozen_ledger_keys_apply_time_validation-liquidity_pool_withdraw_assetB_trustline_frozen", + "7c60bd0a8e0d39a0" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-credit][both-frozen]", + "7d4cbe380503bd78" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][native-credit][both-frozen]", + "7e60b33e97cf0d0a" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][native-credit][buying-frozen]", + "7e9cb3eb7498b526" : "source_trustline_frozen-PathPaymentStrictReceive_sendAsset_trustline_frozen", + "7ea017ea5bfde3f5" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=0][selling-frozen]", + "82e842e08727efde" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-credit][selling-frozen]", + "84cef76b68d93cc9" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-native][buying-frozen]", + "88686096bda31fb9" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-native][selling-frozen]", + "8b16614bc082b932" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][native-credit][selling-frozen]", + "90d52c9f9531509f" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-credit][buying-frozen]", + "92c3ac2898780b73" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][native-credit][both-frozen]", + "94dfaaeec842ae02" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-native][selling-frozen]", + "95c3de7b21facafb" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=1][selling-frozen]", + "968502a58dcf1de3" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-credit][selling-frozen]", + "971412d60c95c2db" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=0][buying-frozen]", + "97b646ed2e8eda2c" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-native][both-frozen]", + "97d8d6bf78ee1cbb" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-native][buying-frozen]", + "9b73d1cab44af790" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][native-credit][both-frozen]", + "9de21df1739fe25b" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-native][both-frozen]", + "9f2fb4fd2d09521f" : "source_trustline_frozen-ManageBuyOffer_selling_trustline_frozen", + "9f45874d5e43989d" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-credit][buying-frozen]", + "9fdee40b4a6bf39b" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][credit-credit][buying-frozen]", + "9ffa8716dcb286c0" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-credit][both-frozen]", + "a52d069eff3b6fc1" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][native-credit][selling-frozen]", + "a6cf4357be0adade" : "source_trustline_frozen-ManageBuyOffer_buying_trustline_frozen", + "a7277d96a361ea72" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=1][buying-frozen]", + "a83e38c7dc6324a6" : "frozen_ledger_keys_apply_time_validation-liquidity_pool_withdraw_assetA_trustline_frozen", + "a90b9e3d0747fc24" : "operation_destination_frozen-PathPaymentStrictSend_native_destination_account_frozen", + "a99193a97590525a" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=0][selling-frozen]", + "aed719c9f3cffe43" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-buy][native-credit][both-frozen]", + "b0eee42015a2800e" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][native-credit][selling-frozen]", + "b1412f5ef3c6844a" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-bypass_frozen_key_accessed_by_operation_in_fee_bump_inner_tx", + "b17d186e3b574cc9" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-inner_tx_hash_does_not_bypass_frozen_fee_bump_source", + "b56fb200a9935407" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][native-credit][both-frozen]", + "b76397dcb0e46f93" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=1][both-frozen]", + "b871f9e66b3df4a4" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-bypass_frozen_fee_bump_source_account", + "be86f12c1a3c4428" : "source_account_frozen-tx_source_account_frozen", + "bf172f61f0f1bf37" : "operation_destination_frozen-PathPaymentStrictSend_destination_trustline_frozen", + "c1da25bdd5f37532" : "source_trustline_frozen-PaymentOp_source_trustline_frozen", + "c56e571da1b376c9" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][credit-credit][both-frozen]", + "c981497abd448c3f" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-native][both-frozen]", + "cbfd70c53b96ff0c" : "operation_destination_frozen-PaymentOp_native_destination_account_frozen", + "cd95267fadf7bb22" : "operation_destination_frozen-SetTrustLineFlagsOp_trustor_trustline_frozen", + "ce3d2b256f805a34" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-bypass_frozen_inner_tx_source_account_in_fee_bump", + "cfbae9c5c8b66206" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][credit-credit][selling-frozen]", + "d4abe4b07bba98dd" : "operation_destination_frozen-ClawbackOp_from_trustline_frozen", + "d55bb5b0991f7f30" : "frozen_ledger_keys_apply_time_validation-liquidity_pool_deposit_assetB_trustline_frozen", + "d62a40e1e6c94407" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-native][selling-frozen]", + "d7889dabf9db8ae0" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-send][leg=2][buying-frozen]", + "d8ed7e56f9a5fa9a" : "deauth_removes_offers_on_frozen_account", + "d9197ac0364b429d" : "operation_destination_frozen-PathPaymentStrictReceive_native_destination_account_frozen", + "d9a26f74c76ec5fe" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[create-passive-sell][native-credit][selling-frozen]", + "dda5baf59d9d24fa" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-native][buying-frozen]", + "dfaa9a4ba1d5bac8" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-sell][credit-credit][buying-frozen]", + "e54f97e007f28f3a" : "freeze_bypass_tx_hash_allows_frozen_key_access_at_validation_time-bypass_frozen_key_accessed_by_operation_in_regular_tx", + "eb07a254c1f6d187" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-native][selling-frozen]", + "eb5978da5a37cd47" : "operation_destination_frozen-PathPaymentStrictReceive_destination_trustline_frozen", + "f00ec39cd6781faf" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=2][both-frozen]", + "f1c47fc06e54b090" : "frozen_ledger_keys_DEX_offer_operations-second_offer_active_[manage-buy][credit-native][selling-frozen]", + "f4bb246ec9780039" : "source_account_frozen-op_source_account_frozen", + "f58a584ef5d545bb" : "source_trustline_frozen-CreatePassiveSellOffer_selling_trustline_frozen", + "f5cc954b49f207f0" : "source_account_frozen-fee_bump_source_account_frozen", + "f790a9565ea4b914" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[manage-sell][credit-native][buying-frozen]", + "f792ea98a5b2057e" : "operation_destination_frozen-AccountMergeOp_destination_account_frozen", + "f84821960123588e" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=2][selling-frozen]", + "fd5da6cc6e5623a5" : "frozen_ledger_keys_DEX_path_payments-A--B--C--A_[path-strict-receive][leg=0][both-frozen]", + "fe99942900ae7d38" : "frozen_ledger_keys_DEX_offer_operations-second_offer_frozen_[create-passive-sell][native-credit][buying-frozen]" +} diff --git a/test-lcm/InvokeHostFunctionTests/0046300f950c0211.xdr b/test-lcm/InvokeHostFunctionTests/0046300f950c0211.xdr new file mode 100644 index 0000000000..a2d042e92c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0046300f950c0211.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/00e76ef8f869401f.xdr b/test-lcm/InvokeHostFunctionTests/00e76ef8f869401f.xdr new file mode 100644 index 0000000000..57d70d2ab9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/00e76ef8f869401f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr b/test-lcm/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/018599ef4068218e.xdr b/test-lcm/InvokeHostFunctionTests/018599ef4068218e.xdr new file mode 100644 index 0000000000..505afffdbf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/018599ef4068218e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/03560ea94d548ceb.xdr b/test-lcm/InvokeHostFunctionTests/03560ea94d548ceb.xdr new file mode 100644 index 0000000000..7e336db377 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/03560ea94d548ceb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr b/test-lcm/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/03df1dc73d71eb00.xdr b/test-lcm/InvokeHostFunctionTests/03df1dc73d71eb00.xdr new file mode 100644 index 0000000000..a753f79a58 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/03df1dc73d71eb00.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/04530f6112a41176.xdr b/test-lcm/InvokeHostFunctionTests/04530f6112a41176.xdr new file mode 100644 index 0000000000..c7a714c884 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/04530f6112a41176.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/048c93e37abb62ea.xdr b/test-lcm/InvokeHostFunctionTests/048c93e37abb62ea.xdr new file mode 100644 index 0000000000..5e48ba2d46 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/048c93e37abb62ea.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/04b00b08d10222a3.xdr b/test-lcm/InvokeHostFunctionTests/04b00b08d10222a3.xdr new file mode 100644 index 0000000000..e7736f9e92 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/04b00b08d10222a3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0525df1061c74b13.xdr b/test-lcm/InvokeHostFunctionTests/0525df1061c74b13.xdr new file mode 100644 index 0000000000..832cfb519d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0525df1061c74b13.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0540c58d02f9c06b.xdr b/test-lcm/InvokeHostFunctionTests/0540c58d02f9c06b.xdr new file mode 100644 index 0000000000..dcd1cdac26 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0540c58d02f9c06b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/068bb21d88974e0d.xdr b/test-lcm/InvokeHostFunctionTests/068bb21d88974e0d.xdr new file mode 100644 index 0000000000..166a576a88 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/068bb21d88974e0d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr b/test-lcm/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0718f219d05d95c5.xdr b/test-lcm/InvokeHostFunctionTests/0718f219d05d95c5.xdr new file mode 100644 index 0000000000..92bc4e7a06 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0718f219d05d95c5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/075b4bea01d35444.xdr b/test-lcm/InvokeHostFunctionTests/075b4bea01d35444.xdr new file mode 100644 index 0000000000..1989e59f49 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/075b4bea01d35444.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/07c78b13b19c1cca.xdr b/test-lcm/InvokeHostFunctionTests/07c78b13b19c1cca.xdr new file mode 100644 index 0000000000..15241f42e8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/07c78b13b19c1cca.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/091f6d22b48f7501.xdr b/test-lcm/InvokeHostFunctionTests/091f6d22b48f7501.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/091f6d22b48f7501.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0969395bd2bae61c.xdr b/test-lcm/InvokeHostFunctionTests/0969395bd2bae61c.xdr new file mode 100644 index 0000000000..567ba8821c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0969395bd2bae61c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/09b571acb76aa819.xdr b/test-lcm/InvokeHostFunctionTests/09b571acb76aa819.xdr new file mode 100644 index 0000000000..1ac2b14622 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/09b571acb76aa819.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/09e3525781c1197d.xdr b/test-lcm/InvokeHostFunctionTests/09e3525781c1197d.xdr new file mode 100644 index 0000000000..33db6fdbb0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/09e3525781c1197d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/09efa855e6310bd6.xdr b/test-lcm/InvokeHostFunctionTests/09efa855e6310bd6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/09efa855e6310bd6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0a490b46a65b3382.xdr b/test-lcm/InvokeHostFunctionTests/0a490b46a65b3382.xdr new file mode 100644 index 0000000000..fd55cba790 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0a490b46a65b3382.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0a50a6fd01fac663.xdr b/test-lcm/InvokeHostFunctionTests/0a50a6fd01fac663.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0a50a6fd01fac663.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0a5c74765d1481ad.xdr b/test-lcm/InvokeHostFunctionTests/0a5c74765d1481ad.xdr new file mode 100644 index 0000000000..f9a0528ff8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0a5c74765d1481ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr b/test-lcm/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr new file mode 100644 index 0000000000..f90f132ef5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr b/test-lcm/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr b/test-lcm/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr new file mode 100644 index 0000000000..34d0e732ce Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0c35da322a33f3c2.xdr b/test-lcm/InvokeHostFunctionTests/0c35da322a33f3c2.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0c35da322a33f3c2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0c43ba995c341a31.xdr b/test-lcm/InvokeHostFunctionTests/0c43ba995c341a31.xdr new file mode 100644 index 0000000000..19b4185ef3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0c43ba995c341a31.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr b/test-lcm/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr new file mode 100644 index 0000000000..63a2e3e3ef Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0cb06b7800ce099c.xdr b/test-lcm/InvokeHostFunctionTests/0cb06b7800ce099c.xdr new file mode 100644 index 0000000000..ac080ab02d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0cb06b7800ce099c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr b/test-lcm/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0d6e850f5668faef.xdr b/test-lcm/InvokeHostFunctionTests/0d6e850f5668faef.xdr new file mode 100644 index 0000000000..9e031b52b3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0d6e850f5668faef.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0e54ece7b7219a81.xdr b/test-lcm/InvokeHostFunctionTests/0e54ece7b7219a81.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0e54ece7b7219a81.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0f52e3b7b517991a.xdr b/test-lcm/InvokeHostFunctionTests/0f52e3b7b517991a.xdr new file mode 100644 index 0000000000..b2694f9d16 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0f52e3b7b517991a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/0f97452228eac10a.xdr b/test-lcm/InvokeHostFunctionTests/0f97452228eac10a.xdr new file mode 100644 index 0000000000..c307392f7e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/0f97452228eac10a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/102ec8047ba9b73e.xdr b/test-lcm/InvokeHostFunctionTests/102ec8047ba9b73e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/102ec8047ba9b73e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/11caaacc02cfaf33.xdr b/test-lcm/InvokeHostFunctionTests/11caaacc02cfaf33.xdr new file mode 100644 index 0000000000..a3b09233f9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/11caaacc02cfaf33.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/11db6d39fd0eae58.xdr b/test-lcm/InvokeHostFunctionTests/11db6d39fd0eae58.xdr new file mode 100644 index 0000000000..a1b9837f11 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/11db6d39fd0eae58.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/12400eda8720567b.xdr b/test-lcm/InvokeHostFunctionTests/12400eda8720567b.xdr new file mode 100644 index 0000000000..6c19b566ce Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/12400eda8720567b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/12e5bf578c813325.xdr b/test-lcm/InvokeHostFunctionTests/12e5bf578c813325.xdr new file mode 100644 index 0000000000..6cacd2b1c2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/12e5bf578c813325.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/133235aeb624b4fb.xdr b/test-lcm/InvokeHostFunctionTests/133235aeb624b4fb.xdr new file mode 100644 index 0000000000..d8ed55ca18 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/133235aeb624b4fb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/13ddfbcd91340230.xdr b/test-lcm/InvokeHostFunctionTests/13ddfbcd91340230.xdr new file mode 100644 index 0000000000..6e5eff8d7c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/13ddfbcd91340230.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/13f416a9b53c779a.xdr b/test-lcm/InvokeHostFunctionTests/13f416a9b53c779a.xdr new file mode 100644 index 0000000000..f242cbeffb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/13f416a9b53c779a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/14407acab9b18289.xdr b/test-lcm/InvokeHostFunctionTests/14407acab9b18289.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/14407acab9b18289.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr b/test-lcm/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr new file mode 100644 index 0000000000..b20a08916c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1484cd9b56513ed7.xdr b/test-lcm/InvokeHostFunctionTests/1484cd9b56513ed7.xdr new file mode 100644 index 0000000000..fb05d84187 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1484cd9b56513ed7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/15bc83b6792d6072.xdr b/test-lcm/InvokeHostFunctionTests/15bc83b6792d6072.xdr new file mode 100644 index 0000000000..99469f74e6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/15bc83b6792d6072.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/15ecaba55fd111cc.xdr b/test-lcm/InvokeHostFunctionTests/15ecaba55fd111cc.xdr new file mode 100644 index 0000000000..4becc18d8d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/15ecaba55fd111cc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr b/test-lcm/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr new file mode 100644 index 0000000000..cb29507295 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/165a1612aefb1f12.xdr b/test-lcm/InvokeHostFunctionTests/165a1612aefb1f12.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/165a1612aefb1f12.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/169611b4e9b946c9.xdr b/test-lcm/InvokeHostFunctionTests/169611b4e9b946c9.xdr new file mode 100644 index 0000000000..3052fde7ea Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/169611b4e9b946c9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr b/test-lcm/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr new file mode 100644 index 0000000000..32964509db Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/16bac056666df725.xdr b/test-lcm/InvokeHostFunctionTests/16bac056666df725.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/16bac056666df725.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/192dc34906478ab9.xdr b/test-lcm/InvokeHostFunctionTests/192dc34906478ab9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/192dc34906478ab9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/193297e2240649fc.xdr b/test-lcm/InvokeHostFunctionTests/193297e2240649fc.xdr new file mode 100644 index 0000000000..116a989110 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/193297e2240649fc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1967a2d9962bb619.xdr b/test-lcm/InvokeHostFunctionTests/1967a2d9962bb619.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1967a2d9962bb619.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/198ad94ac0412a8b.xdr b/test-lcm/InvokeHostFunctionTests/198ad94ac0412a8b.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/198ad94ac0412a8b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr b/test-lcm/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr b/test-lcm/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1b18e4016bfdf294.xdr b/test-lcm/InvokeHostFunctionTests/1b18e4016bfdf294.xdr new file mode 100644 index 0000000000..92bbfc0610 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1b18e4016bfdf294.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1c3d83a0318651b9.xdr b/test-lcm/InvokeHostFunctionTests/1c3d83a0318651b9.xdr new file mode 100644 index 0000000000..fd1a8d7bd5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1c3d83a0318651b9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1d5bfe4be2ebaacb.xdr b/test-lcm/InvokeHostFunctionTests/1d5bfe4be2ebaacb.xdr new file mode 100644 index 0000000000..eafcdba84a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1d5bfe4be2ebaacb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1d8e86ddd8b11e7b.xdr b/test-lcm/InvokeHostFunctionTests/1d8e86ddd8b11e7b.xdr new file mode 100644 index 0000000000..2a3ece69dc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1d8e86ddd8b11e7b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr b/test-lcm/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr new file mode 100644 index 0000000000..3fb84d2ae7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1e0b81121b9c895c.xdr b/test-lcm/InvokeHostFunctionTests/1e0b81121b9c895c.xdr new file mode 100644 index 0000000000..4472f71b5f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1e0b81121b9c895c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr b/test-lcm/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr new file mode 100644 index 0000000000..9cf443171d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1ec1111288c846ad.xdr b/test-lcm/InvokeHostFunctionTests/1ec1111288c846ad.xdr new file mode 100644 index 0000000000..c0abe3e276 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1ec1111288c846ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/1f62f6743bb52550.xdr b/test-lcm/InvokeHostFunctionTests/1f62f6743bb52550.xdr new file mode 100644 index 0000000000..3e2f450ac8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/1f62f6743bb52550.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2076a51f648569cd.xdr b/test-lcm/InvokeHostFunctionTests/2076a51f648569cd.xdr new file mode 100644 index 0000000000..86c7319b0e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2076a51f648569cd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/20868c9e218c2273.xdr b/test-lcm/InvokeHostFunctionTests/20868c9e218c2273.xdr new file mode 100644 index 0000000000..1c0fafda13 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/20868c9e218c2273.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/20a6a4892d5acc69.xdr b/test-lcm/InvokeHostFunctionTests/20a6a4892d5acc69.xdr new file mode 100644 index 0000000000..1b6f093366 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/20a6a4892d5acc69.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/20b9b462d5735ae2.xdr b/test-lcm/InvokeHostFunctionTests/20b9b462d5735ae2.xdr new file mode 100644 index 0000000000..42e83dc2ee Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/20b9b462d5735ae2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/20c2b0f439ace889.xdr b/test-lcm/InvokeHostFunctionTests/20c2b0f439ace889.xdr new file mode 100644 index 0000000000..d14b9bc0bd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/20c2b0f439ace889.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/211f4a93951f94b4.xdr b/test-lcm/InvokeHostFunctionTests/211f4a93951f94b4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/211f4a93951f94b4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/21938ae254995cd4.xdr b/test-lcm/InvokeHostFunctionTests/21938ae254995cd4.xdr new file mode 100644 index 0000000000..34895b9550 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/21938ae254995cd4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/21ac7793688994ad.xdr b/test-lcm/InvokeHostFunctionTests/21ac7793688994ad.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/21ac7793688994ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/21c43b92b819267f.xdr b/test-lcm/InvokeHostFunctionTests/21c43b92b819267f.xdr new file mode 100644 index 0000000000..012661aba8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/21c43b92b819267f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/21e553dd1071721a.xdr b/test-lcm/InvokeHostFunctionTests/21e553dd1071721a.xdr new file mode 100644 index 0000000000..21c730d107 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/21e553dd1071721a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/221f1cad327fb891.xdr b/test-lcm/InvokeHostFunctionTests/221f1cad327fb891.xdr new file mode 100644 index 0000000000..d940a05a38 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/221f1cad327fb891.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/227f785ddbb9ab40.xdr b/test-lcm/InvokeHostFunctionTests/227f785ddbb9ab40.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/227f785ddbb9ab40.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2287bf75d44d6db2.xdr b/test-lcm/InvokeHostFunctionTests/2287bf75d44d6db2.xdr new file mode 100644 index 0000000000..ffb56f6417 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2287bf75d44d6db2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr b/test-lcm/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr new file mode 100644 index 0000000000..74c73c2d86 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/22df21f5f58e57ba.xdr b/test-lcm/InvokeHostFunctionTests/22df21f5f58e57ba.xdr new file mode 100644 index 0000000000..9ecbec2a03 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/22df21f5f58e57ba.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr b/test-lcm/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/23733e3ae41a70ad.xdr b/test-lcm/InvokeHostFunctionTests/23733e3ae41a70ad.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/23733e3ae41a70ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/23900da58ed1ec25.xdr b/test-lcm/InvokeHostFunctionTests/23900da58ed1ec25.xdr new file mode 100644 index 0000000000..9f1d804d8e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/23900da58ed1ec25.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/23a89388bfb65808.xdr b/test-lcm/InvokeHostFunctionTests/23a89388bfb65808.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/23a89388bfb65808.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/246b195d9beac8d6.xdr b/test-lcm/InvokeHostFunctionTests/246b195d9beac8d6.xdr new file mode 100644 index 0000000000..9ae99e7c89 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/246b195d9beac8d6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/24bce78365780bb1.xdr b/test-lcm/InvokeHostFunctionTests/24bce78365780bb1.xdr new file mode 100644 index 0000000000..c7c5f59a32 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/24bce78365780bb1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/25e5dd2fc7614ea7.xdr b/test-lcm/InvokeHostFunctionTests/25e5dd2fc7614ea7.xdr new file mode 100644 index 0000000000..664b51d420 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/25e5dd2fc7614ea7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/266b724000b97eb7.xdr b/test-lcm/InvokeHostFunctionTests/266b724000b97eb7.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/266b724000b97eb7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2691da61cb031c32.xdr b/test-lcm/InvokeHostFunctionTests/2691da61cb031c32.xdr new file mode 100644 index 0000000000..e5b8de5532 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2691da61cb031c32.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/26fb40313adc084c.xdr b/test-lcm/InvokeHostFunctionTests/26fb40313adc084c.xdr new file mode 100644 index 0000000000..c8acfc126a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/26fb40313adc084c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2703a3e0e62612e8.xdr b/test-lcm/InvokeHostFunctionTests/2703a3e0e62612e8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2703a3e0e62612e8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/279b3ea1936ed91c.xdr b/test-lcm/InvokeHostFunctionTests/279b3ea1936ed91c.xdr new file mode 100644 index 0000000000..91b5eeeb76 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/279b3ea1936ed91c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/28480490bc8a3fae.xdr b/test-lcm/InvokeHostFunctionTests/28480490bc8a3fae.xdr new file mode 100644 index 0000000000..21bc7ac956 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/28480490bc8a3fae.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/285f5877a54deb4e.xdr b/test-lcm/InvokeHostFunctionTests/285f5877a54deb4e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/285f5877a54deb4e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/286138b521aa29ed.xdr b/test-lcm/InvokeHostFunctionTests/286138b521aa29ed.xdr new file mode 100644 index 0000000000..0add91b316 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/286138b521aa29ed.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr b/test-lcm/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr new file mode 100644 index 0000000000..1c7cc006d1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/293f7ed0e476294c.xdr b/test-lcm/InvokeHostFunctionTests/293f7ed0e476294c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/293f7ed0e476294c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr b/test-lcm/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr new file mode 100644 index 0000000000..9d2c80cc3a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2963054aff2cd923.xdr b/test-lcm/InvokeHostFunctionTests/2963054aff2cd923.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2963054aff2cd923.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/29b03d37cd3099be.xdr b/test-lcm/InvokeHostFunctionTests/29b03d37cd3099be.xdr new file mode 100644 index 0000000000..c0b13e88d1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/29b03d37cd3099be.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2ace299730fbdd52.xdr b/test-lcm/InvokeHostFunctionTests/2ace299730fbdd52.xdr new file mode 100644 index 0000000000..eda57bbc57 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2ace299730fbdd52.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2af87dc6245a802c.xdr b/test-lcm/InvokeHostFunctionTests/2af87dc6245a802c.xdr new file mode 100644 index 0000000000..c63b339f84 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2af87dc6245a802c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2b19e70a8b41485f.xdr b/test-lcm/InvokeHostFunctionTests/2b19e70a8b41485f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2b19e70a8b41485f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr b/test-lcm/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr new file mode 100644 index 0000000000..423989e60d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr b/test-lcm/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2d96d9114eebd574.xdr b/test-lcm/InvokeHostFunctionTests/2d96d9114eebd574.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2d96d9114eebd574.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr b/test-lcm/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2e0f619df17d9178.xdr b/test-lcm/InvokeHostFunctionTests/2e0f619df17d9178.xdr new file mode 100644 index 0000000000..31cfd61de9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2e0f619df17d9178.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr b/test-lcm/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2e93251358cac25c.xdr b/test-lcm/InvokeHostFunctionTests/2e93251358cac25c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2e93251358cac25c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr b/test-lcm/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr new file mode 100644 index 0000000000..05ef37013e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr b/test-lcm/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr new file mode 100644 index 0000000000..d2c24ac7d7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr b/test-lcm/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr new file mode 100644 index 0000000000..1fee358b0d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/303dce5b05111d4b.xdr b/test-lcm/InvokeHostFunctionTests/303dce5b05111d4b.xdr new file mode 100644 index 0000000000..14c529ec0f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/303dce5b05111d4b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/311f3f548207d5d6.xdr b/test-lcm/InvokeHostFunctionTests/311f3f548207d5d6.xdr new file mode 100644 index 0000000000..ce2f3163ae Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/311f3f548207d5d6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3152146ae3e1601f.xdr b/test-lcm/InvokeHostFunctionTests/3152146ae3e1601f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3152146ae3e1601f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/318b008d239ea9d8.xdr b/test-lcm/InvokeHostFunctionTests/318b008d239ea9d8.xdr new file mode 100644 index 0000000000..757df78a30 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/318b008d239ea9d8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3279e450f885436a.xdr b/test-lcm/InvokeHostFunctionTests/3279e450f885436a.xdr new file mode 100644 index 0000000000..623691a0ea Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3279e450f885436a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/329c8076e0ba5976.xdr b/test-lcm/InvokeHostFunctionTests/329c8076e0ba5976.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/329c8076e0ba5976.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/32e313f52f20cae1.xdr b/test-lcm/InvokeHostFunctionTests/32e313f52f20cae1.xdr new file mode 100644 index 0000000000..3a4a9def5c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/32e313f52f20cae1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3304ede4be3e7951.xdr b/test-lcm/InvokeHostFunctionTests/3304ede4be3e7951.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3304ede4be3e7951.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/333dd414de3cff58.xdr b/test-lcm/InvokeHostFunctionTests/333dd414de3cff58.xdr new file mode 100644 index 0000000000..5bf049247d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/333dd414de3cff58.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3344d57a6c44b645.xdr b/test-lcm/InvokeHostFunctionTests/3344d57a6c44b645.xdr new file mode 100644 index 0000000000..33192f4919 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3344d57a6c44b645.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr b/test-lcm/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr new file mode 100644 index 0000000000..be8190b391 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/33541948d53d210f.xdr b/test-lcm/InvokeHostFunctionTests/33541948d53d210f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/33541948d53d210f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/33f7502a4490dbc8.xdr b/test-lcm/InvokeHostFunctionTests/33f7502a4490dbc8.xdr new file mode 100644 index 0000000000..2a0a73d1c9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/33f7502a4490dbc8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr b/test-lcm/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr new file mode 100644 index 0000000000..d5e6263bbb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/35117649a10b863c.xdr b/test-lcm/InvokeHostFunctionTests/35117649a10b863c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/35117649a10b863c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/35b99a95ff36fd47.xdr b/test-lcm/InvokeHostFunctionTests/35b99a95ff36fd47.xdr new file mode 100644 index 0000000000..df54d531f2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/35b99a95ff36fd47.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/36193429a9fd13f9.xdr b/test-lcm/InvokeHostFunctionTests/36193429a9fd13f9.xdr new file mode 100644 index 0000000000..1c376b21bb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/36193429a9fd13f9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3670ca64370e86e7.xdr b/test-lcm/InvokeHostFunctionTests/3670ca64370e86e7.xdr new file mode 100644 index 0000000000..19b671cc1f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3670ca64370e86e7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/369cf252c2e22d4e.xdr b/test-lcm/InvokeHostFunctionTests/369cf252c2e22d4e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/369cf252c2e22d4e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/36cdfb826504ca41.xdr b/test-lcm/InvokeHostFunctionTests/36cdfb826504ca41.xdr new file mode 100644 index 0000000000..f1bad8c084 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/36cdfb826504ca41.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/36d1886765b0101c.xdr b/test-lcm/InvokeHostFunctionTests/36d1886765b0101c.xdr new file mode 100644 index 0000000000..db3fd2a457 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/36d1886765b0101c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/370b65bf45bf359a.xdr b/test-lcm/InvokeHostFunctionTests/370b65bf45bf359a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/370b65bf45bf359a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/372873b046d26a73.xdr b/test-lcm/InvokeHostFunctionTests/372873b046d26a73.xdr new file mode 100644 index 0000000000..8c07d779dd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/372873b046d26a73.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/375e418b328316a8.xdr b/test-lcm/InvokeHostFunctionTests/375e418b328316a8.xdr new file mode 100644 index 0000000000..753cc51022 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/375e418b328316a8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/38cfd148d6296478.xdr b/test-lcm/InvokeHostFunctionTests/38cfd148d6296478.xdr new file mode 100644 index 0000000000..df594a72e4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/38cfd148d6296478.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr b/test-lcm/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr new file mode 100644 index 0000000000..045cfe95d0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/394272a31b2f42f9.xdr b/test-lcm/InvokeHostFunctionTests/394272a31b2f42f9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/394272a31b2f42f9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/39cb1e990e856d1d.xdr b/test-lcm/InvokeHostFunctionTests/39cb1e990e856d1d.xdr new file mode 100644 index 0000000000..15cd440e43 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/39cb1e990e856d1d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr b/test-lcm/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr new file mode 100644 index 0000000000..56f1b8bfb9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr b/test-lcm/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3b0802ffb3b76400.xdr b/test-lcm/InvokeHostFunctionTests/3b0802ffb3b76400.xdr new file mode 100644 index 0000000000..e5a7ea30c1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3b0802ffb3b76400.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3c1ebb13484322b9.xdr b/test-lcm/InvokeHostFunctionTests/3c1ebb13484322b9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3c1ebb13484322b9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr b/test-lcm/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr new file mode 100644 index 0000000000..231a126c71 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3db91544d5ae2281.xdr b/test-lcm/InvokeHostFunctionTests/3db91544d5ae2281.xdr new file mode 100644 index 0000000000..3f46f175f3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3db91544d5ae2281.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3e658e0ecfc377ad.xdr b/test-lcm/InvokeHostFunctionTests/3e658e0ecfc377ad.xdr new file mode 100644 index 0000000000..263431c36e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3e658e0ecfc377ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr b/test-lcm/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr new file mode 100644 index 0000000000..c9e20e8a0a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr b/test-lcm/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr new file mode 100644 index 0000000000..3700b997a7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr b/test-lcm/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr new file mode 100644 index 0000000000..1b18d0beef Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr b/test-lcm/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr new file mode 100644 index 0000000000..d6973c4274 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr b/test-lcm/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr b/test-lcm/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr new file mode 100644 index 0000000000..e7653b5fde Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/416716038d1bf264.xdr b/test-lcm/InvokeHostFunctionTests/416716038d1bf264.xdr new file mode 100644 index 0000000000..071b24dd32 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/416716038d1bf264.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/41a75a802c103130.xdr b/test-lcm/InvokeHostFunctionTests/41a75a802c103130.xdr new file mode 100644 index 0000000000..67ba0aa0e2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/41a75a802c103130.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/432866f9e4658727.xdr b/test-lcm/InvokeHostFunctionTests/432866f9e4658727.xdr new file mode 100644 index 0000000000..f053ac6196 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/432866f9e4658727.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/43509a8017a394ec.xdr b/test-lcm/InvokeHostFunctionTests/43509a8017a394ec.xdr new file mode 100644 index 0000000000..e57e414ed3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/43509a8017a394ec.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/43aa6585c53544c0.xdr b/test-lcm/InvokeHostFunctionTests/43aa6585c53544c0.xdr new file mode 100644 index 0000000000..1d8476c290 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/43aa6585c53544c0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/43ab812359d242e5.xdr b/test-lcm/InvokeHostFunctionTests/43ab812359d242e5.xdr new file mode 100644 index 0000000000..8ac99ffd54 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/43ab812359d242e5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/43caed795b61ad7c.xdr b/test-lcm/InvokeHostFunctionTests/43caed795b61ad7c.xdr new file mode 100644 index 0000000000..2e31623667 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/43caed795b61ad7c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/43d0750bf32a8142.xdr b/test-lcm/InvokeHostFunctionTests/43d0750bf32a8142.xdr new file mode 100644 index 0000000000..337d14b5e5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/43d0750bf32a8142.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4403f2717365f3f1.xdr b/test-lcm/InvokeHostFunctionTests/4403f2717365f3f1.xdr new file mode 100644 index 0000000000..05700b3828 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4403f2717365f3f1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/444e7910e5721658.xdr b/test-lcm/InvokeHostFunctionTests/444e7910e5721658.xdr new file mode 100644 index 0000000000..5bada3ee26 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/444e7910e5721658.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/44aed0d0d619653f.xdr b/test-lcm/InvokeHostFunctionTests/44aed0d0d619653f.xdr new file mode 100644 index 0000000000..8c07d779dd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/44aed0d0d619653f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/44ed42af0c335da0.xdr b/test-lcm/InvokeHostFunctionTests/44ed42af0c335da0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/44ed42af0c335da0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/45bb7c67fa144f76.xdr b/test-lcm/InvokeHostFunctionTests/45bb7c67fa144f76.xdr new file mode 100644 index 0000000000..a77a04fa85 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/45bb7c67fa144f76.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/45fafb2b89af5af9.xdr b/test-lcm/InvokeHostFunctionTests/45fafb2b89af5af9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/45fafb2b89af5af9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/463cc045e4e770ef.xdr b/test-lcm/InvokeHostFunctionTests/463cc045e4e770ef.xdr new file mode 100644 index 0000000000..635673e0cd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/463cc045e4e770ef.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/46841d2f33918f97.xdr b/test-lcm/InvokeHostFunctionTests/46841d2f33918f97.xdr new file mode 100644 index 0000000000..528cfc1546 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/46841d2f33918f97.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/46bb33ad49f0924d.xdr b/test-lcm/InvokeHostFunctionTests/46bb33ad49f0924d.xdr new file mode 100644 index 0000000000..98fdb96524 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/46bb33ad49f0924d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/46bc30f464b80820.xdr b/test-lcm/InvokeHostFunctionTests/46bc30f464b80820.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/46bc30f464b80820.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/46ee08cbe6a5345e.xdr b/test-lcm/InvokeHostFunctionTests/46ee08cbe6a5345e.xdr new file mode 100644 index 0000000000..9b92588e1d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/46ee08cbe6a5345e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr b/test-lcm/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/472ac360b2cee870.xdr b/test-lcm/InvokeHostFunctionTests/472ac360b2cee870.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/472ac360b2cee870.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/47efc2a10557bd97.xdr b/test-lcm/InvokeHostFunctionTests/47efc2a10557bd97.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/47efc2a10557bd97.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr b/test-lcm/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr new file mode 100644 index 0000000000..522b5216af Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/485a9f1997660b04.xdr b/test-lcm/InvokeHostFunctionTests/485a9f1997660b04.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/485a9f1997660b04.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4876c2f30088ca20.xdr b/test-lcm/InvokeHostFunctionTests/4876c2f30088ca20.xdr new file mode 100644 index 0000000000..996beef6d1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4876c2f30088ca20.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/48c781bbceb21112.xdr b/test-lcm/InvokeHostFunctionTests/48c781bbceb21112.xdr new file mode 100644 index 0000000000..0c117bafd3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/48c781bbceb21112.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/490a163425465416.xdr b/test-lcm/InvokeHostFunctionTests/490a163425465416.xdr new file mode 100644 index 0000000000..6ae4730d4a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/490a163425465416.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/49689aae806682f8.xdr b/test-lcm/InvokeHostFunctionTests/49689aae806682f8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/49689aae806682f8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr b/test-lcm/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr new file mode 100644 index 0000000000..b24a278436 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr b/test-lcm/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr new file mode 100644 index 0000000000..387082ab60 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4a8c58a85988d163.xdr b/test-lcm/InvokeHostFunctionTests/4a8c58a85988d163.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4a8c58a85988d163.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr b/test-lcm/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr b/test-lcm/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4b4fde93869500d3.xdr b/test-lcm/InvokeHostFunctionTests/4b4fde93869500d3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4b4fde93869500d3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4b7e19f44373ff48.xdr b/test-lcm/InvokeHostFunctionTests/4b7e19f44373ff48.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4b7e19f44373ff48.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr b/test-lcm/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4c5cc01aded482f8.xdr b/test-lcm/InvokeHostFunctionTests/4c5cc01aded482f8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4c5cc01aded482f8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4cd30f7ebe173060.xdr b/test-lcm/InvokeHostFunctionTests/4cd30f7ebe173060.xdr new file mode 100644 index 0000000000..a51b7edc2b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4cd30f7ebe173060.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4db1a66114f8b194.xdr b/test-lcm/InvokeHostFunctionTests/4db1a66114f8b194.xdr new file mode 100644 index 0000000000..0ddfe1cc20 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4db1a66114f8b194.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4eaeadc112025f27.xdr b/test-lcm/InvokeHostFunctionTests/4eaeadc112025f27.xdr new file mode 100644 index 0000000000..c55100d430 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4eaeadc112025f27.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr b/test-lcm/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr b/test-lcm/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr new file mode 100644 index 0000000000..3db7e1db07 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/51616f70e97b17d5.xdr b/test-lcm/InvokeHostFunctionTests/51616f70e97b17d5.xdr new file mode 100644 index 0000000000..99bb708aa9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/51616f70e97b17d5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5171bdbde7eb7562.xdr b/test-lcm/InvokeHostFunctionTests/5171bdbde7eb7562.xdr new file mode 100644 index 0000000000..0ca1ba94fb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5171bdbde7eb7562.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/519ee0e221d13e7a.xdr b/test-lcm/InvokeHostFunctionTests/519ee0e221d13e7a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/519ee0e221d13e7a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/51e36c475d33d2bb.xdr b/test-lcm/InvokeHostFunctionTests/51e36c475d33d2bb.xdr new file mode 100644 index 0000000000..9768133722 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/51e36c475d33d2bb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/51f0bd683d0d5829.xdr b/test-lcm/InvokeHostFunctionTests/51f0bd683d0d5829.xdr new file mode 100644 index 0000000000..f364a73e79 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/51f0bd683d0d5829.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/52c707bc77bf01f6.xdr b/test-lcm/InvokeHostFunctionTests/52c707bc77bf01f6.xdr new file mode 100644 index 0000000000..f95e24ba9b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/52c707bc77bf01f6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5320263ea9731510.xdr b/test-lcm/InvokeHostFunctionTests/5320263ea9731510.xdr new file mode 100644 index 0000000000..df51a4f7de Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5320263ea9731510.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/536297cefb569ed7.xdr b/test-lcm/InvokeHostFunctionTests/536297cefb569ed7.xdr new file mode 100644 index 0000000000..4e5760e29c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/536297cefb569ed7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5365a779053a148d.xdr b/test-lcm/InvokeHostFunctionTests/5365a779053a148d.xdr new file mode 100644 index 0000000000..3023ebc788 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5365a779053a148d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/53b461e8db0fddd1.xdr b/test-lcm/InvokeHostFunctionTests/53b461e8db0fddd1.xdr new file mode 100644 index 0000000000..7297417ed8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/53b461e8db0fddd1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/540eac72b8688d25.xdr b/test-lcm/InvokeHostFunctionTests/540eac72b8688d25.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/540eac72b8688d25.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5416ca18f9a5fa27.xdr b/test-lcm/InvokeHostFunctionTests/5416ca18f9a5fa27.xdr new file mode 100644 index 0000000000..4351618e78 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5416ca18f9a5fa27.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/54e3fdf28cd70bd4.xdr b/test-lcm/InvokeHostFunctionTests/54e3fdf28cd70bd4.xdr new file mode 100644 index 0000000000..8f03251612 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/54e3fdf28cd70bd4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/54f8492f87d26b35.xdr b/test-lcm/InvokeHostFunctionTests/54f8492f87d26b35.xdr new file mode 100644 index 0000000000..0043db5849 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/54f8492f87d26b35.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/569840c5704c5e44.xdr b/test-lcm/InvokeHostFunctionTests/569840c5704c5e44.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/569840c5704c5e44.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/57207be4a3e12536.xdr b/test-lcm/InvokeHostFunctionTests/57207be4a3e12536.xdr new file mode 100644 index 0000000000..daad0b0a6b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/57207be4a3e12536.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/57659d96c64bd183.xdr b/test-lcm/InvokeHostFunctionTests/57659d96c64bd183.xdr new file mode 100644 index 0000000000..d9ff95b659 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/57659d96c64bd183.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5770d78319f7e869.xdr b/test-lcm/InvokeHostFunctionTests/5770d78319f7e869.xdr new file mode 100644 index 0000000000..08e4329b43 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5770d78319f7e869.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr b/test-lcm/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr new file mode 100644 index 0000000000..f88bbc39bf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/588e655d03094c0e.xdr b/test-lcm/InvokeHostFunctionTests/588e655d03094c0e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/588e655d03094c0e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5897c539e59df560.xdr b/test-lcm/InvokeHostFunctionTests/5897c539e59df560.xdr new file mode 100644 index 0000000000..0de9028861 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5897c539e59df560.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/58d33db7d651fcd6.xdr b/test-lcm/InvokeHostFunctionTests/58d33db7d651fcd6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/58d33db7d651fcd6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/59096fc089c399f5.xdr b/test-lcm/InvokeHostFunctionTests/59096fc089c399f5.xdr new file mode 100644 index 0000000000..02a07a9934 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/59096fc089c399f5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/594d4af3fbb90e26.xdr b/test-lcm/InvokeHostFunctionTests/594d4af3fbb90e26.xdr new file mode 100644 index 0000000000..db754bac4c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/594d4af3fbb90e26.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/598b33597b504a5f.xdr b/test-lcm/InvokeHostFunctionTests/598b33597b504a5f.xdr new file mode 100644 index 0000000000..ce4b469f6a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/598b33597b504a5f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/59a15bc254310ed9.xdr b/test-lcm/InvokeHostFunctionTests/59a15bc254310ed9.xdr new file mode 100644 index 0000000000..4775357064 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/59a15bc254310ed9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/59a168278f646f8f.xdr b/test-lcm/InvokeHostFunctionTests/59a168278f646f8f.xdr new file mode 100644 index 0000000000..5c517879ae Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/59a168278f646f8f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/59c181d5ff7acc7e.xdr b/test-lcm/InvokeHostFunctionTests/59c181d5ff7acc7e.xdr new file mode 100644 index 0000000000..032d48c81a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/59c181d5ff7acc7e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr b/test-lcm/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr new file mode 100644 index 0000000000..2fdb55b239 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5bd72d146c15215c.xdr b/test-lcm/InvokeHostFunctionTests/5bd72d146c15215c.xdr new file mode 100644 index 0000000000..4879b68687 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5bd72d146c15215c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5da4c3861d2a2428.xdr b/test-lcm/InvokeHostFunctionTests/5da4c3861d2a2428.xdr new file mode 100644 index 0000000000..abda53d919 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5da4c3861d2a2428.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5e733f15f9fe6c15.xdr b/test-lcm/InvokeHostFunctionTests/5e733f15f9fe6c15.xdr new file mode 100644 index 0000000000..55308f3410 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5e733f15f9fe6c15.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr b/test-lcm/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5e95d63123990f96.xdr b/test-lcm/InvokeHostFunctionTests/5e95d63123990f96.xdr new file mode 100644 index 0000000000..6b69d101dc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5e95d63123990f96.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5f0e7c9e5b14d2fa.xdr b/test-lcm/InvokeHostFunctionTests/5f0e7c9e5b14d2fa.xdr new file mode 100644 index 0000000000..e755a5724a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5f0e7c9e5b14d2fa.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/5f7b6356a31b9872.xdr b/test-lcm/InvokeHostFunctionTests/5f7b6356a31b9872.xdr new file mode 100644 index 0000000000..5e1d180873 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/5f7b6356a31b9872.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6031e1f0663cfda5.xdr b/test-lcm/InvokeHostFunctionTests/6031e1f0663cfda5.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6031e1f0663cfda5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/608765b88758cdff.xdr b/test-lcm/InvokeHostFunctionTests/608765b88758cdff.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/608765b88758cdff.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/60d32d465e9ef646.xdr b/test-lcm/InvokeHostFunctionTests/60d32d465e9ef646.xdr new file mode 100644 index 0000000000..3958f526e0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/60d32d465e9ef646.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6172930301eec1db.xdr b/test-lcm/InvokeHostFunctionTests/6172930301eec1db.xdr new file mode 100644 index 0000000000..58970dde04 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6172930301eec1db.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr b/test-lcm/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr new file mode 100644 index 0000000000..be6e65a64a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/61f1ec50d0457920.xdr b/test-lcm/InvokeHostFunctionTests/61f1ec50d0457920.xdr new file mode 100644 index 0000000000..ba0b2ee821 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/61f1ec50d0457920.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/62ae728143dd1ae3.xdr b/test-lcm/InvokeHostFunctionTests/62ae728143dd1ae3.xdr new file mode 100644 index 0000000000..dd7c279968 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/62ae728143dd1ae3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/630112e28640b3dc.xdr b/test-lcm/InvokeHostFunctionTests/630112e28640b3dc.xdr new file mode 100644 index 0000000000..2f643a81cb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/630112e28640b3dc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/633ede77405d5244.xdr b/test-lcm/InvokeHostFunctionTests/633ede77405d5244.xdr new file mode 100644 index 0000000000..ef3487b092 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/633ede77405d5244.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/63973d7e63330d22.xdr b/test-lcm/InvokeHostFunctionTests/63973d7e63330d22.xdr new file mode 100644 index 0000000000..17c1765bcc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/63973d7e63330d22.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr b/test-lcm/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6445b19d68f45e62.xdr b/test-lcm/InvokeHostFunctionTests/6445b19d68f45e62.xdr new file mode 100644 index 0000000000..b0a3d1ac13 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6445b19d68f45e62.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/647908425725f18e.xdr b/test-lcm/InvokeHostFunctionTests/647908425725f18e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/647908425725f18e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/64c67c03ad8477ca.xdr b/test-lcm/InvokeHostFunctionTests/64c67c03ad8477ca.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/64c67c03ad8477ca.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/64def0179fc4dbe6.xdr b/test-lcm/InvokeHostFunctionTests/64def0179fc4dbe6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/64def0179fc4dbe6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6519e434acf354b7.xdr b/test-lcm/InvokeHostFunctionTests/6519e434acf354b7.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6519e434acf354b7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/659ac68c6d773240.xdr b/test-lcm/InvokeHostFunctionTests/659ac68c6d773240.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/659ac68c6d773240.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr b/test-lcm/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr new file mode 100644 index 0000000000..7df66c3ee3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr b/test-lcm/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr new file mode 100644 index 0000000000..dbdcba28ef Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr b/test-lcm/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr new file mode 100644 index 0000000000..08600d7ee9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/66755facd883bef4.xdr b/test-lcm/InvokeHostFunctionTests/66755facd883bef4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/66755facd883bef4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr b/test-lcm/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr new file mode 100644 index 0000000000..fdb2c087f8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/675cca94471892a1.xdr b/test-lcm/InvokeHostFunctionTests/675cca94471892a1.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/675cca94471892a1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/678620649d7edfe9.xdr b/test-lcm/InvokeHostFunctionTests/678620649d7edfe9.xdr new file mode 100644 index 0000000000..5fa3488d72 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/678620649d7edfe9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr b/test-lcm/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr new file mode 100644 index 0000000000..572ae6a762 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/68392e6abed97fb5.xdr b/test-lcm/InvokeHostFunctionTests/68392e6abed97fb5.xdr new file mode 100644 index 0000000000..8745dfbeb0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/68392e6abed97fb5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6856b0b044010cae.xdr b/test-lcm/InvokeHostFunctionTests/6856b0b044010cae.xdr new file mode 100644 index 0000000000..04cb6ee44b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6856b0b044010cae.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/68f165975379ef6f.xdr b/test-lcm/InvokeHostFunctionTests/68f165975379ef6f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/68f165975379ef6f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/69051a1b441d9996.xdr b/test-lcm/InvokeHostFunctionTests/69051a1b441d9996.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/69051a1b441d9996.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/69abe494995566fb.xdr b/test-lcm/InvokeHostFunctionTests/69abe494995566fb.xdr new file mode 100644 index 0000000000..5a046a7bad Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/69abe494995566fb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/69d72740ac448701.xdr b/test-lcm/InvokeHostFunctionTests/69d72740ac448701.xdr new file mode 100644 index 0000000000..2dbc890381 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/69d72740ac448701.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/69ea6faa228bf063.xdr b/test-lcm/InvokeHostFunctionTests/69ea6faa228bf063.xdr new file mode 100644 index 0000000000..ab68e23cad Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/69ea6faa228bf063.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6a0fcad7207a7356.xdr b/test-lcm/InvokeHostFunctionTests/6a0fcad7207a7356.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6a0fcad7207a7356.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6a5c2ecc147d9ba9.xdr b/test-lcm/InvokeHostFunctionTests/6a5c2ecc147d9ba9.xdr new file mode 100644 index 0000000000..e64c0c49d3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6a5c2ecc147d9ba9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6b1bba1cde19195d.xdr b/test-lcm/InvokeHostFunctionTests/6b1bba1cde19195d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6b1bba1cde19195d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6b7ea8905416d282.xdr b/test-lcm/InvokeHostFunctionTests/6b7ea8905416d282.xdr new file mode 100644 index 0000000000..47a34afdfa Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6b7ea8905416d282.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6be1723f2de82c90.xdr b/test-lcm/InvokeHostFunctionTests/6be1723f2de82c90.xdr new file mode 100644 index 0000000000..ac3e12c839 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6be1723f2de82c90.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr b/test-lcm/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr new file mode 100644 index 0000000000..32dff58d67 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6ca3ca208041d5d9.xdr b/test-lcm/InvokeHostFunctionTests/6ca3ca208041d5d9.xdr new file mode 100644 index 0000000000..6a1ed250d6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6ca3ca208041d5d9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr b/test-lcm/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr new file mode 100644 index 0000000000..3a9cfc069e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6e020886d77520ee.xdr b/test-lcm/InvokeHostFunctionTests/6e020886d77520ee.xdr new file mode 100644 index 0000000000..ed51f6bf94 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6e020886d77520ee.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr b/test-lcm/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr b/test-lcm/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr new file mode 100644 index 0000000000..eedbaf34d8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr b/test-lcm/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6f3467c6e13a1648.xdr b/test-lcm/InvokeHostFunctionTests/6f3467c6e13a1648.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6f3467c6e13a1648.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6fe7ad5169387958.xdr b/test-lcm/InvokeHostFunctionTests/6fe7ad5169387958.xdr new file mode 100644 index 0000000000..caab5ae4ec Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6fe7ad5169387958.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/6ffafbc029e47549.xdr b/test-lcm/InvokeHostFunctionTests/6ffafbc029e47549.xdr new file mode 100644 index 0000000000..6f2d46e61b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/6ffafbc029e47549.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/701983d81c015a60.xdr b/test-lcm/InvokeHostFunctionTests/701983d81c015a60.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/701983d81c015a60.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/70b7679c1de24a4b.xdr b/test-lcm/InvokeHostFunctionTests/70b7679c1de24a4b.xdr new file mode 100644 index 0000000000..55756c9e17 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/70b7679c1de24a4b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/711a5390f886c7ff.xdr b/test-lcm/InvokeHostFunctionTests/711a5390f886c7ff.xdr new file mode 100644 index 0000000000..592052deec Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/711a5390f886c7ff.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/714af0a63932eb6b.xdr b/test-lcm/InvokeHostFunctionTests/714af0a63932eb6b.xdr new file mode 100644 index 0000000000..3d7cc060b7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/714af0a63932eb6b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/71db73c744a926be.xdr b/test-lcm/InvokeHostFunctionTests/71db73c744a926be.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/71db73c744a926be.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/725278041cf421e0.xdr b/test-lcm/InvokeHostFunctionTests/725278041cf421e0.xdr new file mode 100644 index 0000000000..e9edb76687 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/725278041cf421e0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr b/test-lcm/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr new file mode 100644 index 0000000000..7de73db1fc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/72e32d5e4cbe23f2.xdr b/test-lcm/InvokeHostFunctionTests/72e32d5e4cbe23f2.xdr new file mode 100644 index 0000000000..6a0eac6d43 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/72e32d5e4cbe23f2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/73d97239afd1a289.xdr b/test-lcm/InvokeHostFunctionTests/73d97239afd1a289.xdr new file mode 100644 index 0000000000..ea1a086eae Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/73d97239afd1a289.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr b/test-lcm/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr new file mode 100644 index 0000000000..40465472c1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/749d86ef2b83de64.xdr b/test-lcm/InvokeHostFunctionTests/749d86ef2b83de64.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/749d86ef2b83de64.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/74cb309604b87ad5.xdr b/test-lcm/InvokeHostFunctionTests/74cb309604b87ad5.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/74cb309604b87ad5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7560b4ebec62de03.xdr b/test-lcm/InvokeHostFunctionTests/7560b4ebec62de03.xdr new file mode 100644 index 0000000000..e49c51158d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7560b4ebec62de03.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/75a857ffd876a72d.xdr b/test-lcm/InvokeHostFunctionTests/75a857ffd876a72d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/75a857ffd876a72d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7623428964713c55.xdr b/test-lcm/InvokeHostFunctionTests/7623428964713c55.xdr new file mode 100644 index 0000000000..0c12e07471 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7623428964713c55.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7624c43e428ee32d.xdr b/test-lcm/InvokeHostFunctionTests/7624c43e428ee32d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7624c43e428ee32d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/763b53bb30a2499d.xdr b/test-lcm/InvokeHostFunctionTests/763b53bb30a2499d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/763b53bb30a2499d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/77904c0e7819a7eb.xdr b/test-lcm/InvokeHostFunctionTests/77904c0e7819a7eb.xdr new file mode 100644 index 0000000000..0912ff92ba Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/77904c0e7819a7eb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/77b0f96ee78d5679.xdr b/test-lcm/InvokeHostFunctionTests/77b0f96ee78d5679.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/77b0f96ee78d5679.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7811a2db272e2bc5.xdr b/test-lcm/InvokeHostFunctionTests/7811a2db272e2bc5.xdr new file mode 100644 index 0000000000..e51bc7b50a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7811a2db272e2bc5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/781c971d7b58563a.xdr b/test-lcm/InvokeHostFunctionTests/781c971d7b58563a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/781c971d7b58563a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/78d19632e893bee4.xdr b/test-lcm/InvokeHostFunctionTests/78d19632e893bee4.xdr new file mode 100644 index 0000000000..48447dfc35 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/78d19632e893bee4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7974f01f0568597f.xdr b/test-lcm/InvokeHostFunctionTests/7974f01f0568597f.xdr new file mode 100644 index 0000000000..83d097efa0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7974f01f0568597f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7b24f552eb083ed6.xdr b/test-lcm/InvokeHostFunctionTests/7b24f552eb083ed6.xdr new file mode 100644 index 0000000000..03233d9f36 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7b24f552eb083ed6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7c3fa2905342aef3.xdr b/test-lcm/InvokeHostFunctionTests/7c3fa2905342aef3.xdr new file mode 100644 index 0000000000..993488e21a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7c3fa2905342aef3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7c588d1eada8e956.xdr b/test-lcm/InvokeHostFunctionTests/7c588d1eada8e956.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7c588d1eada8e956.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr b/test-lcm/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr b/test-lcm/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr b/test-lcm/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr new file mode 100644 index 0000000000..be673e4e39 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7db90301e11fa5d0.xdr b/test-lcm/InvokeHostFunctionTests/7db90301e11fa5d0.xdr new file mode 100644 index 0000000000..c7268f0fff Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7db90301e11fa5d0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr b/test-lcm/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr new file mode 100644 index 0000000000..c69f7867bc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr b/test-lcm/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7f4f40cb7a2fbb6f.xdr b/test-lcm/InvokeHostFunctionTests/7f4f40cb7a2fbb6f.xdr new file mode 100644 index 0000000000..2fb5264523 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7f4f40cb7a2fbb6f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr b/test-lcm/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/7f7e72aa985692ae.xdr b/test-lcm/InvokeHostFunctionTests/7f7e72aa985692ae.xdr new file mode 100644 index 0000000000..befa0d3420 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/7f7e72aa985692ae.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/811ecb1190787c4f.xdr b/test-lcm/InvokeHostFunctionTests/811ecb1190787c4f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/811ecb1190787c4f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/81c974086b0e4f56.xdr b/test-lcm/InvokeHostFunctionTests/81c974086b0e4f56.xdr new file mode 100644 index 0000000000..9970b00589 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/81c974086b0e4f56.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/824743daeb17e7e9.xdr b/test-lcm/InvokeHostFunctionTests/824743daeb17e7e9.xdr new file mode 100644 index 0000000000..aa18de7fd4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/824743daeb17e7e9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/83e78d1ac27b4951.xdr b/test-lcm/InvokeHostFunctionTests/83e78d1ac27b4951.xdr new file mode 100644 index 0000000000..6db0d8b333 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/83e78d1ac27b4951.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr b/test-lcm/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr b/test-lcm/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr new file mode 100644 index 0000000000..01ce36348b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/84315cd6d68b5749.xdr b/test-lcm/InvokeHostFunctionTests/84315cd6d68b5749.xdr new file mode 100644 index 0000000000..6ad5a7f9dd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/84315cd6d68b5749.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8433fde0f0bbd2f7.xdr b/test-lcm/InvokeHostFunctionTests/8433fde0f0bbd2f7.xdr new file mode 100644 index 0000000000..fe965aff75 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8433fde0f0bbd2f7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/843c6cc8cb69c839.xdr b/test-lcm/InvokeHostFunctionTests/843c6cc8cb69c839.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/843c6cc8cb69c839.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/846ca1ad625e9ea7.xdr b/test-lcm/InvokeHostFunctionTests/846ca1ad625e9ea7.xdr new file mode 100644 index 0000000000..8d403a6658 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/846ca1ad625e9ea7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/846db27a79a2ec7d.xdr b/test-lcm/InvokeHostFunctionTests/846db27a79a2ec7d.xdr new file mode 100644 index 0000000000..b8eca9510c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/846db27a79a2ec7d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr b/test-lcm/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/860c9ebb141ea269.xdr b/test-lcm/InvokeHostFunctionTests/860c9ebb141ea269.xdr new file mode 100644 index 0000000000..6679f340f6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/860c9ebb141ea269.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8666b7f3149900ec.xdr b/test-lcm/InvokeHostFunctionTests/8666b7f3149900ec.xdr new file mode 100644 index 0000000000..b8ce06caa2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8666b7f3149900ec.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/86c090d2b24bc515.xdr b/test-lcm/InvokeHostFunctionTests/86c090d2b24bc515.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/86c090d2b24bc515.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/86ec0b605b279d49.xdr b/test-lcm/InvokeHostFunctionTests/86ec0b605b279d49.xdr new file mode 100644 index 0000000000..12b06d473a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/86ec0b605b279d49.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/875401f18d4d37e0.xdr b/test-lcm/InvokeHostFunctionTests/875401f18d4d37e0.xdr new file mode 100644 index 0000000000..205162799f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/875401f18d4d37e0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8848fdad9b841822.xdr b/test-lcm/InvokeHostFunctionTests/8848fdad9b841822.xdr new file mode 100644 index 0000000000..809d0529e9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8848fdad9b841822.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8878f61751a807b8.xdr b/test-lcm/InvokeHostFunctionTests/8878f61751a807b8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8878f61751a807b8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/887c083fc1639e43.xdr b/test-lcm/InvokeHostFunctionTests/887c083fc1639e43.xdr new file mode 100644 index 0000000000..1a50958d6a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/887c083fc1639e43.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr b/test-lcm/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/891a276e7ce06b91.xdr b/test-lcm/InvokeHostFunctionTests/891a276e7ce06b91.xdr new file mode 100644 index 0000000000..1e53d094b3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/891a276e7ce06b91.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/894fd4e0f979d673.xdr b/test-lcm/InvokeHostFunctionTests/894fd4e0f979d673.xdr new file mode 100644 index 0000000000..bcbf5a364f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/894fd4e0f979d673.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/895b3456160d157c.xdr b/test-lcm/InvokeHostFunctionTests/895b3456160d157c.xdr new file mode 100644 index 0000000000..2b003cfb81 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/895b3456160d157c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/897ee371b2a80230.xdr b/test-lcm/InvokeHostFunctionTests/897ee371b2a80230.xdr new file mode 100644 index 0000000000..362495a950 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/897ee371b2a80230.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/898221ce90bbe12a.xdr b/test-lcm/InvokeHostFunctionTests/898221ce90bbe12a.xdr new file mode 100644 index 0000000000..e7589f74d4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/898221ce90bbe12a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/89f9145d00c68451.xdr b/test-lcm/InvokeHostFunctionTests/89f9145d00c68451.xdr new file mode 100644 index 0000000000..83fd91d473 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/89f9145d00c68451.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/89fc4f3bfc2e66a6.xdr b/test-lcm/InvokeHostFunctionTests/89fc4f3bfc2e66a6.xdr new file mode 100644 index 0000000000..aef216c762 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/89fc4f3bfc2e66a6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8adead0567fe7d71.xdr b/test-lcm/InvokeHostFunctionTests/8adead0567fe7d71.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8adead0567fe7d71.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8b13d91d773c9085.xdr b/test-lcm/InvokeHostFunctionTests/8b13d91d773c9085.xdr new file mode 100644 index 0000000000..1d8e143021 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8b13d91d773c9085.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8b327a3e8ca7a777.xdr b/test-lcm/InvokeHostFunctionTests/8b327a3e8ca7a777.xdr new file mode 100644 index 0000000000..2a3ece69dc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8b327a3e8ca7a777.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8cf745afc0a51283.xdr b/test-lcm/InvokeHostFunctionTests/8cf745afc0a51283.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8cf745afc0a51283.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8d0a24bb396f996d.xdr b/test-lcm/InvokeHostFunctionTests/8d0a24bb396f996d.xdr new file mode 100644 index 0000000000..29e058b64c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8d0a24bb396f996d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr b/test-lcm/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8dfbc063af86ec35.xdr b/test-lcm/InvokeHostFunctionTests/8dfbc063af86ec35.xdr new file mode 100644 index 0000000000..eb29e0f283 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8dfbc063af86ec35.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8e99b44b297caaac.xdr b/test-lcm/InvokeHostFunctionTests/8e99b44b297caaac.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8e99b44b297caaac.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8f46b4013f8e249b.xdr b/test-lcm/InvokeHostFunctionTests/8f46b4013f8e249b.xdr new file mode 100644 index 0000000000..226dd85c71 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8f46b4013f8e249b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr b/test-lcm/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr new file mode 100644 index 0000000000..902316326b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/90153646e94af892.xdr b/test-lcm/InvokeHostFunctionTests/90153646e94af892.xdr new file mode 100644 index 0000000000..def1475e97 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/90153646e94af892.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/908acbd3aceb8316.xdr b/test-lcm/InvokeHostFunctionTests/908acbd3aceb8316.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/908acbd3aceb8316.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/90bf93d9cc8919fb.xdr b/test-lcm/InvokeHostFunctionTests/90bf93d9cc8919fb.xdr new file mode 100644 index 0000000000..20562ee7e3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/90bf93d9cc8919fb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr b/test-lcm/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr new file mode 100644 index 0000000000..e1909c584a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/91eb7b4592150c3e.xdr b/test-lcm/InvokeHostFunctionTests/91eb7b4592150c3e.xdr new file mode 100644 index 0000000000..152b30061e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/91eb7b4592150c3e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9209c586bd226b99.xdr b/test-lcm/InvokeHostFunctionTests/9209c586bd226b99.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9209c586bd226b99.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/920a1fad5ca8a29b.xdr b/test-lcm/InvokeHostFunctionTests/920a1fad5ca8a29b.xdr new file mode 100644 index 0000000000..5c446e67f6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/920a1fad5ca8a29b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr b/test-lcm/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/92680c457fe83aa7.xdr b/test-lcm/InvokeHostFunctionTests/92680c457fe83aa7.xdr new file mode 100644 index 0000000000..17f51bfd80 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/92680c457fe83aa7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/92b288c4d95b05f9.xdr b/test-lcm/InvokeHostFunctionTests/92b288c4d95b05f9.xdr new file mode 100644 index 0000000000..98e719d35e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/92b288c4d95b05f9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/930b08e2d077bfdc.xdr b/test-lcm/InvokeHostFunctionTests/930b08e2d077bfdc.xdr new file mode 100644 index 0000000000..a8d04a621a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/930b08e2d077bfdc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/932641f2b5405789.xdr b/test-lcm/InvokeHostFunctionTests/932641f2b5405789.xdr new file mode 100644 index 0000000000..a2fde7e5fd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/932641f2b5405789.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/93481a30a4ea3f79.xdr b/test-lcm/InvokeHostFunctionTests/93481a30a4ea3f79.xdr new file mode 100644 index 0000000000..b6d8b796b0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/93481a30a4ea3f79.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/93ba029750a86166.xdr b/test-lcm/InvokeHostFunctionTests/93ba029750a86166.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/93ba029750a86166.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/940e8bdc84f9af94.xdr b/test-lcm/InvokeHostFunctionTests/940e8bdc84f9af94.xdr new file mode 100644 index 0000000000..e81a235644 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/940e8bdc84f9af94.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9435de885ff30026.xdr b/test-lcm/InvokeHostFunctionTests/9435de885ff30026.xdr new file mode 100644 index 0000000000..cfd2ad63cf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9435de885ff30026.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/94f5f9a57e087669.xdr b/test-lcm/InvokeHostFunctionTests/94f5f9a57e087669.xdr new file mode 100644 index 0000000000..78ec950908 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/94f5f9a57e087669.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/955397e091e35fad.xdr b/test-lcm/InvokeHostFunctionTests/955397e091e35fad.xdr new file mode 100644 index 0000000000..0c6b10bde9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/955397e091e35fad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr b/test-lcm/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/95dc94b3567bf81b.xdr b/test-lcm/InvokeHostFunctionTests/95dc94b3567bf81b.xdr new file mode 100644 index 0000000000..dbe4def7de Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/95dc94b3567bf81b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr b/test-lcm/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/95ede71a6074dc1b.xdr b/test-lcm/InvokeHostFunctionTests/95ede71a6074dc1b.xdr new file mode 100644 index 0000000000..57e8039ca3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/95ede71a6074dc1b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/964450cc2eb51081.xdr b/test-lcm/InvokeHostFunctionTests/964450cc2eb51081.xdr new file mode 100644 index 0000000000..4722636d94 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/964450cc2eb51081.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/96690328bd10efc5.xdr b/test-lcm/InvokeHostFunctionTests/96690328bd10efc5.xdr new file mode 100644 index 0000000000..7b0a6ce58b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/96690328bd10efc5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/98958916fd28f843.xdr b/test-lcm/InvokeHostFunctionTests/98958916fd28f843.xdr new file mode 100644 index 0000000000..a253e54a31 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/98958916fd28f843.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/98dd9afc9aec58e3.xdr b/test-lcm/InvokeHostFunctionTests/98dd9afc9aec58e3.xdr new file mode 100644 index 0000000000..2f3162e77a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/98dd9afc9aec58e3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/99541d3371b2ebcf.xdr b/test-lcm/InvokeHostFunctionTests/99541d3371b2ebcf.xdr new file mode 100644 index 0000000000..bc47341af6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/99541d3371b2ebcf.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9a2c38c5272df06c.xdr b/test-lcm/InvokeHostFunctionTests/9a2c38c5272df06c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9a2c38c5272df06c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9a4d995b45b4db13.xdr b/test-lcm/InvokeHostFunctionTests/9a4d995b45b4db13.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9a4d995b45b4db13.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9abda59d0cea408b.xdr b/test-lcm/InvokeHostFunctionTests/9abda59d0cea408b.xdr new file mode 100644 index 0000000000..7287f026f4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9abda59d0cea408b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr b/test-lcm/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9b7aa5eb73370090.xdr b/test-lcm/InvokeHostFunctionTests/9b7aa5eb73370090.xdr new file mode 100644 index 0000000000..94921bb52e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9b7aa5eb73370090.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9c169e4a17366ef4.xdr b/test-lcm/InvokeHostFunctionTests/9c169e4a17366ef4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9c169e4a17366ef4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9c319f6ebbf74238.xdr b/test-lcm/InvokeHostFunctionTests/9c319f6ebbf74238.xdr new file mode 100644 index 0000000000..d20faa08c7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9c319f6ebbf74238.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9c797412cd0d11b5.xdr b/test-lcm/InvokeHostFunctionTests/9c797412cd0d11b5.xdr new file mode 100644 index 0000000000..f595324045 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9c797412cd0d11b5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9c99d2135d9d7d77.xdr b/test-lcm/InvokeHostFunctionTests/9c99d2135d9d7d77.xdr new file mode 100644 index 0000000000..a4a1967450 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9c99d2135d9d7d77.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr b/test-lcm/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr new file mode 100644 index 0000000000..959d8887df Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9ccccec1202f5b81.xdr b/test-lcm/InvokeHostFunctionTests/9ccccec1202f5b81.xdr new file mode 100644 index 0000000000..600496d985 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9ccccec1202f5b81.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9e44fefde737f8bc.xdr b/test-lcm/InvokeHostFunctionTests/9e44fefde737f8bc.xdr new file mode 100644 index 0000000000..5cddbab223 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9e44fefde737f8bc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9e7d59169e4ded64.xdr b/test-lcm/InvokeHostFunctionTests/9e7d59169e4ded64.xdr new file mode 100644 index 0000000000..6035eb99bf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9e7d59169e4ded64.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr b/test-lcm/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr b/test-lcm/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr new file mode 100644 index 0000000000..6bf156887e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr b/test-lcm/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr new file mode 100644 index 0000000000..8b61b65d33 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/9fa92df05d0615bf.xdr b/test-lcm/InvokeHostFunctionTests/9fa92df05d0615bf.xdr new file mode 100644 index 0000000000..422dabcf68 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/9fa92df05d0615bf.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a0119ab86c638bee.xdr b/test-lcm/InvokeHostFunctionTests/a0119ab86c638bee.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a0119ab86c638bee.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a0964aad16627449.xdr b/test-lcm/InvokeHostFunctionTests/a0964aad16627449.xdr new file mode 100644 index 0000000000..aac8ddca31 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a0964aad16627449.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr b/test-lcm/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr b/test-lcm/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr new file mode 100644 index 0000000000..2fe595887e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr b/test-lcm/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr new file mode 100644 index 0000000000..3149c9012c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a258cc5505846d79.xdr b/test-lcm/InvokeHostFunctionTests/a258cc5505846d79.xdr new file mode 100644 index 0000000000..bb4179f724 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a258cc5505846d79.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a4453c1269875574.xdr b/test-lcm/InvokeHostFunctionTests/a4453c1269875574.xdr new file mode 100644 index 0000000000..55ccf40193 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a4453c1269875574.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a4f13a2fa6293428.xdr b/test-lcm/InvokeHostFunctionTests/a4f13a2fa6293428.xdr new file mode 100644 index 0000000000..7630295270 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a4f13a2fa6293428.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a71e4d9203d52748.xdr b/test-lcm/InvokeHostFunctionTests/a71e4d9203d52748.xdr new file mode 100644 index 0000000000..bcf6c21e34 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a71e4d9203d52748.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a72c947ed7b434d3.xdr b/test-lcm/InvokeHostFunctionTests/a72c947ed7b434d3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a72c947ed7b434d3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a80621eee94baae6.xdr b/test-lcm/InvokeHostFunctionTests/a80621eee94baae6.xdr new file mode 100644 index 0000000000..ef05fcf8e2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a80621eee94baae6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a8a9725a33441cb5.xdr b/test-lcm/InvokeHostFunctionTests/a8a9725a33441cb5.xdr new file mode 100644 index 0000000000..2b484f0d78 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a8a9725a33441cb5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a8d1cb44f470573f.xdr b/test-lcm/InvokeHostFunctionTests/a8d1cb44f470573f.xdr new file mode 100644 index 0000000000..9435a1c156 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a8d1cb44f470573f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a904442b4503e607.xdr b/test-lcm/InvokeHostFunctionTests/a904442b4503e607.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a904442b4503e607.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a94afbf4a15753e8.xdr b/test-lcm/InvokeHostFunctionTests/a94afbf4a15753e8.xdr new file mode 100644 index 0000000000..ebcd07bc04 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a94afbf4a15753e8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr b/test-lcm/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr new file mode 100644 index 0000000000..fa467f5da7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr b/test-lcm/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr new file mode 100644 index 0000000000..cb67b1394c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/aa722688a0fedfc0.xdr b/test-lcm/InvokeHostFunctionTests/aa722688a0fedfc0.xdr new file mode 100644 index 0000000000..b74637d68d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/aa722688a0fedfc0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ab3bce4773581342.xdr b/test-lcm/InvokeHostFunctionTests/ab3bce4773581342.xdr new file mode 100644 index 0000000000..fe6ab72783 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ab3bce4773581342.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ab898f0b7ce30529.xdr b/test-lcm/InvokeHostFunctionTests/ab898f0b7ce30529.xdr new file mode 100644 index 0000000000..00ca554583 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ab898f0b7ce30529.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/abe9daab6e04747a.xdr b/test-lcm/InvokeHostFunctionTests/abe9daab6e04747a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/abe9daab6e04747a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ac9dbf09c7cb19e8.xdr b/test-lcm/InvokeHostFunctionTests/ac9dbf09c7cb19e8.xdr new file mode 100644 index 0000000000..5966887f35 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ac9dbf09c7cb19e8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ad00903073e6c1d2.xdr b/test-lcm/InvokeHostFunctionTests/ad00903073e6c1d2.xdr new file mode 100644 index 0000000000..e7c6d16777 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ad00903073e6c1d2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ad19485cea9fa38c.xdr b/test-lcm/InvokeHostFunctionTests/ad19485cea9fa38c.xdr new file mode 100644 index 0000000000..7475b6070b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ad19485cea9fa38c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ae601103b9e4498d.xdr b/test-lcm/InvokeHostFunctionTests/ae601103b9e4498d.xdr new file mode 100644 index 0000000000..1ce131dea0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ae601103b9e4498d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr b/test-lcm/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr b/test-lcm/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/af54a98dbdd88b52.xdr b/test-lcm/InvokeHostFunctionTests/af54a98dbdd88b52.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/af54a98dbdd88b52.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/afa256621921b22e.xdr b/test-lcm/InvokeHostFunctionTests/afa256621921b22e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/afa256621921b22e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr b/test-lcm/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr new file mode 100644 index 0000000000..4f41f2ee5a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b045bf491859a6b8.xdr b/test-lcm/InvokeHostFunctionTests/b045bf491859a6b8.xdr new file mode 100644 index 0000000000..1af8b894e5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b045bf491859a6b8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b064c60719fa9bec.xdr b/test-lcm/InvokeHostFunctionTests/b064c60719fa9bec.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b064c60719fa9bec.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b136f91677750cd4.xdr b/test-lcm/InvokeHostFunctionTests/b136f91677750cd4.xdr new file mode 100644 index 0000000000..f4ebcd291a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b136f91677750cd4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr b/test-lcm/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr new file mode 100644 index 0000000000..481a74912b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr b/test-lcm/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr b/test-lcm/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr new file mode 100644 index 0000000000..dcb7634ce1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b3101bb9f07292f5.xdr b/test-lcm/InvokeHostFunctionTests/b3101bb9f07292f5.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b3101bb9f07292f5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b3437be97f124777.xdr b/test-lcm/InvokeHostFunctionTests/b3437be97f124777.xdr new file mode 100644 index 0000000000..9b674521c2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b3437be97f124777.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr b/test-lcm/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr new file mode 100644 index 0000000000..2e8f2728bd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr b/test-lcm/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b4148adbbba04047.xdr b/test-lcm/InvokeHostFunctionTests/b4148adbbba04047.xdr new file mode 100644 index 0000000000..804bfe3ffb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b4148adbbba04047.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b5a503183a69e95f.xdr b/test-lcm/InvokeHostFunctionTests/b5a503183a69e95f.xdr new file mode 100644 index 0000000000..db767b89de Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b5a503183a69e95f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr b/test-lcm/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b652542975ff5560.xdr b/test-lcm/InvokeHostFunctionTests/b652542975ff5560.xdr new file mode 100644 index 0000000000..4c90cf1bdb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b652542975ff5560.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b6ce7aade1aed1e3.xdr b/test-lcm/InvokeHostFunctionTests/b6ce7aade1aed1e3.xdr new file mode 100644 index 0000000000..76c023dbef Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b6ce7aade1aed1e3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b71e067496723cb3.xdr b/test-lcm/InvokeHostFunctionTests/b71e067496723cb3.xdr new file mode 100644 index 0000000000..e53a2f1226 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b71e067496723cb3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b74618989cc0605c.xdr b/test-lcm/InvokeHostFunctionTests/b74618989cc0605c.xdr new file mode 100644 index 0000000000..b91717cfde Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b74618989cc0605c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b7db472d275c4797.xdr b/test-lcm/InvokeHostFunctionTests/b7db472d275c4797.xdr new file mode 100644 index 0000000000..b5c892fabe Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b7db472d275c4797.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b808b59ac14049b2.xdr b/test-lcm/InvokeHostFunctionTests/b808b59ac14049b2.xdr new file mode 100644 index 0000000000..12fc5c4680 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b808b59ac14049b2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b9862c0b86a145aa.xdr b/test-lcm/InvokeHostFunctionTests/b9862c0b86a145aa.xdr new file mode 100644 index 0000000000..1b274ddb04 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b9862c0b86a145aa.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/b9bdda6eada575ea.xdr b/test-lcm/InvokeHostFunctionTests/b9bdda6eada575ea.xdr new file mode 100644 index 0000000000..f3b9905eec Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/b9bdda6eada575ea.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ba8824d29063376f.xdr b/test-lcm/InvokeHostFunctionTests/ba8824d29063376f.xdr new file mode 100644 index 0000000000..5dc2d86057 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ba8824d29063376f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ba9e85782489d4b3.xdr b/test-lcm/InvokeHostFunctionTests/ba9e85782489d4b3.xdr new file mode 100644 index 0000000000..5023fa876a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ba9e85782489d4b3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/baa71b7a006a3951.xdr b/test-lcm/InvokeHostFunctionTests/baa71b7a006a3951.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/baa71b7a006a3951.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bb10b7a54991da41.xdr b/test-lcm/InvokeHostFunctionTests/bb10b7a54991da41.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bb10b7a54991da41.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bd0e2c7d9d444eb7.xdr b/test-lcm/InvokeHostFunctionTests/bd0e2c7d9d444eb7.xdr new file mode 100644 index 0000000000..62809c3e53 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bd0e2c7d9d444eb7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr b/test-lcm/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bdf21d276e44df51.xdr b/test-lcm/InvokeHostFunctionTests/bdf21d276e44df51.xdr new file mode 100644 index 0000000000..4748319320 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bdf21d276e44df51.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr b/test-lcm/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr new file mode 100644 index 0000000000..8c5dc963a7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/be52cd7f42814b0a.xdr b/test-lcm/InvokeHostFunctionTests/be52cd7f42814b0a.xdr new file mode 100644 index 0000000000..bc5624f638 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/be52cd7f42814b0a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/be6ebb5f038aa456.xdr b/test-lcm/InvokeHostFunctionTests/be6ebb5f038aa456.xdr new file mode 100644 index 0000000000..33b006b5cc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/be6ebb5f038aa456.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/be9fcc614f398cf3.xdr b/test-lcm/InvokeHostFunctionTests/be9fcc614f398cf3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/be9fcc614f398cf3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bec5319840022194.xdr b/test-lcm/InvokeHostFunctionTests/bec5319840022194.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bec5319840022194.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bec915835775f88a.xdr b/test-lcm/InvokeHostFunctionTests/bec915835775f88a.xdr new file mode 100644 index 0000000000..6a5ba5c9c9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bec915835775f88a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/beed566485392053.xdr b/test-lcm/InvokeHostFunctionTests/beed566485392053.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/beed566485392053.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/beee405585556b28.xdr b/test-lcm/InvokeHostFunctionTests/beee405585556b28.xdr new file mode 100644 index 0000000000..54bc6a0dcf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/beee405585556b28.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr b/test-lcm/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr new file mode 100644 index 0000000000..71ebc10094 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bf98f153a8789f78.xdr b/test-lcm/InvokeHostFunctionTests/bf98f153a8789f78.xdr new file mode 100644 index 0000000000..c79b8198e4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bf98f153a8789f78.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bfa396d5747102ff.xdr b/test-lcm/InvokeHostFunctionTests/bfa396d5747102ff.xdr new file mode 100644 index 0000000000..fa5f5482ff Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bfa396d5747102ff.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/bfab28e80790dd46.xdr b/test-lcm/InvokeHostFunctionTests/bfab28e80790dd46.xdr new file mode 100644 index 0000000000..2081743ef0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/bfab28e80790dd46.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c03bbceaf1428236.xdr b/test-lcm/InvokeHostFunctionTests/c03bbceaf1428236.xdr new file mode 100644 index 0000000000..94b2cc6517 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c03bbceaf1428236.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c07830e846670e5d.xdr b/test-lcm/InvokeHostFunctionTests/c07830e846670e5d.xdr new file mode 100644 index 0000000000..542bfb8acb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c07830e846670e5d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c18c912409884beb.xdr b/test-lcm/InvokeHostFunctionTests/c18c912409884beb.xdr new file mode 100644 index 0000000000..15732cb13b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c18c912409884beb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c1b1663060d151c0.xdr b/test-lcm/InvokeHostFunctionTests/c1b1663060d151c0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c1b1663060d151c0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr b/test-lcm/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr new file mode 100644 index 0000000000..8b3bc8d391 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr b/test-lcm/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr new file mode 100644 index 0000000000..0c1d6b37ae Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c252cebb25294eab.xdr b/test-lcm/InvokeHostFunctionTests/c252cebb25294eab.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c252cebb25294eab.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c255cd77235ad3c4.xdr b/test-lcm/InvokeHostFunctionTests/c255cd77235ad3c4.xdr new file mode 100644 index 0000000000..e6543f3a2e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c255cd77235ad3c4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr b/test-lcm/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr new file mode 100644 index 0000000000..b1c51d7bb2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c2c932cf464209f1.xdr b/test-lcm/InvokeHostFunctionTests/c2c932cf464209f1.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c2c932cf464209f1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c312c5d7aa1dfb38.xdr b/test-lcm/InvokeHostFunctionTests/c312c5d7aa1dfb38.xdr new file mode 100644 index 0000000000..22105dc31d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c312c5d7aa1dfb38.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c36cbaffe2709df8.xdr b/test-lcm/InvokeHostFunctionTests/c36cbaffe2709df8.xdr new file mode 100644 index 0000000000..3a86784148 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c36cbaffe2709df8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c3962c4a93291d74.xdr b/test-lcm/InvokeHostFunctionTests/c3962c4a93291d74.xdr new file mode 100644 index 0000000000..685250c8c2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c3962c4a93291d74.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c3bb0eae31d31633.xdr b/test-lcm/InvokeHostFunctionTests/c3bb0eae31d31633.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c3bb0eae31d31633.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c443a7bba49e0e10.xdr b/test-lcm/InvokeHostFunctionTests/c443a7bba49e0e10.xdr new file mode 100644 index 0000000000..4beb5ff1c0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c443a7bba49e0e10.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c455542f23c8635a.xdr b/test-lcm/InvokeHostFunctionTests/c455542f23c8635a.xdr new file mode 100644 index 0000000000..2ef3cab5ad Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c455542f23c8635a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c5d57c89c419e4af.xdr b/test-lcm/InvokeHostFunctionTests/c5d57c89c419e4af.xdr new file mode 100644 index 0000000000..a0467e6a7d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c5d57c89c419e4af.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c5f89e8c3c843590.xdr b/test-lcm/InvokeHostFunctionTests/c5f89e8c3c843590.xdr new file mode 100644 index 0000000000..3e9ef7ca00 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c5f89e8c3c843590.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr b/test-lcm/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr new file mode 100644 index 0000000000..38f50697c2 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c6d25066860431e0.xdr b/test-lcm/InvokeHostFunctionTests/c6d25066860431e0.xdr new file mode 100644 index 0000000000..830b3e9e5b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c6d25066860431e0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c81666a24e4770bd.xdr b/test-lcm/InvokeHostFunctionTests/c81666a24e4770bd.xdr new file mode 100644 index 0000000000..21d716cc08 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c81666a24e4770bd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c89523486b59f106.xdr b/test-lcm/InvokeHostFunctionTests/c89523486b59f106.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c89523486b59f106.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr b/test-lcm/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr new file mode 100644 index 0000000000..b1e2fac46e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c8f28ce0094c5916.xdr b/test-lcm/InvokeHostFunctionTests/c8f28ce0094c5916.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c8f28ce0094c5916.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c922fea348665a87.xdr b/test-lcm/InvokeHostFunctionTests/c922fea348665a87.xdr new file mode 100644 index 0000000000..abe7a02175 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c922fea348665a87.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr b/test-lcm/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c99364d18b82557b.xdr b/test-lcm/InvokeHostFunctionTests/c99364d18b82557b.xdr new file mode 100644 index 0000000000..590dacff25 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c99364d18b82557b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c99ea4a349fa4865.xdr b/test-lcm/InvokeHostFunctionTests/c99ea4a349fa4865.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c99ea4a349fa4865.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr b/test-lcm/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr new file mode 100644 index 0000000000..6981cf0f2c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c9dbd32afe107afb.xdr b/test-lcm/InvokeHostFunctionTests/c9dbd32afe107afb.xdr new file mode 100644 index 0000000000..602c11e0cc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c9dbd32afe107afb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr b/test-lcm/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr new file mode 100644 index 0000000000..0966fa6c06 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ca44bb06db470a22.xdr b/test-lcm/InvokeHostFunctionTests/ca44bb06db470a22.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ca44bb06db470a22.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ca81ee3779279e5f.xdr b/test-lcm/InvokeHostFunctionTests/ca81ee3779279e5f.xdr new file mode 100644 index 0000000000..12575d4cd3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ca81ee3779279e5f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ca96297c5d814422.xdr b/test-lcm/InvokeHostFunctionTests/ca96297c5d814422.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ca96297c5d814422.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr b/test-lcm/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr new file mode 100644 index 0000000000..c0573ff269 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr b/test-lcm/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr new file mode 100644 index 0000000000..7dba5cc642 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cc8e5617818c25e6.xdr b/test-lcm/InvokeHostFunctionTests/cc8e5617818c25e6.xdr new file mode 100644 index 0000000000..3608afc6c9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cc8e5617818c25e6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cc952a3d07337931.xdr b/test-lcm/InvokeHostFunctionTests/cc952a3d07337931.xdr new file mode 100644 index 0000000000..72360e66de Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cc952a3d07337931.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ccda2d8c73bceae6.xdr b/test-lcm/InvokeHostFunctionTests/ccda2d8c73bceae6.xdr new file mode 100644 index 0000000000..d2678bff6b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ccda2d8c73bceae6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cd577b89ed04d414.xdr b/test-lcm/InvokeHostFunctionTests/cd577b89ed04d414.xdr new file mode 100644 index 0000000000..af63025c52 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cd577b89ed04d414.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr b/test-lcm/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr new file mode 100644 index 0000000000..d6ebba7d33 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr b/test-lcm/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr new file mode 100644 index 0000000000..c4176acd69 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ce5735da86b32673.xdr b/test-lcm/InvokeHostFunctionTests/ce5735da86b32673.xdr new file mode 100644 index 0000000000..a40fe9f7c4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ce5735da86b32673.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ce594cb9b3e43c1d.xdr b/test-lcm/InvokeHostFunctionTests/ce594cb9b3e43c1d.xdr new file mode 100644 index 0000000000..7154e6bb05 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ce594cb9b3e43c1d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr b/test-lcm/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ce8d1ee97a0d686d.xdr b/test-lcm/InvokeHostFunctionTests/ce8d1ee97a0d686d.xdr new file mode 100644 index 0000000000..02e9356433 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ce8d1ee97a0d686d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cebea90af92b39d2.xdr b/test-lcm/InvokeHostFunctionTests/cebea90af92b39d2.xdr new file mode 100644 index 0000000000..dbbf066329 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cebea90af92b39d2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ced5e149f8263218.xdr b/test-lcm/InvokeHostFunctionTests/ced5e149f8263218.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ced5e149f8263218.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cf226151fb04c10f.xdr b/test-lcm/InvokeHostFunctionTests/cf226151fb04c10f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cf226151fb04c10f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr b/test-lcm/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d0994aa43a850a1a.xdr b/test-lcm/InvokeHostFunctionTests/d0994aa43a850a1a.xdr new file mode 100644 index 0000000000..a0b65e47b4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d0994aa43a850a1a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d10f1da9f73be05f.xdr b/test-lcm/InvokeHostFunctionTests/d10f1da9f73be05f.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d10f1da9f73be05f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d1522d4667822bc2.xdr b/test-lcm/InvokeHostFunctionTests/d1522d4667822bc2.xdr new file mode 100644 index 0000000000..43ad750abc Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d1522d4667822bc2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr b/test-lcm/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr new file mode 100644 index 0000000000..0a1889ac6d Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr b/test-lcm/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr new file mode 100644 index 0000000000..f1391621ce Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d1f5d115b26f2c2d.xdr b/test-lcm/InvokeHostFunctionTests/d1f5d115b26f2c2d.xdr new file mode 100644 index 0000000000..ebbb159f3a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d1f5d115b26f2c2d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d2284024d86a9f4a.xdr b/test-lcm/InvokeHostFunctionTests/d2284024d86a9f4a.xdr new file mode 100644 index 0000000000..6dcd3ce41b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d2284024d86a9f4a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d2ef4dd8a3326b1f.xdr b/test-lcm/InvokeHostFunctionTests/d2ef4dd8a3326b1f.xdr new file mode 100644 index 0000000000..b44695d662 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d2ef4dd8a3326b1f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d2fdf5f43cd795da.xdr b/test-lcm/InvokeHostFunctionTests/d2fdf5f43cd795da.xdr new file mode 100644 index 0000000000..e9f1ba5ab9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d2fdf5f43cd795da.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr b/test-lcm/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d3ee1065ef42391b.xdr b/test-lcm/InvokeHostFunctionTests/d3ee1065ef42391b.xdr new file mode 100644 index 0000000000..44391db2dd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d3ee1065ef42391b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr b/test-lcm/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr new file mode 100644 index 0000000000..bcd04921a3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d481fd33556741b2.xdr b/test-lcm/InvokeHostFunctionTests/d481fd33556741b2.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d481fd33556741b2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr b/test-lcm/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr b/test-lcm/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d580226d468cd36a.xdr b/test-lcm/InvokeHostFunctionTests/d580226d468cd36a.xdr new file mode 100644 index 0000000000..08ac92b20f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d580226d468cd36a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr b/test-lcm/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr new file mode 100644 index 0000000000..76407f0f51 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d604f76431c95e5e.xdr b/test-lcm/InvokeHostFunctionTests/d604f76431c95e5e.xdr new file mode 100644 index 0000000000..c5ba7c32f3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d604f76431c95e5e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d697bb21e32f6aef.xdr b/test-lcm/InvokeHostFunctionTests/d697bb21e32f6aef.xdr new file mode 100644 index 0000000000..2decd1e045 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d697bb21e32f6aef.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d7ea63b86adedc73.xdr b/test-lcm/InvokeHostFunctionTests/d7ea63b86adedc73.xdr new file mode 100644 index 0000000000..94743acd05 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d7ea63b86adedc73.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d888d3403368dc50.xdr b/test-lcm/InvokeHostFunctionTests/d888d3403368dc50.xdr new file mode 100644 index 0000000000..0640d33d08 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d888d3403368dc50.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr b/test-lcm/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d8f18264015ca76d.xdr b/test-lcm/InvokeHostFunctionTests/d8f18264015ca76d.xdr new file mode 100644 index 0000000000..38d3897a5a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d8f18264015ca76d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d913ab5d872a03f8.xdr b/test-lcm/InvokeHostFunctionTests/d913ab5d872a03f8.xdr new file mode 100644 index 0000000000..9ac28885f4 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d913ab5d872a03f8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/d927cb7228c4823f.xdr b/test-lcm/InvokeHostFunctionTests/d927cb7228c4823f.xdr new file mode 100644 index 0000000000..7890ca8a99 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/d927cb7228c4823f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/da22a08dbb5b6591.xdr b/test-lcm/InvokeHostFunctionTests/da22a08dbb5b6591.xdr new file mode 100644 index 0000000000..b8c52c2c34 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/da22a08dbb5b6591.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/da9288450114401d.xdr b/test-lcm/InvokeHostFunctionTests/da9288450114401d.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/da9288450114401d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/db09947c9187fb8f.xdr b/test-lcm/InvokeHostFunctionTests/db09947c9187fb8f.xdr new file mode 100644 index 0000000000..e1b0a2809e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/db09947c9187fb8f.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dbade792400bbd36.xdr b/test-lcm/InvokeHostFunctionTests/dbade792400bbd36.xdr new file mode 100644 index 0000000000..dbc1ca1190 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dbade792400bbd36.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr b/test-lcm/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dc8cff5869997641.xdr b/test-lcm/InvokeHostFunctionTests/dc8cff5869997641.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dc8cff5869997641.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dcc73c9629f5a427.xdr b/test-lcm/InvokeHostFunctionTests/dcc73c9629f5a427.xdr new file mode 100644 index 0000000000..42dc51361e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dcc73c9629f5a427.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/deaef712a256815b.xdr b/test-lcm/InvokeHostFunctionTests/deaef712a256815b.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/deaef712a256815b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/debccecc0064889e.xdr b/test-lcm/InvokeHostFunctionTests/debccecc0064889e.xdr new file mode 100644 index 0000000000..90a2e592c7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/debccecc0064889e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr b/test-lcm/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dfd8d97545a410c4.xdr b/test-lcm/InvokeHostFunctionTests/dfd8d97545a410c4.xdr new file mode 100644 index 0000000000..0b8a9c61c9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dfd8d97545a410c4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/dff72321aec96f70.xdr b/test-lcm/InvokeHostFunctionTests/dff72321aec96f70.xdr new file mode 100644 index 0000000000..46311cfaaa Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/dff72321aec96f70.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e0180b51b72fe65a.xdr b/test-lcm/InvokeHostFunctionTests/e0180b51b72fe65a.xdr new file mode 100644 index 0000000000..d4882511c0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e0180b51b72fe65a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e095dd79e65ba973.xdr b/test-lcm/InvokeHostFunctionTests/e095dd79e65ba973.xdr new file mode 100644 index 0000000000..523efc1114 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e095dd79e65ba973.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e0f09f1dcf955676.xdr b/test-lcm/InvokeHostFunctionTests/e0f09f1dcf955676.xdr new file mode 100644 index 0000000000..4286a08060 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e0f09f1dcf955676.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e17007564165c691.xdr b/test-lcm/InvokeHostFunctionTests/e17007564165c691.xdr new file mode 100644 index 0000000000..05f4158b58 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e17007564165c691.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr b/test-lcm/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr new file mode 100644 index 0000000000..4a5fc842e5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr b/test-lcm/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr new file mode 100644 index 0000000000..4d971d21e1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr b/test-lcm/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr b/test-lcm/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr b/test-lcm/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr new file mode 100644 index 0000000000..1e52a5f76f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e267116f1684f812.xdr b/test-lcm/InvokeHostFunctionTests/e267116f1684f812.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e267116f1684f812.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e26ad1849453e9f9.xdr b/test-lcm/InvokeHostFunctionTests/e26ad1849453e9f9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e26ad1849453e9f9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e2df180a92959730.xdr b/test-lcm/InvokeHostFunctionTests/e2df180a92959730.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e2df180a92959730.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e3fb4fe5cfe74d62.xdr b/test-lcm/InvokeHostFunctionTests/e3fb4fe5cfe74d62.xdr new file mode 100644 index 0000000000..ce286b1253 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e3fb4fe5cfe74d62.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e436eae1b108bf65.xdr b/test-lcm/InvokeHostFunctionTests/e436eae1b108bf65.xdr new file mode 100644 index 0000000000..ac0030ff5c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e436eae1b108bf65.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e48f578b74a713cb.xdr b/test-lcm/InvokeHostFunctionTests/e48f578b74a713cb.xdr new file mode 100644 index 0000000000..715c49d0c1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e48f578b74a713cb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e4a693d475f137c9.xdr b/test-lcm/InvokeHostFunctionTests/e4a693d475f137c9.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e4a693d475f137c9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e4a7e26b2bd75a51.xdr b/test-lcm/InvokeHostFunctionTests/e4a7e26b2bd75a51.xdr new file mode 100644 index 0000000000..3a37c704de Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e4a7e26b2bd75a51.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e4b75527318c3f4b.xdr b/test-lcm/InvokeHostFunctionTests/e4b75527318c3f4b.xdr new file mode 100644 index 0000000000..3d9d7ab08f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e4b75527318c3f4b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e58ecf019fb8ef4c.xdr b/test-lcm/InvokeHostFunctionTests/e58ecf019fb8ef4c.xdr new file mode 100644 index 0000000000..a372bbf7d5 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e58ecf019fb8ef4c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr b/test-lcm/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr new file mode 100644 index 0000000000..145caa6a60 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e595ac8447e8be48.xdr b/test-lcm/InvokeHostFunctionTests/e595ac8447e8be48.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e595ac8447e8be48.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e60437880d9a5342.xdr b/test-lcm/InvokeHostFunctionTests/e60437880d9a5342.xdr new file mode 100644 index 0000000000..427809b573 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e60437880d9a5342.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr b/test-lcm/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr new file mode 100644 index 0000000000..d470899f42 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e663576331e88873.xdr b/test-lcm/InvokeHostFunctionTests/e663576331e88873.xdr new file mode 100644 index 0000000000..bcf0a29461 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e663576331e88873.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e668e4a1eb385caf.xdr b/test-lcm/InvokeHostFunctionTests/e668e4a1eb385caf.xdr new file mode 100644 index 0000000000..3de2076030 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e668e4a1eb385caf.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr b/test-lcm/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e7c93b4b2532635a.xdr b/test-lcm/InvokeHostFunctionTests/e7c93b4b2532635a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e7c93b4b2532635a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e847e07471896a84.xdr b/test-lcm/InvokeHostFunctionTests/e847e07471896a84.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e847e07471896a84.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e8e3a93f6508722e.xdr b/test-lcm/InvokeHostFunctionTests/e8e3a93f6508722e.xdr new file mode 100644 index 0000000000..1343a03fb8 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e8e3a93f6508722e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e8e94108c4e35442.xdr b/test-lcm/InvokeHostFunctionTests/e8e94108c4e35442.xdr new file mode 100644 index 0000000000..142c0c1b07 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e8e94108c4e35442.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e970c80dd6512e2a.xdr b/test-lcm/InvokeHostFunctionTests/e970c80dd6512e2a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e970c80dd6512e2a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e978d88c40ed87f1.xdr b/test-lcm/InvokeHostFunctionTests/e978d88c40ed87f1.xdr new file mode 100644 index 0000000000..ece2904c94 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e978d88c40ed87f1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e999346808076671.xdr b/test-lcm/InvokeHostFunctionTests/e999346808076671.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e999346808076671.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr b/test-lcm/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ea4a1267d6c3a211.xdr b/test-lcm/InvokeHostFunctionTests/ea4a1267d6c3a211.xdr new file mode 100644 index 0000000000..7708a9fc81 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ea4a1267d6c3a211.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ea940d6997fea54c.xdr b/test-lcm/InvokeHostFunctionTests/ea940d6997fea54c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ea940d6997fea54c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eaa4c6f56373a470.xdr b/test-lcm/InvokeHostFunctionTests/eaa4c6f56373a470.xdr new file mode 100644 index 0000000000..9b0f984786 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eaa4c6f56373a470.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eadfba1154674062.xdr b/test-lcm/InvokeHostFunctionTests/eadfba1154674062.xdr new file mode 100644 index 0000000000..ecd1104a05 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eadfba1154674062.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ec29598b16b053bc.xdr b/test-lcm/InvokeHostFunctionTests/ec29598b16b053bc.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ec29598b16b053bc.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr b/test-lcm/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr new file mode 100644 index 0000000000..7f5b928126 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr b/test-lcm/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr new file mode 100644 index 0000000000..123ce2fa81 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ed348cde4f3127e8.xdr b/test-lcm/InvokeHostFunctionTests/ed348cde4f3127e8.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ed348cde4f3127e8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ed39ca2daf59835d.xdr b/test-lcm/InvokeHostFunctionTests/ed39ca2daf59835d.xdr new file mode 100644 index 0000000000..09a338d9f6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ed39ca2daf59835d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ed4083446fa69ab7.xdr b/test-lcm/InvokeHostFunctionTests/ed4083446fa69ab7.xdr new file mode 100644 index 0000000000..8ee2c1f56c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ed4083446fa69ab7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ed66735578635c64.xdr b/test-lcm/InvokeHostFunctionTests/ed66735578635c64.xdr new file mode 100644 index 0000000000..ba73378e2b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ed66735578635c64.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr b/test-lcm/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr new file mode 100644 index 0000000000..23b330cc49 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eda3dfe5b6940848.xdr b/test-lcm/InvokeHostFunctionTests/eda3dfe5b6940848.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eda3dfe5b6940848.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eda811ebbd672d8d.xdr b/test-lcm/InvokeHostFunctionTests/eda811ebbd672d8d.xdr new file mode 100644 index 0000000000..1bf4cb145b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eda811ebbd672d8d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/edeef19bce43c3da.xdr b/test-lcm/InvokeHostFunctionTests/edeef19bce43c3da.xdr new file mode 100644 index 0000000000..ab1f8db234 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/edeef19bce43c3da.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/edf8d15f65abdd7c.xdr b/test-lcm/InvokeHostFunctionTests/edf8d15f65abdd7c.xdr new file mode 100644 index 0000000000..7e2c482a61 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/edf8d15f65abdd7c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr b/test-lcm/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ee277035f023392a.xdr b/test-lcm/InvokeHostFunctionTests/ee277035f023392a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ee277035f023392a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr b/test-lcm/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr new file mode 100644 index 0000000000..a0b6918152 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ee3472dd29024e40.xdr b/test-lcm/InvokeHostFunctionTests/ee3472dd29024e40.xdr new file mode 100644 index 0000000000..1a4cd29190 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ee3472dd29024e40.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/eee17f706f7deb9a.xdr b/test-lcm/InvokeHostFunctionTests/eee17f706f7deb9a.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/eee17f706f7deb9a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ef37aff90281f523.xdr b/test-lcm/InvokeHostFunctionTests/ef37aff90281f523.xdr new file mode 100644 index 0000000000..6d7b93648f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ef37aff90281f523.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ef78b3de24d812f7.xdr b/test-lcm/InvokeHostFunctionTests/ef78b3de24d812f7.xdr new file mode 100644 index 0000000000..a671b0d000 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ef78b3de24d812f7.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ef79595a3c250a3a.xdr b/test-lcm/InvokeHostFunctionTests/ef79595a3c250a3a.xdr new file mode 100644 index 0000000000..0b18449426 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ef79595a3c250a3a.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ef80e6a78893c56c.xdr b/test-lcm/InvokeHostFunctionTests/ef80e6a78893c56c.xdr new file mode 100644 index 0000000000..8dcb113fa3 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ef80e6a78893c56c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr b/test-lcm/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr new file mode 100644 index 0000000000..77e5079c5f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/efd47464023e9e55.xdr b/test-lcm/InvokeHostFunctionTests/efd47464023e9e55.xdr new file mode 100644 index 0000000000..5add7c85c9 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/efd47464023e9e55.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/efe4261cc946881e.xdr b/test-lcm/InvokeHostFunctionTests/efe4261cc946881e.xdr new file mode 100644 index 0000000000..63df99648e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/efe4261cc946881e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f0638599b34ec8a1.xdr b/test-lcm/InvokeHostFunctionTests/f0638599b34ec8a1.xdr new file mode 100644 index 0000000000..b19abe508e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f0638599b34ec8a1.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f0ae5731df64cbe0.xdr b/test-lcm/InvokeHostFunctionTests/f0ae5731df64cbe0.xdr new file mode 100644 index 0000000000..c4df586623 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f0ae5731df64cbe0.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr b/test-lcm/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr new file mode 100644 index 0000000000..88a2eb90ee Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f168c76aba835145.xdr b/test-lcm/InvokeHostFunctionTests/f168c76aba835145.xdr new file mode 100644 index 0000000000..13dd528c04 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f168c76aba835145.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f17be5b4b66ea006.xdr b/test-lcm/InvokeHostFunctionTests/f17be5b4b66ea006.xdr new file mode 100644 index 0000000000..ce3d971dd6 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f17be5b4b66ea006.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr b/test-lcm/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr new file mode 100644 index 0000000000..aa60cda2e0 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f1f574cc8ac44007.xdr b/test-lcm/InvokeHostFunctionTests/f1f574cc8ac44007.xdr new file mode 100644 index 0000000000..100f4f98ec Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f1f574cc8ac44007.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f1fc663779e87b60.xdr b/test-lcm/InvokeHostFunctionTests/f1fc663779e87b60.xdr new file mode 100644 index 0000000000..e9cb648c1f Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f1fc663779e87b60.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f2530b53ad33fc1e.xdr b/test-lcm/InvokeHostFunctionTests/f2530b53ad33fc1e.xdr new file mode 100644 index 0000000000..1b27851854 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f2530b53ad33fc1e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f26b5de9280bbacd.xdr b/test-lcm/InvokeHostFunctionTests/f26b5de9280bbacd.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f26b5de9280bbacd.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f27c6aef8abbd723.xdr b/test-lcm/InvokeHostFunctionTests/f27c6aef8abbd723.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f27c6aef8abbd723.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr b/test-lcm/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr new file mode 100644 index 0000000000..7be026b29c Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr b/test-lcm/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr new file mode 100644 index 0000000000..71ae737ced Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr b/test-lcm/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f3230f7682e7de69.xdr b/test-lcm/InvokeHostFunctionTests/f3230f7682e7de69.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f3230f7682e7de69.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f43fbd97002badc6.xdr b/test-lcm/InvokeHostFunctionTests/f43fbd97002badc6.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f43fbd97002badc6.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f4f351372abade91.xdr b/test-lcm/InvokeHostFunctionTests/f4f351372abade91.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f4f351372abade91.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f506528d32fd0652.xdr b/test-lcm/InvokeHostFunctionTests/f506528d32fd0652.xdr new file mode 100644 index 0000000000..51c57be5ac Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f506528d32fd0652.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f538b7222e421b51.xdr b/test-lcm/InvokeHostFunctionTests/f538b7222e421b51.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f538b7222e421b51.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f57219130594aa83.xdr b/test-lcm/InvokeHostFunctionTests/f57219130594aa83.xdr new file mode 100644 index 0000000000..b2445243a7 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f57219130594aa83.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f5d072a9fb1463da.xdr b/test-lcm/InvokeHostFunctionTests/f5d072a9fb1463da.xdr new file mode 100644 index 0000000000..8742bc75ea Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f5d072a9fb1463da.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f5d58a30f834542b.xdr b/test-lcm/InvokeHostFunctionTests/f5d58a30f834542b.xdr new file mode 100644 index 0000000000..1efbdc3f7e Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f5d58a30f834542b.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f709a2d8db627467.xdr b/test-lcm/InvokeHostFunctionTests/f709a2d8db627467.xdr new file mode 100644 index 0000000000..0c7cdcd88a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f709a2d8db627467.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f7b2eaed80de4146.xdr b/test-lcm/InvokeHostFunctionTests/f7b2eaed80de4146.xdr new file mode 100644 index 0000000000..426690440b Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f7b2eaed80de4146.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f7ca893de81e0719.xdr b/test-lcm/InvokeHostFunctionTests/f7ca893de81e0719.xdr new file mode 100644 index 0000000000..f87fb6bd28 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f7ca893de81e0719.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f7e97011ed711385.xdr b/test-lcm/InvokeHostFunctionTests/f7e97011ed711385.xdr new file mode 100644 index 0000000000..1b807dbd94 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f7e97011ed711385.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f7f94eb704afa841.xdr b/test-lcm/InvokeHostFunctionTests/f7f94eb704afa841.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f7f94eb704afa841.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f80ab46aebfceee5.xdr b/test-lcm/InvokeHostFunctionTests/f80ab46aebfceee5.xdr new file mode 100644 index 0000000000..455c780cfd Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f80ab46aebfceee5.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f85719dc2181f545.xdr b/test-lcm/InvokeHostFunctionTests/f85719dc2181f545.xdr new file mode 100644 index 0000000000..5acc91ac67 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f85719dc2181f545.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f860f4c299f7c690.xdr b/test-lcm/InvokeHostFunctionTests/f860f4c299f7c690.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f860f4c299f7c690.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr b/test-lcm/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr new file mode 100644 index 0000000000..df56b8b824 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/f98d63a422dc7316.xdr b/test-lcm/InvokeHostFunctionTests/f98d63a422dc7316.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/f98d63a422dc7316.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr b/test-lcm/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr new file mode 100644 index 0000000000..032fe0de13 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr b/test-lcm/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr b/test-lcm/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr new file mode 100644 index 0000000000..0dace05741 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr b/test-lcm/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fa8d540011cb479c.xdr b/test-lcm/InvokeHostFunctionTests/fa8d540011cb479c.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fa8d540011cb479c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fb103634b7406e33.xdr b/test-lcm/InvokeHostFunctionTests/fb103634b7406e33.xdr new file mode 100644 index 0000000000..e9daf5b4d1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fb103634b7406e33.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fb5372535aab3beb.xdr b/test-lcm/InvokeHostFunctionTests/fb5372535aab3beb.xdr new file mode 100644 index 0000000000..466eb51c4a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fb5372535aab3beb.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr b/test-lcm/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr new file mode 100644 index 0000000000..f701081553 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fc180de263c6378d.xdr b/test-lcm/InvokeHostFunctionTests/fc180de263c6378d.xdr new file mode 100644 index 0000000000..f49006a8f1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fc180de263c6378d.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr b/test-lcm/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr new file mode 100644 index 0000000000..34d0e732ce Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fca3eb413e17400c.xdr b/test-lcm/InvokeHostFunctionTests/fca3eb413e17400c.xdr new file mode 100644 index 0000000000..5c1b6540df Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fca3eb413e17400c.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr b/test-lcm/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr new file mode 100644 index 0000000000..d719e072bb Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fcc7940f9747ef41.xdr b/test-lcm/InvokeHostFunctionTests/fcc7940f9747ef41.xdr new file mode 100644 index 0000000000..f6f3dbefaf Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fcc7940f9747ef41.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fdc0726b33a30b71.xdr b/test-lcm/InvokeHostFunctionTests/fdc0726b33a30b71.xdr new file mode 100644 index 0000000000..c8138190b1 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fdc0726b33a30b71.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/fecb8c7203544f20.xdr b/test-lcm/InvokeHostFunctionTests/fecb8c7203544f20.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/fecb8c7203544f20.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr b/test-lcm/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr new file mode 100644 index 0000000000..fa70d3a2ce Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ff35b35da8c78163.xdr b/test-lcm/InvokeHostFunctionTests/ff35b35da8c78163.xdr new file mode 100644 index 0000000000..ae667e823a Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ff35b35da8c78163.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/ffde1b7463c8c452.xdr b/test-lcm/InvokeHostFunctionTests/ffde1b7463c8c452.xdr new file mode 100644 index 0000000000..32c2bfd327 Binary files /dev/null and b/test-lcm/InvokeHostFunctionTests/ffde1b7463c8c452.xdr differ diff --git a/test-lcm/InvokeHostFunctionTests/index.json b/test-lcm/InvokeHostFunctionTests/index.json new file mode 100644 index 0000000000..fcf1fcb09c --- /dev/null +++ b/test-lcm/InvokeHostFunctionTests/index.json @@ -0,0 +1,672 @@ +{ + "0046300f950c0211" : "Soroban_authorization-default_classic_account-deep_tree-incorrect_signature_payload", + "00e76ef8f869401f" : "Soroban_authorization-classic_and_custom_accounts-single_call-unused_auth_entries-failure_with_malformed_function_name", + "014fcfa4f59b51d4" : "Soroban_footprint_validation-invokeHostFunction-readOnly-config_setting", + "018599ef4068218e" : "Soroban_authorization-default_classic_account-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "03560ea94d548ceb" : "Soroban_authorization-multisig_classic_account-single_call-unused_auth_entries-failure_with_malformed_function_name", + "03a5e8d5ea1d3a10" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_9", + "03df1dc73d71eb00" : "Module_cache_cost_with_restore_gaps-scenario_B-_restore_and_invoke_in_same_ledger", + "04530f6112a41176" : "ledger_entry_size_limit_enforced-contract_code_limits", + "048c93e37abb62ea" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_and_a_successful_restore_in_the_same_stage", + "04b00b08d10222a3" : "contract_storage-protocol_version_26-footprint-unused_readWrite_key", + "0525df1061c74b13" : "charge_rent_fees_for_storage_resize-resize_and_extend-failed_due_to_low_fee", + "0540c58d02f9c06b" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-across_stages", + "068bb21d88974e0d" : "Soroban_authorization-custom_account-deep_tree-unused_auth_entries-failure_with_malformed_function_name", + "06cbc0fe2a3f8280" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_8", + "0718f219d05d95c5" : "parallel_txs-delete_and_re-create_temporary_entry_with_lower_TTL-same_stage", + "075b4bea01d35444" : "Soroban_authorization-classic_account_with_weights-wide_tree-success", + "07c78b13b19c1cca" : "Soroban_authorization-default_classic_account-deep_tree-unused_auth_entries-failure_with_malformed_function_name", + "091f6d22b48f7501" : "Soroban_footprint_validation-invokeHostFunction-readWrite-native_asset_trustline", + "0969395bd2bae61c" : "parallel_txs-delete_and_re-create_persistent_entry_with_lower_TTL-same_stage", + "09b571acb76aa819" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_first_restore", + "09e3525781c1197d" : "Soroban_authorization-custom_account-deep_tree-success_with_duplicate_auth_entries", + "09efa855e6310bd6" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_10", + "0a490b46a65b3382" : "Soroban_authorization-multisig_classic_account-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "0a50a6fd01fac663" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_1", + "0a5c74765d1481ad" : "Soroban_authorization-multisig_classic_account-deep_tree-success", + "0a7c39ca98f1ae85" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "0a9a9e7662e8f5b0" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-issuer_trustline", + "0b38afb8b9aaa794" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-insufficient_fee_bumper_balance", + "0c35da322a33f3c2" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_13", + "0c43ba995c341a31" : "Soroban_authorization-classic_account_with_weights-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "0c92eb78da37bfdd" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_second_restore", + "0cb06b7800ce099c" : "Soroban_authorization-multisig_classic_account-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "0cfa6a9a348ad29f" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-TTL_entry", + "0d6e850f5668faef" : "Soroban_authorization-custom_account-deep_tree-success", + "0e54ece7b7219a81" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_0", + "0f52e3b7b517991a" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_12", + "0f97452228eac10a" : "Soroban_authorization-default_classic_account-deep_tree-success", + "102ec8047ba9b73e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_7", + "11caaacc02cfaf33" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_17", + "11db6d39fd0eae58" : "state_archival-protocol_version_26-TTL_threshold", + "12400eda8720567b" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-insufficient_write_bytes", + "12e5bf578c813325" : "overly_large_soroban_values_are_handled_gracefully-diagnostics", + "133235aeb624b4fb" : "ledger_entry_size_limit_enforced-contract_data_limits", + "13ddfbcd91340230" : "Module_cache_cost_with_restore_gaps-scenario_A-_restore_in_one_ledger,_invoke_in_next", + "13f416a9b53c779a" : "Soroban_authorization-custom_account-wide_tree-incorrect_signature_payload", + "14407acab9b18289" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-native_asset_trustline", + "1452c35fbbe6c3ab" : "Soroban_authorization-multisig_classic_account-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "1484cd9b56513ed7" : "Soroban_classic_account_authentication-default_account-wrong_signature_name", + "15bc83b6792d6072" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-incorrect_signature_payload", + "15ecaba55fd111cc" : "autorestore_with_storage_resize-manual_restore-extend_only", + "1648891cd7b9ac4f" : "Soroban_authorization-custom_account-single_call-success_with_duplicate_auth_entries", + "165a1612aefb1f12" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_19", + "169611b4e9b946c9" : "resource_fee_exceeds_uint32-self_fee_bump-success-inclusion_fee_and_refund_exceed_uint32", + "169eaf7fc82af3dc" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_insufficient_single_signature_threshold", + "16bac056666df725" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_2", + "192dc34906478ab9" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_17", + "193297e2240649fc" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore-across_stages", + "1967a2d9962bb619" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_14", + "198ad94ac0412a8b" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_7", + "1a8c5902e4afd03e" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_8", + "1adc68cc7a5cf88e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-issuer_trustline", + "1b18e4016bfdf294" : "contract_constructor_support-constructor_with_no_arguments-v1_host_function,_v2_auth", + "1c3d83a0318651b9" : "contract_errors_cause_transaction_to_fail-err", + "1d5bfe4be2ebaacb" : "source_account_of_first_tx_is_in_second_txs_footprint-protocol_version_26", + "1d8e86ddd8b11e7b" : "state_archival-protocol_version_26-conditional_TTL_extension-calculate_refund", + "1dd0d92b94ce7c6f" : "Soroban_authorization-classic_account_with_weights-single_call-incorrect_signature_payload", + "1e0b81121b9c895c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_1", + "1e3c70b0ecdbfb4f" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore-autorestore", + "1ec1111288c846ad" : "Soroban_classic_account_authentication-default_account_with_additional_signer-incomplete_key", + "1f62f6743bb52550" : "readonly_ttl_bumps_across_threads_and_stages-multiple_readonly_ttl_bumps_same_stage", + "2076a51f648569cd" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore", + "20868c9e218c2273" : "state_archival-protocol_version_26-contract_storage_archival-TTL_enforcement-entry_accessible_when_currentLedger_==_liveUntilLedger", + "20a6a4892d5acc69" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_across_stages", + "20b9b462d5735ae2" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_field_order", + "20c2b0f439ace889" : "Soroban_classic_account_authentication-account_with_weights-success", + "211f4a93951f94b4" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_5", + "21938ae254995cd4" : "Soroban_classic_account_authentication-account_with_weights-empty_vector_signature", + "21ac7793688994ad" : "Soroban_footprint_validation-invokeHostFunction-readWrite-data", + "21c43b92b819267f" : "Trustline_stellar_asset_contract-protocol_version_26", + "21e553dd1071721a" : "autorestore_contract_instance-restore_with_write", + "221f1cad327fb891" : "Stellar_asset_contract_transfer_with_CAP-67_address_types-native_asset", + "227f785ddbb9ab40" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_4", + "2287bf75d44d6db2" : "Soroban_classic_account_authentication-account_with_required_multisig-incomplete_signature", + "22c6c1fecdd3222c" : "Soroban_authorization-multisig_classic_account-wide_tree-success_with_duplicate_auth_entries", + "22df21f5f58e57ba" : "complex_contract-diagnostics_disabled", + "2342772cbe3d3e0c" : "Soroban_footprint_validation-restoreOp-readOnly_footprint_not_empty", + "23733e3ae41a70ad" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_14", + "23900da58ed1ec25" : "Soroban_classic_account_authentication-default_account_with_additional_signer-missing_key_field", + "23a89388bfb65808" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_9", + "246b195d9beac8d6" : "Soroban_authorization-custom_account-wide_tree-success_for_tree_with_extra_nodes", + "24bce78365780bb1" : "classic_payment_to_soroban_fee_bump_account-protocol_version_26", + "25e5dd2fc7614ea7" : "Failed_write_still_causes_ttl_observation", + "266b724000b97eb7" : "Soroban_footprint_validation-restoreOp-temp_entries_are_not_allowed", + "2691da61cb031c32" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-same_stage", + "26fb40313adc084c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_15", + "2703a3e0e62612e8" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_11", + "279b3ea1936ed91c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_7", + "28480490bc8a3fae" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-success_for_tree_with_extra_nodes", + "285f5877a54deb4e" : "Soroban_footprint_validation-invokeHostFunction-readWrite-contract_data_key_above_limit", + "286138b521aa29ed" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_20", + "28e6a6a32da1fb63" : "Soroban_authorization-multisig_classic_account-deep_tree-success_with_duplicate_auth_entries", + "293f7ed0e476294c" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_17", + "2951f9e3e0241cc4" : "Soroban_authorization-custom_account-single_call-no_auth", + "2963054aff2cd923" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_17", + "29b03d37cd3099be" : "contract_storage-protocol_version_26-footprint-no_footprint", + "2ace299730fbdd52" : "fee_bump_refund_account_merged-protocol_version_26", + "2af87dc6245a802c" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_key_name", + "2b19e70a8b41485f" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_13", + "2c26a7ba5b931a86" : "Soroban_classic_account_authentication-default_account-wrong_key_name", + "2ce02d45eeb17f14" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-claimable_balance", + "2d96d9114eebd574" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_2", + "2df8d3e47d3c0bbd" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_18", + "2e0f619df17d9178" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_11", + "2e8a9747bf075ec1" : "Soroban_footprint_validation-invokeHostFunction-readWrite-offer", + "2e93251358cac25c" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_15", + "2ea8bcb3f8d6be16" : "Soroban_authorization-classic_and_custom_accounts-single_call-success", + "2eb7c4a770d05ab6" : "Soroban_classic_account_authentication-account_with_required_multisig-incomplete_key", + "2f06a14dfcb5cd88" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-success_with_duplicate_auth_entries", + "303dce5b05111d4b" : "Soroban_authorization-multisig_classic_account-deep_tree-incorrect_signature_payload", + "311f3f548207d5d6" : "Soroban_authorization-multisig_classic_account-wide_tree-incorrect_signature_payload", + "3152146ae3e1601f" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_11", + "318b008d239ea9d8" : "Module_cache", + "3279e450f885436a" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-across_stages", + "329c8076e0ba5976" : "Soroban_footprint_validation-invokeHostFunction-readWrite-TTL_entry", + "32e313f52f20cae1" : "Soroban_classic_account_authentication-default_account-uninitialized_map", + "3304ede4be3e7951" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_19", + "333dd414de3cff58" : "Soroban_classic_account_authentication-default_account-empty_map", + "3344d57a6c44b645" : "Soroban_authorization-default_classic_account-wide_tree-success_with_duplicate_auth_entries", + "3351d4c3d6daa80b" : "Soroban_classic_account_authentication-account_with_required_multisig-uninitialized_map", + "33541948d53d210f" : "Soroban_footprint_validation-invokeHostFunction-readOnly-offer", + "33f7502a4490dbc8" : "Soroban_authorization-classic_account_with_weights-deep_tree-success_with_duplicate_auth_entries", + "343cb2cb92cd8aca" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-no_auth", + "35117649a10b863c" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_11", + "35b99a95ff36fd47" : "Soroban_authorization-default_classic_account-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "36193429a9fd13f9" : "Soroban_authorization-classic_account_with_weights-single_call-failure_for_tree_with_missing_node", + "3670ca64370e86e7" : "Soroban_classic_account_authentication-account_with_too_low_master_weight_not_authenticated", + "369cf252c2e22d4e" : "Soroban_footprint_validation-autorestore_footprint-temporary_key_marked_as_archived", + "36cdfb826504ca41" : "Soroban_classic_account_authentication-account_with_weights-uninitialized_map", + "36d1886765b0101c" : "Soroban_authorization-default_classic_account-wide_tree-incorrect_signature_payload", + "370b65bf45bf359a" : "Soroban_footprint_validation-invokeHostFunction-readWrite-claimable_balance", + "372873b046d26a73" : "transaction_validation_diagnostics", + "375e418b328316a8" : "Soroban_classic_account_authentication-default_account-incomplete_signature", + "38cfd148d6296478" : "basic_contract_invocation-protocol_version_26-insufficient_instructions", + "38d9c5df4335cbbf" : "Soroban_authorization-multisig_classic_account-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "394272a31b2f42f9" : "Soroban_footprint_validation-invokeHostFunction-readWrite-liquidity_pool", + "39cb1e990e856d1d" : "basic_contract_invocation-protocol_version_26-incorrect_invocation_parameters-too_few_parameters", + "3abe7e7946b3a3aa" : "charge_rent_fees_for_storage_resize-resize_with_no_extend-failed_due_to_low_fee", + "3ae3a09a2ac1bace" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_19", + "3b0802ffb3b76400" : "Soroban_classic_account_authentication-default_account_with_additional_signer-missing_signature_field", + "3c1ebb13484322b9" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_2", + "3c84ec0cd4e29a9e" : "Soroban_authorization-classic_account_with_weights-deep_tree-success", + "3db91544d5ae2281" : "settings_upgrade-from_init_settings", + "3e658e0ecfc377ad" : "multiple_soroban_ops_in_a_tx-protocol_version_26-with_fee_bump", + "3ebb523abd74e1c1" : "readonly_ttl_bumps_across_threads_and_stages-extend_persistent_contract_function_across_stages", + "3ed1bb2f1af2ea38" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_low_resource_fee", + "3ef1fb92602e14d5" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-manual_restore-across_stages", + "3f41a40a5611b7d8" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-failure_with_malformed_function_name", + "40cc10c2a3fe22f0" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_18", + "40fc1592b7b8d9a7" : "Soroban_classic_account_authentication-default_account-wrong_field_order", + "416716038d1bf264" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_delete", + "41a75a802c103130" : "Soroban_classic_account_authentication-default_account_with_additional_signer-success", + "432866f9e4658727" : "Soroban_classic_account_authentication-default_account_with_additional_signer-uninitialized_map", + "43509a8017a394ec" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_signature_name", + "43aa6585c53544c0" : "Soroban_classic_account_authentication-default_account_with_additional_signer-uninitialized_vector_signature", + "43ab812359d242e5" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore,_delete_value_in_next_tx-across_stages", + "43caed795b61ad7c" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-same_stage", + "43d0750bf32a8142" : "Soroban_authorization-classic_and_custom_accounts-single_call-success_for_tree_with_extra_nodes", + "4403f2717365f3f1" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-success_for_tree_with_extra_nodes", + "444e7910e5721658" : "Soroban_authorization-default_classic_account-wide_tree-no_auth", + "44aed0d0d619653f" : "basic_contract_invocation-protocol_version_26-insufficient_read_bytes_before_p23", + "44ed42af0c335da0" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_15", + "45bb7c67fa144f76" : "Soroban_classic_account_authentication-account_with_required_multisig-empty_vector_signature", + "45fafb2b89af5af9" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_7", + "463cc045e4e770ef" : "loadgen_Wasm_executes_properly", + "46841d2f33918f97" : "Soroban_authorization-multisig_classic_account-single_call-failure_for_tree_with_missing_node", + "46bb33ad49f0924d" : "Soroban_authorization-classic_account_with_weights-single_call-no_auth", + "46bc30f464b80820" : "Soroban_footprint_validation-invokeHostFunction-readWrite-valid", + "46ee08cbe6a5345e" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_0", + "471f63ec9db5a9dd" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_19", + "472ac360b2cee870" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-claimable_balance", + "47efc2a10557bd97" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_0", + "47fee2a3bc870ecc" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-same_stage", + "485a9f1997660b04" : "Soroban_footprint_validation-autorestore_footprint-classic_key_marked_as_archived", + "4876c2f30088ca20" : "Soroban_authorization-classic_account_with_weights-single_call-success_for_tree_with_extra_nodes", + "48c781bbceb21112" : "basic_contract_invocation-protocol_version_26-correct_invocation", + "490a163425465416" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_9", + "49689aae806682f8" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_16", + "49f65f2d365f1cf2" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-failure_for_tree_with_missing_node", + "4a1932cf528ee7ca" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_key_name", + "4a8c58a85988d163" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_4", + "4aa2d8d102f584a4" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_16", + "4ae7dbea4b507a75" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_5", + "4b4fde93869500d3" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_3", + "4b7e19f44373ff48" : "Soroban_footprint_validation-invokeHostFunction-readOnly-liquidity_pool", + "4bc0adc4bfd824ae" : "Soroban_footprint_validation-invokeHostFunction-readOnly-claimable_balance", + "4c5cc01aded482f8" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_18", + "4cd30f7ebe173060" : "Soroban_classic_account_authentication-default_account-missing_key_field", + "4db1a66114f8b194" : "Soroban_authorization-classic_account_with_weights-deep_tree-no_auth", + "4eaeadc112025f27" : "create_in_first_stage_delete_in_second_stage", + "4ee0f3b0ffb1a967" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_18", + "4ff86e8ec6d8f89c" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-empty_map", + "51616f70e97b17d5" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-success_with_arbitrary_valid_function", + "5171bdbde7eb7562" : "Soroban_authorization-custom_account-single_call-unused_auth_entries-failure_with_malformed_function_name", + "519ee0e221d13e7a" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-data", + "51e36c475d33d2bb" : "Soroban_authorization-classic_and_custom_accounts-single_call-unused_auth_entries-success_with_arbitrary_valid_function", + "51f0bd683d0d5829" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "52c707bc77bf01f6" : "Module_cache_miss_on_immediate_execution-separate_ledger_upload_and_execution", + "5320263ea9731510" : "basic_contract_invocation-protocol_version_26-incorrect_invocation_parameters-too_many_parameters", + "536297cefb569ed7" : "Soroban_authorization-custom_account-single_call-unused_auth_entries-success_with_arbitrary_valid_function", + "5365a779053a148d" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_3", + "53b461e8db0fddd1" : "Soroban_authorization-multisig_classic_account-single_call-success_for_tree_with_extra_nodes", + "540eac72b8688d25" : "Soroban_footprint_validation-invokeHostFunction-readOnly-native_asset_trustline", + "5416ca18f9a5fa27" : "state_archival_operation_errors-protocol_version_26-restore_operation-exceeded_writeBytes", + "54e3fdf28cd70bd4" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", + "54f8492f87d26b35" : "Soroban_authorization-default_classic_account-single_call-no_auth", + "569840c5704c5e44" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_16", + "57207be4a3e12536" : "Soroban_classic_account_authentication-account_with_required_multisig-missing_key_field", + "57659d96c64bd183" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_multisig", + "5770d78319f7e869" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee", + "585310a1b2f3c9e1" : "Soroban_classic_account_authentication-multiple_signers_with_insufficient_weight_not_authenticated", + "588e655d03094c0e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_13", + "5897c539e59df560" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-across_stages", + "58d33db7d651fcd6" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_13", + "59096fc089c399f5" : "parallel_txs-delete_and_re-create_persistent_entry_with_lower_TTL-across_stages", + "594d4af3fbb90e26" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-across_stages", + "598b33597b504a5f" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-uninitialized_vector_signature", + "59a15bc254310ed9" : "Soroban_classic_account_authentication-account_with_weights-missing_signature_field", + "59a168278f646f8f" : "Soroban_authorization-classic_account_with_weights-single_call-success_with_duplicate_auth_entries", + "59c181d5ff7acc7e" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore,_delete_value_in_next_tx-same_stage", + "5b5419e7ec6c21c3" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "5bd72d146c15215c" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_Wasm,_not_instance", + "5da4c3861d2a2428" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-same_stage", + "5e733f15f9fe6c15" : "parallel_txs_hit_declared_readBytes-restore", + "5e8558b4e95d77a3" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-liquidity_pool", + "5e95d63123990f96" : "classic_payment_source_same_as_soroban_fee_bump_source-protocol_version_26", + "5f0e7c9e5b14d2fa" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", + "5f7b6356a31b9872" : "Soroban_classic_account_authentication-default_account-wrong_signature_type", + "6031e1f0663cfda5" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_13", + "608765b88758cdff" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-liquidity_pool", + "60d32d465e9ef646" : "Soroban_authorization-classic_account_with_weights-deep_tree-unused_auth_entries-failure_with_malformed_function_name", + "6172930301eec1db" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-empty_vector_signature", + "61aaf65d2d2be2df" : "Soroban_authorization-multisig_classic_account-wide_tree-success_for_tree_with_extra_nodes", + "61f1ec50d0457920" : "Soroban_authorization-default_classic_account-wide_tree-success", + "62ae728143dd1ae3" : "Soroban_authorization-default_classic_account-single_call-failure_for_tree_with_missing_node", + "630112e28640b3dc" : "Soroban_classic_account_authentication-default_account_with_additional_signer-incomplete_signature", + "633ede77405d5244" : "contract_constructor_support-constructor_with_arguments_and_auth", + "63973d7e63330d22" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_23", + "63bf3b0d817b48a3" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-native_asset_trustline", + "6445b19d68f45e62" : "Soroban_authorization-default_classic_account-deep_tree-success_for_tree_with_extra_nodes", + "647908425725f18e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_18", + "64c67c03ad8477ca" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_20", + "64def0179fc4dbe6" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_10", + "6519e434acf354b7" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_9", + "659ac68c6d773240" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-contract_data_key_above_limit", + "65d4ab7a4ee03638" : "contract_errors_cause_transaction_to_fail-ok_val_err", + "660ffaf163aa3a0d" : "Soroban_authorization-custom_account-single_call-unused_auth_entries-failure_with_long_malformed_function_name", + "666cc90ebbdab3dd" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-missing_key_field", + "66755facd883bef4" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-offer", + "6716ff61cd9b5a3f" : "Soroban_authorization-multisig_classic_account-single_call-success_with_duplicate_auth_entries", + "675cca94471892a1" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_4", + "678620649d7edfe9" : "persistent_entry_archival-eviction-key_accessible_after_restore-autorestore", + "67c57dc9f673aa9e" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_field_order", + "68392e6abed97fb5" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore-same_stage", + "6856b0b044010cae" : "Soroban_custom_account_authentication-successful_authentication", + "68f165975379ef6f" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-config_setting", + "69051a1b441d9996" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_8", + "69abe494995566fb" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "69d72740ac448701" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "69ea6faa228bf063" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", + "6a0fcad7207a7356" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_18", + "6a5c2ecc147d9ba9" : "parallel_restore_and_update", + "6b1bba1cde19195d" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-config_setting", + "6b7ea8905416d282" : "contract_constructor_support-constructor_with_no_arguments-v1_host_function,_v1_auth", + "6be1723f2de82c90" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_key_name", + "6c7ee12d6e1882df" : "Soroban_authorization-default_classic_account-single_call-success", + "6ca3ca208041d5d9" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_10", + "6de1fadf0f1a6789" : "version_test", + "6e020886d77520ee" : "Soroban_authorization-classic_account_with_weights-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "6e0258e8cfa3ab47" : "Soroban_footprint_validation-extendOp-valid", + "6e1d5421cf61b82d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-no_auth", + "6f27e3a9c63fca5b" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-data", + "6f3467c6e13a1648" : "Soroban_footprint_validation-extendOp-readWrite_set_with_Soroban_key", + "6fe7ad5169387958" : "parallel_txs-basic_test", + "6ffafbc029e47549" : "Soroban_authorization-default_classic_account-wide_tree-success_for_tree_with_extra_nodes", + "701983d81c015a60" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_12", + "70b7679c1de24a4b" : "Soroban_authorization-custom_account-single_call-failure_for_tree_with_missing_node", + "711a5390f886c7ff" : "basic_contract_invocation-protocol_version_26-account_address", + "714af0a63932eb6b" : "Soroban_authorization-multisig_classic_account-single_call-unused_auth_entries-success_with_arbitrary_valid_function", + "71db73c744a926be" : "Soroban_footprint_validation-soroban_entries-archived_entries-max_+_1", + "725278041cf421e0" : "Soroban_authorization-default_classic_account-single_call-unused_auth_entries-failure_with_malformed_function_name", + "729f8af24dc7fbd8" : "autorestore_with_storage_resize-autorestore", + "72e32d5e4cbe23f2" : "delete_non_existent_entry_with_parallel_apply", + "73d97239afd1a289" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_signature_type", + "7476d7d3f060cf1d" : "overly_large_soroban_values_are_handled_gracefully-event_data", + "749d86ef2b83de64" : "Soroban_footprint_validation-autorestore_footprint-valid_keys", + "74cb309604b87ad5" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_12", + "7560b4ebec62de03" : "Soroban_authorization-classic_and_custom_accounts-single_call-success_with_duplicate_auth_entries", + "75a857ffd876a72d" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_1", + "7623428964713c55" : "Soroban_authorization-multisig_classic_account-wide_tree-failure_for_tree_with_missing_node", + "7624c43e428ee32d" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_4", + "763b53bb30a2499d" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_only-max_+_1", + "77904c0e7819a7eb" : "Soroban_authorization-default_classic_account-wide_tree-failure_for_tree_with_missing_node", + "77b0f96ee78d5679" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_5", + "7811a2db272e2bc5" : "Soroban_authorization-multisig_classic_account-single_call-no_auth", + "781c971d7b58563a" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_15", + "78d19632e893bee4" : "persistent_entry_archival-expiration_without_eviction-restore_with_nonexistent_key", + "7974f01f0568597f" : "autorestore_with_storage_resize-autorestore_with_rent_bump_and_resize", + "7b24f552eb083ed6" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_19", + "7c3fa2905342aef3" : "Soroban_classic_account_authentication-default_account_with_additional_signer-empty_vector_signature", + "7c588d1eada8e956" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_14", + "7c7ac7fe41e94018" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_17", + "7ca0fb2954bbb6c8" : "Soroban_footprint_validation-autorestore_footprint-unsorted_archived_indexes", + "7cf5a062e427a3b3" : "Soroban_custom_account_authentication-void_signature", + "7db90301e11fa5d0" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_key_type", + "7dd9f6410b671c2f" : "overly_large_soroban_values_are_handled_gracefully-store_key", + "7f1fec7fe0be9e43" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_13", + "7f4f40cb7a2fbb6f" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_instance,_not_wasm", + "7f737b8fa30b66b4" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_6", + "7f7e72aa985692ae" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_signature_order", + "811ecb1190787c4f" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_20", + "81c974086b0e4f56" : "Soroban_custom_account_authentication-owner_change", + "824743daeb17e7e9" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_21", + "83e78d1ac27b4951" : "Soroban_authorization-classic_account_with_weights-wide_tree-incorrect_signature_payload", + "83f9b0ae9387fa6d" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-contract_data_key_above_limit", + "841b5a633ba3dcd4" : "Soroban_authorization-custom_account-single_call-success", + "84315cd6d68b5749" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-failure_with_long_malformed_function_name", + "8433fde0f0bbd2f7" : "basic_contract_invocation-protocol_version_26-insufficient_refundable_resource_fee", + "843c6cc8cb69c839" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_1", + "846ca1ad625e9ea7" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_updated_value", + "846db27a79a2ec7d" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore", + "858ea3c6fa587d2c" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_11", + "860c9ebb141ea269" : "Soroban_classic_account_authentication-default_account-missing_signature_field", + "8666b7f3149900ec" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-incomplete_key", + "86c090d2b24bc515" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_write-max_+_1", + "86ec0b605b279d49" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_signature_name", + "875401f18d4d37e0" : "Soroban_classic_account_authentication-account_with_required_multisig-empty_map", + "8848fdad9b841822" : "Soroban_authorization-default_classic_account-deep_tree-no_auth", + "8878f61751a807b8" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_3", + "887c083fc1639e43" : "Soroban_authorization-classic_account_with_weights-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "8900d5bd1b2b9f70" : "Soroban_footprint_validation-invokeHostFunction-readWrite-issuer_trustline", + "891a276e7ce06b91" : "Soroban_authorization-multisig_classic_account-deep_tree-success_for_tree_with_extra_nodes", + "894fd4e0f979d673" : "refund_is_sent_to_fee-bump_source-protocol_version_26", + "895b3456160d157c" : "Soroban_authorization-classic_account_with_weights-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "897ee371b2a80230" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore_then_delete", + "898221ce90bbe12a" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore_then_delete", + "89f9145d00c68451" : "overly_large_soroban_values_are_handled_gracefully-event_topic", + "89fc4f3bfc2e66a6" : "trustline_deletion_then_SAC_payment-protocol_version_26", + "8adead0567fe7d71" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-native_asset_trustline", + "8b13d91d773c9085" : "Soroban_authorization-custom_account-wide_tree-success_with_duplicate_auth_entries", + "8b327a3e8ca7a777" : "state_archival-protocol_version_26-conditional_TTL_extension-absolute_refund", + "8cf745afc0a51283" : "Soroban_footprint_validation-soroban_entries-archived_entries-max", + "8d0a24bb396f996d" : "parallel_txs-delete_and_re-create_temporary_entry_with_lower_TTL-across_stages", + "8dd5261011c6c3bc" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_16", + "8dfbc063af86ec35" : "overly_large_soroban_values_are_handled_gracefully-store_in_instance_storage", + "8e99b44b297caaac" : "Soroban_footprint_validation-restoreOp-valid", + "8f46b4013f8e249b" : "archival_meta-protocol_version_26-Create_temp_entry_with_same_key_as_an_expired_entry_on_eviction_ledger", + "8fa77a7691d9a43d" : "Soroban_classic_account_authentication-account_with_required_multisig-missing_signature_field", + "90153646e94af892" : "state_archival-protocol_version_26-max_TTL_extension-extend_host_function_persistent", + "908acbd3aceb8316" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_11", + "90bf93d9cc8919fb" : "fee_bump_inner_account_merged_then_used_as_inner_account_on_soroban_fee_bump-protocol_version_26", + "90d44cefcaf5f29b" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-incomplete_signature", + "91eb7b4592150c3e" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_6", + "9209c586bd226b99" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_6", + "920a1fad5ca8a29b" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-lifetime_extensions", + "9245f43fc2fba8b0" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-offer", + "92680c457fe83aa7" : "state_archival_operation_errors-protocol_version_26-restore_operation-success", + "92b288c4d95b05f9" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-across_stages", + "930b08e2d077bfdc" : "Soroban_classic_account_authentication-account_with_weights-uninitialized_vector_signature", + "932641f2b5405789" : "overly_large_soroban_values_are_handled_gracefully-return_value", + "93481a30a4ea3f79" : "Soroban_authorization-custom_account-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "93ba029750a86166" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_20", + "940e8bdc84f9af94" : "readonly_ttl_bumps_across_threads_and_stages-readonly_ttl_bumps_with_mixed_stages", + "9435de885ff30026" : "Soroban_authorization-custom_account-wide_tree-no_auth", + "94f5f9a57e087669" : "overly_large_soroban_values_are_handled_gracefully-serialize", + "955397e091e35fad" : "archival_meta-protocol_version_26-temp_entry_meta", + "9592b7d06c5fd16c" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_12", + "95dc94b3567bf81b" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_5", + "95dfceb1b6e1c811" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_10", + "95ede71a6074dc1b" : "Soroban_authorization-custom_account-wide_tree-success", + "964450cc2eb51081" : "Soroban_classic_account_authentication-default_account-wrong_key_type", + "96690328bd10efc5" : "refund_test_with_closeLedger-protocol_version_26", + "98958916fd28f843" : "autorestore_contract_instance-autorestore_fees", + "98dd9afc9aec58e3" : "state_archival-protocol_version_26-contract_storage_archival-write_does_not_increase_TTL", + "99541d3371b2ebcf" : "Module_cache_across_protocol_versions", + "9a2c38c5272df06c" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_14", + "9a4d995b45b4db13" : "Soroban_footprint_validation-autorestore_footprint-index_out_of_bounds", + "9abda59d0cea408b" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_sufficient_single_signature_threshold", + "9b5ea22fe53632fe" : "Soroban_footprint_validation-invokeHostFunction-readOnly-data", + "9b7aa5eb73370090" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_delete_value_in_next_tx-across_stages", + "9c169e4a17366ef4" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_16", + "9c319f6ebbf74238" : "Soroban_authorization-multisig_classic_account-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "9c797412cd0d11b5" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_14", + "9c99d2135d9d7d77" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_update_value_in_next_tx-same_stage", + "9cbd66b8c4018c16" : "Soroban_authorization-classic_account_with_weights-deep_tree-failure_for_tree_with_missing_node", + "9ccccec1202f5b81" : "resource_fee_exceeds_uint32-self_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_high_inclusion_fee", + "9e44fefde737f8bc" : "contract_storage-protocol_version_26-footprint-RO_footprint_for_RW_entry", + "9e7d59169e4ded64" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_key_type", + "9e81b4f36cfd3af7" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_7", + "9f130c1b0c7b7a7a" : "Soroban_classic_account_authentication-account_with_weights-wrong_signature_type", + "9f280040dbfe9ebd" : "overly_large_soroban_values_are_handled_gracefully-store_in_instance_storage_key", + "9fa92df05d0615bf" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_first_restore", + "a0119ab86c638bee" : "Soroban_footprint_validation-autorestore_footprint-entry_in_readOnly_footprint", + "a0964aad16627449" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_update_value_in_next_tx-across_stages", + "a0b7e7243a96c9c6" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_4", + "a0d59eaf3b79413c" : "Soroban_authorization-default_classic_account-deep_tree-success_with_duplicate_auth_entries", + "a0fd94b0902a1c7f" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-manual_restore-same_stage", + "a258cc5505846d79" : "Soroban_authorization-classic_account_with_weights-wide_tree-success_for_tree_with_extra_nodes", + "a4453c1269875574" : "parallel_txs_hit_declared_readBytes-invoke", + "a4f13a2fa6293428" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_delete", + "a71e4d9203d52748" : "Soroban_authorization-classic_and_custom_accounts-single_call-no_auth", + "a72c947ed7b434d3" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_2", + "a80621eee94baae6" : "Soroban_classic_account_authentication-account_with_required_multisig-uninitialized_vector_signature", + "a8a9725a33441cb5" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_signature_type", + "a8d1cb44f470573f" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore-across_stages", + "a904442b4503e607" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_8", + "a94afbf4a15753e8" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-uninitialized_map", + "a9af3a29cf25b4d2" : "Soroban_authorization-classic_and_custom_accounts-single_call-unused_auth_entries-failure_with_long_malformed_function_name", + "aa53f5c640a1c97e" : "resource_fee_exceeds_uint32-self_fee_bump-success-low_inclusion_fee", + "aa722688a0fedfc0" : "refund_account_merged-protocol_version_26", + "ab3bce4773581342" : "Soroban_authorization-custom_account-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "ab898f0b7ce30529" : "classic_phase_bumps_sequence_of_soroban_source_account-protocol_version_26", + "abe9daab6e04747a" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_0", + "ac9dbf09c7cb19e8" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_18", + "ad00903073e6c1d2" : "Soroban_authorization-classic_account_with_weights-wide_tree-failure_for_tree_with_missing_node", + "ad19485cea9fa38c" : "read-only_bumps_across_threads", + "ae601103b9e4498d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-failure_for_tree_with_missing_node", + "aec6a7cfd3c1af73" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_5", + "aef8c4cf49c5cce1" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_8", + "af54a98dbdd88b52" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-TTL_entry", + "afa256621921b22e" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-issuer_trustline", + "afe35bda9ebb3f2c" : "Soroban_authorization-multisig_classic_account-deep_tree-failure_for_tree_with_missing_node", + "b045bf491859a6b8" : "Soroban_authorization-custom_account-deep_tree-no_auth", + "b064c60719fa9bec" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_write-max", + "b136f91677750cd4" : "contract_errors_cause_transaction_to_fail-err_eek", + "b149a7eb981b5ed6" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-classic_keys_count_towards_read_bytes", + "b1d5a1bda5b51e5b" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_17", + "b3082e3bcd3a078c" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore-same_stage", + "b3101bb9f07292f5" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_1", + "b3437be97f124777" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-success", + "b34f3ecaf4fdb062" : "Soroban_classic_account_authentication-default_account-success", + "b3f7fce5e8492f2e" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_16", + "b4148adbbba04047" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-same_stage", + "b5a503183a69e95f" : "contract_errors_cause_transaction_to_fail-ok_err", + "b5e418a8a8cf65b9" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_2", + "b652542975ff5560" : "persistent_entry_archival-eviction-key_accessible_after_restore-restore_op", + "b6ce7aade1aed1e3" : "state_archival_operation_errors-protocol_version_26-extend_operation-success", + "b71e067496723cb3" : "multiple_soroban_ops_in_a_tx-protocol_version_26-without_fee_bump", + "b74618989cc0605c" : "Soroban_non-refundable_resource_fees_are_stable-protocol_version_26", + "b7db472d275c4797" : "autorestore_contract_instance-restore_with_no_writes-insufficient_read_bytes", + "b808b59ac14049b2" : "state_archival-protocol_version_26-max_TTL_extension-extend_host_function_temp", + "b9862c0b86a145aa" : "Soroban_authorization-default_classic_account-single_call-unused_auth_entries-failure_with_long_malformed_function_name", + "b9bdda6eada575ea" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-success", + "ba8824d29063376f" : "resource_fee_exceeds_uint32-other_account_fee_bump-success-inclusion_fee_exceeds_uint32", + "ba9e85782489d4b3" : "Soroban_authorization-default_classic_account-single_call-unused_auth_entries-success_with_arbitrary_valid_function", + "baa71b7a006a3951" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-TTL_entry", + "bb10b7a54991da41" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_3", + "bd0e2c7d9d444eb7" : "state_archival_operation_errors-protocol_version_26-extend_operation-readBytes_limit", + "bd7ec9becd2cf279" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_9", + "bdf21d276e44df51" : "Soroban_classic_account_authentication-account_with_required_multisig-success", + "bdfcd5f448d7a9cd" : "Soroban_authorization-multisig_classic_account-deep_tree-unused_auth_entries-failure_with_malformed_function_name", + "be52cd7f42814b0a" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-across_stages", + "be6ebb5f038aa456" : "Soroban_classic_account_authentication-account_with_too_high_med_threshold_not_authenticated", + "be9fcc614f398cf3" : "Soroban_footprint_validation-invokeHostFunction-readOnly-contract_data_key_above_limit", + "bec5319840022194" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_11", + "bec915835775f88a" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_signature_order", + "beed566485392053" : "Soroban_footprint_validation-autorestore_footprint-duplicate_entries", + "beee405585556b28" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "bf27f88df8fb68c5" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-missing_signature_field", + "bf98f153a8789f78" : "state_archival_operation_errors-protocol_version_26-extend_operation-too_large_extension", + "bfa396d5747102ff" : "Soroban_authorization-multisig_classic_account-single_call-success", + "bfab28e80790dd46" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_22", + "c03bbceaf1428236" : "readonly_ttl_bumps_across_threads_and_stages-multiple_readonly_ttl_bumps_across_stages", + "c07830e846670e5d" : "merge_account_then_SAC_payment_scenarios-protocol_version_26-SAC_payment_from_the_merged_account", + "c18c912409884beb" : "Soroban_classic_account_authentication-default_account_with_additional_signer-empty_map", + "c1b1663060d151c0" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_6", + "c1b4226571cd3ae1" : "Soroban_authorization-multisig_classic_account-deep_tree-no_auth", + "c1c7ac4fa5ae147c" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_multisig_and_insufficient_threshold", + "c252cebb25294eab" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_6", + "c255cd77235ad3c4" : "basic_contract_invocation-protocol_version_26-insufficient_read_bytes_after_p23", + "c2ac55826ca7e6de" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-across_stages", + "c2c932cf464209f1" : "Soroban_footprint_validation-invokeHostFunction-readWrite-config_setting", + "c312c5d7aa1dfb38" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", + "c36cbaffe2709df8" : "contract_storage-protocol_version_26-Same_ScVal_key,_different_types", + "c3962c4a93291d74" : "Soroban_authorization-classic_account_with_weights-deep_tree-success_for_tree_with_extra_nodes", + "c3bb0eae31d31633" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_9", + "c443a7bba49e0e10" : "state_archival_operation_errors-protocol_version_26-extend_operation-insufficient_refundable_fee", + "c455542f23c8635a" : "refund_still_happens_on_bad_auth-protocol_version_26", + "c5d57c89c419e4af" : "Soroban_authorization-multisig_classic_account-single_call-unused_auth_entries-failure_with_long_malformed_function_name", + "c5f89e8c3c843590" : "resource_fee_exceeds_uint32-other_account_fee_bump-success-inclusion_fee_and_refund_exceed_uint32", + "c6c3d9865a04db5b" : "Soroban_classic_account_authentication-account_with_weights-incomplete_key", + "c6d25066860431e0" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_8", + "c81666a24e4770bd" : "contract_storage-protocol_version_26-read_bytes_limit_enforced", + "c89523486b59f106" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_2", + "c8b43ab94c4aada0" : "resource_fee_exceeds_uint32-self_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee", + "c8f28ce0094c5916" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_3", + "c922fea348665a87" : "overly_large_soroban_values_are_handled_gracefully-store_value", + "c9844b91db3ef0b0" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_1", + "c99364d18b82557b" : "resource_fee_exceeds_uint32-other_account_fee_bump-success-low_inclusion_fee", + "c99ea4a349fa4865" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_1", + "c9a9eaa405e6134c" : "failure_diagnostics", + "c9dbd32afe107afb" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-success_with_duplicate_auth_entries", + "c9eca15bdeb9bf48" : "complex_contract-diagnostics_enabled", + "ca44bb06db470a22" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-config_setting", + "ca81ee3779279e5f" : "Soroban_authorization-custom_account-single_call-incorrect_signature_payload", + "ca96297c5d814422" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_5", + "cab764de9b6ee4b7" : "Soroban_authorization-custom_account-deep_tree-success_for_tree_with_extra_nodes", + "cb9097b6c1c38bdd" : "Soroban_classic_account_authentication-account_with_weights-empty_map", + "cc8e5617818c25e6" : "state_archival-protocol_version_26-contract_storage_archival-TTL_enforcement-restoreOp_skips_when_currentLedger_==_liveUntilLedger", + "cc952a3d07337931" : "Soroban_authorization-custom_account-deep_tree-failure_for_tree_with_missing_node", + "ccda2d8c73bceae6" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_2", + "cd577b89ed04d414" : "refund_to_source_in_tx1_and_SAC_transfer_from_same_account_in_tx2-protocol_version_26-success", + "cd9b67cc851ef13d" : "autorestore_contract_instance-missing_archived_key_index", + "cdc0fbbed34915f1" : "Soroban_classic_account_authentication-default_account-empty_vector_signature", + "ce5735da86b32673" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-same_stage", + "ce594cb9b3e43c1d" : "Vm_instantiation_tightening", + "ce670ea1968c6dd3" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-data", + "ce8d1ee97a0d686d" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_13", + "cebea90af92b39d2" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-success", + "ced5e149f8263218" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_6", + "cf226151fb04c10f" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_7", + "cf2d86dd85a2417a" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-liquidity_pool", + "d0994aa43a850a1a" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-across_stages", + "d10f1da9f73be05f" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_3", + "d1522d4667822bc2" : "Native_stellar_asset_contract", + "d15d2c79a5a0afad" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_second_restore", + "d192ab90b43eeb6a" : "Soroban_authorization-default_classic_account-single_call-success_with_duplicate_auth_entries", + "d1f5d115b26f2c2d" : "basic_contract_invocation-protocol_version_26-malformed_function_names", + "d2284024d86a9f4a" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-insufficient_read_bytes", + "d2ef4dd8a3326b1f" : "state_archival-protocol_version_26-contract_storage_archival-entry_accessible_when_currentLedger_==_liveUntilLedger", + "d2fdf5f43cd795da" : "parallel_restore_and_extend_op", + "d312c2e2a5a50ba8" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_19", + "d3ee1065ef42391b" : "Soroban_authorization-classic_and_custom_accounts-single_call-failure_for_tree_with_missing_node", + "d3fa9dd1a7ce68e3" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-same_stage", + "d481fd33556741b2" : "Soroban_footprint_validation-invokeHostFunction-readOnly-issuer_trustline", + "d4d73e492b2aa30e" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_6", + "d4e4024caa6dbbc4" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_20", + "d580226d468cd36a" : "contract_constructor_support-constructor_with_no_arguments-v2_host_function,_v2_auth", + "d5d3d3dd818a7366" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-manual_restore-across_stages", + "d604f76431c95e5e" : "contract_constructor_support-constructor_with_no_arguments-v2_host_function,_v1_auth", + "d697bb21e32f6aef" : "autorestore_from_another_contract", + "d7ea63b86adedc73" : "Soroban_custom_account_authentication-wrong_signature_type", + "d888d3403368dc50" : "state_archival_operation_errors-protocol_version_26-restore_operation-exceeded_readBytes", + "d8cb2c3e8c67a529" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_17", + "d8f18264015ca76d" : "state_archival_operation_errors-protocol_version_26-restore_operation-insufficient_refundable_fee", + "d913ab5d872a03f8" : "state_archival-protocol_version_26-max_TTL_extension-extension_op", + "d927cb7228c4823f" : "buying_liabilities_plus_refund_is_greater_than_INT64_MAX", + "da22a08dbb5b6591" : "Soroban_classic_account_authentication-default_account-uninitialized_vector_signature", + "da9288450114401d" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_only-max", + "db09947c9187fb8f" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_24", + "dbade792400bbd36" : "Soroban_authorization-classic_account_with_weights-wide_tree-success_with_duplicate_auth_entries", + "dbe020e6910c1bb8" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_4", + "dc8cff5869997641" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_10", + "dcc73c9629f5a427" : "Soroban_classic_account_authentication-account_with_weights-wrong_key_name", + "deaef712a256815b" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-claimable_balance", + "debccecc0064889e" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_key_type", + "df8ad69b2e875c3e" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_15", + "dfd8d97545a410c4" : "charge_rent_fees_for_storage_resize-resize_with_no_extend-success", + "dff72321aec96f70" : "merge_account_then_SAC_payment_scenarios-protocol_version_26-SAC_payment_with_merged_account_as_source", + "e0180b51b72fe65a" : "Soroban_custom_account_authentication-empty_bytes_signature", + "e095dd79e65ba973" : "Soroban_classic_account_authentication-account_with_weights-wrong_field_order", + "e0f09f1dcf955676" : "merge_account_then_SAC_payment_scenarios-protocol_version_26-SAC_payment_to_the_merged_account", + "e17007564165c691" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-manual_restore-same_stage", + "e1b3a1546fcd4160" : "Soroban_authorization-multisig_classic_account-single_call-incorrect_signature_payload", + "e1bbd873f50bb8a5" : "persistent_entry_archival-eviction-restore_with_nonexistent_key", + "e1c9fd2d21f89d7e" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-native_asset_trustline", + "e1ecfe4848d7c257" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-TTL_entry", + "e260a8f0f8749e3c" : "Soroban_classic_account_authentication-account_with_weights-missing_key_field", + "e267116f1684f812" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_5", + "e26ad1849453e9f9" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-claimable_balance", + "e2df180a92959730" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-offer", + "e3fb4fe5cfe74d62" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_16", + "e436eae1b108bf65" : "Module_cache_miss_on_immediate_execution-same_ledger_upload_and_execution", + "e48f578b74a713cb" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_4", + "e4a693d475f137c9" : "Soroban_footprint_validation-soroban_entries-in-memory-max_+_1", + "e4a7e26b2bd75a51" : "state_archival-protocol_version_26-contract_storage_archival-extendOp_when_currentLedger_==_liveUntilLedger", + "e4b75527318c3f4b" : "Soroban_authorization-default_classic_account-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "e58ecf019fb8ef4c" : "classic_phase_sets_master_weight_of_soroban_source_account_to_0-protocol_version_26", + "e592b8e0d0c064f2" : "Soroban_authorization-classic_account_with_weights-wide_tree-no_auth", + "e595ac8447e8be48" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_10", + "e60437880d9a5342" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-manual_restore", + "e65bc9d3ad40b232" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_field_order", + "e663576331e88873" : "Soroban_classic_account_authentication-account_with_weights-wrong_key_type", + "e668e4a1eb385caf" : "Soroban_authorization-classic_account_with_weights-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "e6bd97c7e61b9c20" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-data", + "e7c93b4b2532635a" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-contract_data_key_above_limit", + "e847e07471896a84" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-liquidity_pool", + "e8e3a93f6508722e" : "contract_storage-protocol_version_26-successful_storage_operations", + "e8e94108c4e35442" : "refund_to_source_in_tx1_and_SAC_transfer_from_same_account_in_tx2-protocol_version_26-failure", + "e970c80dd6512e2a" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-issuer_trustline", + "e978d88c40ed87f1" : "autorestore_with_storage_resize-autorestore_with_rent_bump", + "e999346808076671" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_8", + "e9d3d132208dd2f6" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_20", + "ea4a1267d6c3a211" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-manual_restore", + "ea940d6997fea54c" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_19", + "eaa4c6f56373a470" : "Soroban_authorization-custom_account-single_call-success_for_tree_with_extra_nodes", + "eadfba1154674062" : "Soroban_classic_account_authentication-default_account-incomplete_key", + "ec29598b16b053bc" : "Soroban_footprint_validation-invokeHostFunction-readOnly-valid", + "ecd35a6539ca78d9" : "Soroban_authorization-multisig_classic_account-wide_tree-success", + "ecee0b3efb0526e4" : "resource_fee_exceeds_uint32-self_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_low_resource_fee", + "ed348cde4f3127e8" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_14", + "ed39ca2daf59835d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-unused_auth_entries-failure_with_malformed_function_name", + "ed4083446fa69ab7" : "contract_errors_cause_transaction_to_fail-val", + "ed66735578635c64" : "parallel_txs-internal_error", + "eda22224ec5ac6ea" : "Soroban_authorization-default_classic_account-single_call-success_for_tree_with_extra_nodes", + "eda3dfe5b6940848" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_3", + "eda811ebbd672d8d" : "autorestore_contract_instance-manual_restore", + "edeef19bce43c3da" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_signature_order", + "edf8d15f65abdd7c" : "basic_contract_invocation-protocol_version_26-incorrect_footprint", + "ee0f9fb5465b72ad" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-contract_data_key_above_limit", + "ee277035f023392a" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-config_setting", + "ee2f02eb252fcc27" : "Soroban_authorization-custom_account-wide_tree-failure_for_tree_with_missing_node", + "ee3472dd29024e40" : "Soroban_classic_account_authentication-additional_signer_with_insufficient_weight_not_authenticated", + "eee17f706f7deb9a" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_9", + "ef37aff90281f523" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-Success", + "ef78b3de24d812f7" : "basic_contract_invocation-protocol_version_26-incorrect_invocation_parameters-malformed_parameters", + "ef79595a3c250a3a" : "autorestore_with_storage_resize-manual_restore-extend_after_resize", + "ef80e6a78893c56c" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-incorrect_signature_payload", + "efc0bd51b5b29e40" : "Soroban_authorization-classic_account_with_weights-single_call-success", + "efd47464023e9e55" : "Stellar_asset_contract_transfer_with_CAP-67_address_types-custom_asset", + "efe4261cc946881e" : "Soroban_authorization-default_classic_account-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "f0638599b34ec8a1" : "contract_errors_cause_transaction_to_fail-err_err", + "f0ae5731df64cbe0" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_updated_value", + "f0e8fbaf2d4bdbcd" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "f168c76aba835145" : "put_in_first_stage_and_then_update_value_in_second_stage", + "f17be5b4b66ea006" : "Soroban_authorization-classic_account_with_weights-deep_tree-incorrect_signature_payload", + "f1b13fa29eb12ca4" : "Soroban_authorization-default_classic_account-single_call-incorrect_signature_payload", + "f1f574cc8ac44007" : "non-fee_source_account_is_recipient_of_payment_in_both_classic_and_soroban-protocol_version_26", + "f1fc663779e87b60" : "Soroban_authorization-default_classic_account-deep_tree-failure_for_tree_with_missing_node", + "f2530b53ad33fc1e" : "validate_return_values-protocol_version_26", + "f26b5de9280bbacd" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_0", + "f27c6aef8abbd723" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_15", + "f287aa63bbdb6ba8" : "Soroban_classic_account_authentication-account_with_weights-incomplete_signature", + "f2d73eb7f022f0cb" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_high_inclusion_fee", + "f2eb7607bcc37fbb" : "Soroban_footprint_validation-soroban_entries-in-memory-max", + "f3230f7682e7de69" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_7", + "f43fbd97002badc6" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_15", + "f4f351372abade91" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_14", + "f506528d32fd0652" : "Soroban_authorization-multisig_classic_account-wide_tree-no_auth", + "f538b7222e421b51" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_0", + "f57219130594aa83" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_and_a_successful_restore_in_the_same_stage", + "f5d072a9fb1463da" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-across_stages", + "f5d58a30f834542b" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_delete_value_in_next_tx-same_stage", + "f709a2d8db627467" : "basic_contract_invocation-protocol_version_26-non-existent_contract_id", + "f7b2eaed80de4146" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_instance_and_wasm", + "f7ca893de81e0719" : "Soroban_custom_account_authentication-uninitialized_vector_signature", + "f7e97011ed711385" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_across_stages", + "f7f94eb704afa841" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_12", + "f80ab46aebfceee5" : "settings_upgrade-from_min_settings", + "f85719dc2181f545" : "Soroban_authorization-classic_and_custom_accounts-single_call-incorrect_signature_payload", + "f860f4c299f7c690" : "Soroban_footprint_validation-invokeHostFunction-readOnly-TTL_entry", + "f8630c82e2e21ee3" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "f98d63a422dc7316" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_10", + "fa2ba8e3c2560e56" : "Soroban_authorization-default_classic_account-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "fa3f6b4664496f4e" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-offer", + "fa4b194dcfa3785c" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-same_stage", + "fa54dfbe49ee7aab" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_0", + "fa8d540011cb479c" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_12", + "fb103634b7406e33" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-same_stage", + "fb5372535aab3beb" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore-restore_op", + "fbec9a9e0db4dfc9" : "charge_rent_fees_for_storage_resize-resize_and_extend-success", + "fc180de263c6378d" : "resource_fee_exceeds_uint32-self_fee_bump-success-inclusion_fee_exceeds_uint32", + "fc65c51cb0a307a8" : "resource_fee_exceeds_uint32-self_fee_bump-failure-insufficient_fee_bumper_balance", + "fca3eb413e17400c" : "contract_storage-protocol_version_26-write_bytes_limit_enforced", + "fcc1d92eb9aefea4" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_signature_name", + "fcc7940f9747ef41" : "Soroban_classic_account_authentication-account_with_weights-wrong_signature_name", + "fdc0726b33a30b71" : "delete_in_first_stage_extend_in_second_stage", + "fecb8c7203544f20" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_20", + "ff17a6200f26a9e2" : "Soroban_authorization-custom_account-deep_tree-incorrect_signature_payload", + "ff35b35da8c78163" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_signature_type", + "ffde1b7463c8c452" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_12" +} diff --git a/test-lcm/MergeTests/d5cacbf63b606f18.xdr b/test-lcm/MergeTests/d5cacbf63b606f18.xdr new file mode 100644 index 0000000000..87fdfd07de Binary files /dev/null and b/test-lcm/MergeTests/d5cacbf63b606f18.xdr differ diff --git a/test-lcm/MergeTests/index.json b/test-lcm/MergeTests/index.json new file mode 100644 index 0000000000..edbc761be9 --- /dev/null +++ b/test-lcm/MergeTests/index.json @@ -0,0 +1,3 @@ +{ + "d5cacbf63b606f18" : "merge_event_reconciler-protocol_version_26" +} diff --git a/test-lcm/OfferTests/f7a7364752aecebb.xdr b/test-lcm/OfferTests/f7a7364752aecebb.xdr new file mode 100644 index 0000000000..f12a186a1b Binary files /dev/null and b/test-lcm/OfferTests/f7a7364752aecebb.xdr differ diff --git a/test-lcm/OfferTests/fd69a358c98c0b3e.xdr b/test-lcm/OfferTests/fd69a358c98c0b3e.xdr new file mode 100644 index 0000000000..4c5047016f Binary files /dev/null and b/test-lcm/OfferTests/fd69a358c98c0b3e.xdr differ diff --git a/test-lcm/OfferTests/index.json b/test-lcm/OfferTests/index.json new file mode 100644 index 0000000000..6cdb749948 --- /dev/null +++ b/test-lcm/OfferTests/index.json @@ -0,0 +1,4 @@ +{ + "f7a7364752aecebb" : "liabilities_match_created_offer-protocol_version_26-minimum_limits", + "fd69a358c98c0b3e" : "liabilities_match_created_offer-protocol_version_26-maximum_limits" +} diff --git a/test-lcm/PathPaymentTests/4a5fb7ad61be37b1.xdr b/test-lcm/PathPaymentTests/4a5fb7ad61be37b1.xdr new file mode 100644 index 0000000000..9e4f4abe51 Binary files /dev/null and b/test-lcm/PathPaymentTests/4a5fb7ad61be37b1.xdr differ diff --git a/test-lcm/PathPaymentTests/6b8dd7030be55252.xdr b/test-lcm/PathPaymentTests/6b8dd7030be55252.xdr new file mode 100644 index 0000000000..b073b86974 Binary files /dev/null and b/test-lcm/PathPaymentTests/6b8dd7030be55252.xdr differ diff --git a/test-lcm/PathPaymentTests/a0d129f4a7f84481.xdr b/test-lcm/PathPaymentTests/a0d129f4a7f84481.xdr new file mode 100644 index 0000000000..81af755314 Binary files /dev/null and b/test-lcm/PathPaymentTests/a0d129f4a7f84481.xdr differ diff --git a/test-lcm/PathPaymentTests/index.json b/test-lcm/PathPaymentTests/index.json new file mode 100644 index 0000000000..3861947202 --- /dev/null +++ b/test-lcm/PathPaymentTests/index.json @@ -0,0 +1,5 @@ +{ + "4a5fb7ad61be37b1" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-inside_issuers_missing", + "6b8dd7030be55252" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-no_issuers_missing", + "a0d129f4a7f84481" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-outside_issuers_missing" +} diff --git a/test-lcm/TxEnvelopeTests/33b31b8901ef27e4.xdr b/test-lcm/TxEnvelopeTests/33b31b8901ef27e4.xdr new file mode 100644 index 0000000000..7bc473af76 Binary files /dev/null and b/test-lcm/TxEnvelopeTests/33b31b8901ef27e4.xdr differ diff --git a/test-lcm/TxEnvelopeTests/8a618c6bf87583c8.xdr b/test-lcm/TxEnvelopeTests/8a618c6bf87583c8.xdr new file mode 100644 index 0000000000..57cd27cf7b Binary files /dev/null and b/test-lcm/TxEnvelopeTests/8a618c6bf87583c8.xdr differ diff --git a/test-lcm/TxEnvelopeTests/c5e8f50805e3d276.xdr b/test-lcm/TxEnvelopeTests/c5e8f50805e3d276.xdr new file mode 100644 index 0000000000..57cd27cf7b Binary files /dev/null and b/test-lcm/TxEnvelopeTests/c5e8f50805e3d276.xdr differ diff --git a/test-lcm/TxEnvelopeTests/index.json b/test-lcm/TxEnvelopeTests/index.json new file mode 100644 index 0000000000..2771744643 --- /dev/null +++ b/test-lcm/TxEnvelopeTests/index.json @@ -0,0 +1,5 @@ +{ + "33b31b8901ef27e4" : "txset_-_correct_apply_order", + "8a618c6bf87583c8" : "soroban_transaction_validation-protocol_version_26-footprint_limit-read-only_key_over_size_limit", + "c5e8f50805e3d276" : "soroban_transaction_validation-protocol_version_26-footprint_limit-read-write_key_over_size_limit" +} diff --git a/test-lcm/TxResultsTests/07c95288d49d06df.xdr b/test-lcm/TxResultsTests/07c95288d49d06df.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/07c95288d49d06df.xdr differ diff --git a/test-lcm/TxResultsTests/0818f91bf50e070d.xdr b/test-lcm/TxResultsTests/0818f91bf50e070d.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/0818f91bf50e070d.xdr differ diff --git a/test-lcm/TxResultsTests/16ba80aa94255ef1.xdr b/test-lcm/TxResultsTests/16ba80aa94255ef1.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/16ba80aa94255ef1.xdr differ diff --git a/test-lcm/TxResultsTests/17d5554d10b7a5e0.xdr b/test-lcm/TxResultsTests/17d5554d10b7a5e0.xdr new file mode 100644 index 0000000000..2b7674fcc6 Binary files /dev/null and b/test-lcm/TxResultsTests/17d5554d10b7a5e0.xdr differ diff --git a/test-lcm/TxResultsTests/3d108537d65b8bf5.xdr b/test-lcm/TxResultsTests/3d108537d65b8bf5.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/3d108537d65b8bf5.xdr differ diff --git a/test-lcm/TxResultsTests/46ae9d1460e628f2.xdr b/test-lcm/TxResultsTests/46ae9d1460e628f2.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/46ae9d1460e628f2.xdr differ diff --git a/test-lcm/TxResultsTests/482259c23e233fb4.xdr b/test-lcm/TxResultsTests/482259c23e233fb4.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/482259c23e233fb4.xdr differ diff --git a/test-lcm/TxResultsTests/50fab18e89f39e30.xdr b/test-lcm/TxResultsTests/50fab18e89f39e30.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/50fab18e89f39e30.xdr differ diff --git a/test-lcm/TxResultsTests/5f006545d085e016.xdr b/test-lcm/TxResultsTests/5f006545d085e016.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/5f006545d085e016.xdr differ diff --git a/test-lcm/TxResultsTests/63bb51706201f3dd.xdr b/test-lcm/TxResultsTests/63bb51706201f3dd.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/63bb51706201f3dd.xdr differ diff --git a/test-lcm/TxResultsTests/6c945c0f2f0bb66c.xdr b/test-lcm/TxResultsTests/6c945c0f2f0bb66c.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/6c945c0f2f0bb66c.xdr differ diff --git a/test-lcm/TxResultsTests/6d35e5e378e70370.xdr b/test-lcm/TxResultsTests/6d35e5e378e70370.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/6d35e5e378e70370.xdr differ diff --git a/test-lcm/TxResultsTests/6f1c62881b7eb1c3.xdr b/test-lcm/TxResultsTests/6f1c62881b7eb1c3.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/6f1c62881b7eb1c3.xdr differ diff --git a/test-lcm/TxResultsTests/71485755b9760b39.xdr b/test-lcm/TxResultsTests/71485755b9760b39.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/71485755b9760b39.xdr differ diff --git a/test-lcm/TxResultsTests/84449ae27e590b14.xdr b/test-lcm/TxResultsTests/84449ae27e590b14.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/84449ae27e590b14.xdr differ diff --git a/test-lcm/TxResultsTests/8e564daf846e0ced.xdr b/test-lcm/TxResultsTests/8e564daf846e0ced.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/8e564daf846e0ced.xdr differ diff --git a/test-lcm/TxResultsTests/948ceaf5339cffae.xdr b/test-lcm/TxResultsTests/948ceaf5339cffae.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/948ceaf5339cffae.xdr differ diff --git a/test-lcm/TxResultsTests/9c150d4ef9043b6b.xdr b/test-lcm/TxResultsTests/9c150d4ef9043b6b.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/9c150d4ef9043b6b.xdr differ diff --git a/test-lcm/TxResultsTests/a7ad902854f944c7.xdr b/test-lcm/TxResultsTests/a7ad902854f944c7.xdr new file mode 100644 index 0000000000..bd5514b0fc Binary files /dev/null and b/test-lcm/TxResultsTests/a7ad902854f944c7.xdr differ diff --git a/test-lcm/TxResultsTests/affa492c6f3b5ee0.xdr b/test-lcm/TxResultsTests/affa492c6f3b5ee0.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/affa492c6f3b5ee0.xdr differ diff --git a/test-lcm/TxResultsTests/b88e41c2210b9273.xdr b/test-lcm/TxResultsTests/b88e41c2210b9273.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/b88e41c2210b9273.xdr differ diff --git a/test-lcm/TxResultsTests/b94e47cd7fd23d5b.xdr b/test-lcm/TxResultsTests/b94e47cd7fd23d5b.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/b94e47cd7fd23d5b.xdr differ diff --git a/test-lcm/TxResultsTests/bb308ccf3733c82c.xdr b/test-lcm/TxResultsTests/bb308ccf3733c82c.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/bb308ccf3733c82c.xdr differ diff --git a/test-lcm/TxResultsTests/bd17b7c465d5042d.xdr b/test-lcm/TxResultsTests/bd17b7c465d5042d.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/bd17b7c465d5042d.xdr differ diff --git a/test-lcm/TxResultsTests/beb319a6de9dad42.xdr b/test-lcm/TxResultsTests/beb319a6de9dad42.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/beb319a6de9dad42.xdr differ diff --git a/test-lcm/TxResultsTests/bf802dee14198853.xdr b/test-lcm/TxResultsTests/bf802dee14198853.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/bf802dee14198853.xdr differ diff --git a/test-lcm/TxResultsTests/d34713da8df3e583.xdr b/test-lcm/TxResultsTests/d34713da8df3e583.xdr new file mode 100644 index 0000000000..5ae8d5ec96 Binary files /dev/null and b/test-lcm/TxResultsTests/d34713da8df3e583.xdr differ diff --git a/test-lcm/TxResultsTests/e0b80e7fe9bd74d0.xdr b/test-lcm/TxResultsTests/e0b80e7fe9bd74d0.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/e0b80e7fe9bd74d0.xdr differ diff --git a/test-lcm/TxResultsTests/fc4598caa5e37bed.xdr b/test-lcm/TxResultsTests/fc4598caa5e37bed.xdr new file mode 100644 index 0000000000..bbdbe54a03 Binary files /dev/null and b/test-lcm/TxResultsTests/fc4598caa5e37bed.xdr differ diff --git a/test-lcm/TxResultsTests/fe76a0ad04fa1139.xdr b/test-lcm/TxResultsTests/fe76a0ad04fa1139.xdr new file mode 100644 index 0000000000..8a61662b80 Binary files /dev/null and b/test-lcm/TxResultsTests/fe76a0ad04fa1139.xdr differ diff --git a/test-lcm/TxResultsTests/index.json b/test-lcm/TxResultsTests/index.json new file mode 100644 index 0000000000..f1adf30305 --- /dev/null +++ b/test-lcm/TxResultsTests/index.json @@ -0,0 +1,32 @@ +{ + "07c95288d49d06df" : "txresults-protocol_version_26-transaction_errors-signed-insufficient_balance", + "0818f91bf50e070d" : "txresults-protocol_version_26-transaction_errors-double_signed-too_early", + "16ba80aa94255ef1" : "txresults-protocol_version_26-transaction_errors-double_signed-missing_operation", + "17d5554d10b7a5e0" : "txresults-protocol_version_26-not_enough_signature_weight-before_tx", + "3d108537d65b8bf5" : "txresults-protocol_version_26-merge_account-normal", + "46ae9d1460e628f2" : "txresults-protocol_version_26-create_account-with_payment_after", + "482259c23e233fb4" : "txresults-protocol_version_26-transaction_errors-double_signed-too_late", + "50fab18e89f39e30" : "txresults-protocol_version_26-transaction_errors-not_signed-insufficient_balance", + "5f006545d085e016" : "txresults-protocol_version_26-transaction_errors-signed-no_account", + "63bb51706201f3dd" : "txresults-protocol_version_26-transaction_errors-double_signed-insufficient_balance", + "6c945c0f2f0bb66c" : "txresults-protocol_version_26-transaction_errors-signed-insufficient_fee", + "6d35e5e378e70370" : "txresults-protocol_version_26-transaction_errors-not_signed-missing_operation", + "6f1c62881b7eb1c3" : "txresults-protocol_version_26-transaction_errors-signed-too_early", + "71485755b9760b39" : "txresults-protocol_version_26-transaction_errors-signed-too_late", + "84449ae27e590b14" : "txresults-protocol_version_26-transaction_errors-double_signed-insufficient_fee", + "8e564daf846e0ced" : "txresults-protocol_version_26-not_enough_signature_weight-normal", + "948ceaf5339cffae" : "txresults-protocol_version_26-transaction_errors-double_signed-bad_seq", + "9c150d4ef9043b6b" : "txresults-protocol_version_26-transaction_errors-not_signed-no_account", + "a7ad902854f944c7" : "txresults-protocol_version_26-fees_with_liabilities-buying_liabilities", + "affa492c6f3b5ee0" : "txresults-protocol_version_26-merge_account-with_operation_after", + "b88e41c2210b9273" : "txresults-protocol_version_26-transaction_errors-signed-bad_seq", + "b94e47cd7fd23d5b" : "txresults-protocol_version_26-not_enough_signature_weight-with_operation_after", + "bb308ccf3733c82c" : "txresults-protocol_version_26-transaction_errors-double_signed-no_account", + "bd17b7c465d5042d" : "txresults-protocol_version_26-transaction_errors-not_signed-too_early", + "beb319a6de9dad42" : "txresults-protocol_version_26-transaction_errors-signed-missing_operation", + "bf802dee14198853" : "txresults-protocol_version_26-transaction_errors-not_signed-too_late", + "d34713da8df3e583" : "txresults-protocol_version_26-fees_with_liabilities-selling_liabilities", + "e0b80e7fe9bd74d0" : "txresults-protocol_version_26-transaction_errors-not_signed-insufficient_fee", + "fc4598caa5e37bed" : "txresults-protocol_version_26-create_account-normal", + "fe76a0ad04fa1139" : "txresults-protocol_version_26-transaction_errors-not_signed-bad_seq" +} diff --git a/test-tx-meta-baseline-current/AllowTrustTests.json b/test-tx-meta-baseline-current/AllowTrustTests.json index dae38836e4..75adfec843 100644 --- a/test-tx-meta-baseline-current/AllowTrustTests.json +++ b/test-tx-meta-baseline-current/AllowTrustTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "allow trust|protocol version 0|allow trust" : [ @@ -3684,6 +3685,260 @@ "allow trust|protocol version 25|set trust line flags|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], "allow trust|protocol version 25|set trust line flags|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], "allow trust|protocol version 25|set trust line flags|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], + "allow trust|protocol version 26|allow trust" : + [ + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=" + ], + "allow trust|protocol version 26|allow trust|allow trust not required" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 26|allow trust|allow trust not required with payment" : [ "SKY/HFRZ8rY=", "n6lF21W1Y+M=", "IQIX1vX5nyo=" ], + "allow trust|protocol version 26|allow trust|allow trust required" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=" + ], + "allow trust|protocol version 26|allow trust|allow trust required|do not set revocable flag" : [ "iuqKZZVjl4E=", "nbWKJOVbLlA=", "AMfhXHm4M2c=" ], + "allow trust|protocol version 26|allow trust|allow trust required|invalid authorization flag" : [ "iuqKZZVjl4E=", "HygELYnQxjM=" ], + "allow trust|protocol version 26|allow trust|allow trust required|set revocable flag" : + [ + "OLJXeE+lPPs=", + "Nmuwi32W3Iw=", + "RY1d8mPBy1E=", + "ONd/UiFhGTE=", + "WIUxJgYJsYo=" + ], + "allow trust|protocol version 26|allow trust|allow trust with offers|an asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=" + ], + "allow trust|protocol version 26|allow trust|allow trust with offers|an asset matches|buying asset matches" : [ "13yZREZHAAY=", "pLs029KAkyU=" ], + "allow trust|protocol version 26|allow trust|allow trust with offers|an asset matches|selling asset matches" : [ "ObTLwhjEt3I=", "OoZR6IhycNw=", "08fP79JzV6Q=" ], + "allow trust|protocol version 26|allow trust|allow trust with offers|neither asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "aZ/WXfuGOrM=", + "sikUbNq8XGI=", + "Ws69fKMyE58=", + "utcu40gYV1w=", + "xKlmQzXePtc=", + "hCC/pghaFm4=", + "7PLZ3B4PdHA=" + ], + "allow trust|protocol version 26|allow trust|allow trust without trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 26|allow trust|allow trust without trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 26|allow trust|allow trust without trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 26|allow trust|authorize when AUTH_REQUIRED is not set" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "w+1cC16HHpc=", + "WybXLoo8TFo=", + "MWfRAIHXYcU=" + ], + "allow trust|protocol version 26|allow trust|revoke when AUTH_REQUIRED is not set" : [ "SKY/HFRZ8rY=", "7MiZjHuy3Ag=", "r1DApnx1qwE=" ], + "allow trust|protocol version 26|allow trust|self allow trust|allow trust with trustline" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 26|allow trust|self allow trust|allow trust without explicit trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 26|allow trust|self allow trust|allow trust without explicit trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 26|allow trust|self allow trust|allow trust without explicit trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 26|allow trust|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], + "allow trust|protocol version 26|allow trust|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], + "allow trust|protocol version 26|allow trust|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], + "allow trust|protocol version 26|set trust line flags" : + [ + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=" + ], + "allow trust|protocol version 26|set trust line flags|allow trust not required" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 26|set trust line flags|allow trust not required with payment" : [ "SKY/HFRZ8rY=", "n6lF21W1Y+M=", "IQIX1vX5nyo=" ], + "allow trust|protocol version 26|set trust line flags|allow trust required" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=" + ], + "allow trust|protocol version 26|set trust line flags|allow trust required|do not set revocable flag" : [ "iuqKZZVjl4E=", "nbWKJOVbLlA=", "AMfhXHm4M2c=" ], + "allow trust|protocol version 26|set trust line flags|allow trust required|invalid authorization flag" : [ "iuqKZZVjl4E=", "HygELYnQxjM=" ], + "allow trust|protocol version 26|set trust line flags|allow trust required|set revocable flag" : + [ + "OLJXeE+lPPs=", + "Nmuwi32W3Iw=", + "RY1d8mPBy1E=", + "ONd/UiFhGTE=", + "WIUxJgYJsYo=" + ], + "allow trust|protocol version 26|set trust line flags|allow trust with offers|an asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=" + ], + "allow trust|protocol version 26|set trust line flags|allow trust with offers|an asset matches|buying asset matches" : [ "13yZREZHAAY=", "pLs029KAkyU=" ], + "allow trust|protocol version 26|set trust line flags|allow trust with offers|an asset matches|selling asset matches" : [ "ObTLwhjEt3I=", "OoZR6IhycNw=", "08fP79JzV6Q=" ], + "allow trust|protocol version 26|set trust line flags|allow trust with offers|neither asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "aZ/WXfuGOrM=", + "sikUbNq8XGI=", + "Ws69fKMyE58=", + "utcu40gYV1w=", + "xKlmQzXePtc=", + "hCC/pghaFm4=", + "7PLZ3B4PdHA=" + ], + "allow trust|protocol version 26|set trust line flags|allow trust without trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 26|set trust line flags|allow trust without trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 26|set trust line flags|allow trust without trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 26|set trust line flags|authorize when AUTH_REQUIRED is not set" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "w+1cC16HHpc=", + "WybXLoo8TFo=", + "MWfRAIHXYcU=" + ], + "allow trust|protocol version 26|set trust line flags|revoke when AUTH_REQUIRED is not set" : [ "SKY/HFRZ8rY=", "7MiZjHuy3Ag=", "r1DApnx1qwE=" ], + "allow trust|protocol version 26|set trust line flags|self allow trust|allow trust with trustline" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 26|set trust line flags|self allow trust|allow trust without explicit trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 26|set trust line flags|self allow trust|allow trust without explicit trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 26|set trust line flags|self allow trust|allow trust without explicit trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 26|set trust line flags|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], + "allow trust|protocol version 26|set trust line flags|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], + "allow trust|protocol version 26|set trust line flags|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], "allow trust|protocol version 2|allow trust" : [ "/ruuvWxCmeY=", @@ -13307,6 +13562,754 @@ "authorized to maintain liabilities|protocol version 25|set trust line flags|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], "authorized to maintain liabilities|protocol version 25|set trust line flags|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], "authorized to maintain liabilities|protocol version 25|set trust line flags|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=" + ], + "authorized to maintain liabilities|protocol version 26|allow trust|AUTHORIZED_FLAG and AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG can't be used together" : [ "XCtzJqGkYZM=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|auth transition tests" : + [ + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=", + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=" + ], + "authorized to maintain liabilities|protocol version 26|allow trust|auth transition tests|authorized -> authorized to maintain liabilities" : [ "eZbcZvvFQx0=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|auth transition tests|authorized to maintain liabilities -> not authorized" : [ "f920LFPoJ9c=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities" : + [ + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=" + ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "W8unRxcP8mI=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|delete offer" : [ "8P3fMY0H8Uk=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "CqP2D203klk=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "qHfTD7McSYE=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities" : + [ + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=" + ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "ahf1zsZNROg=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|delete offer" : [ "BwhmfEnoE+c=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "0uKr/9DGb6k=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "S0ldi3VUl9w=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], + "authorized to maintain liabilities|protocol version 26|allow trust|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=" + ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|AUTHORIZED_FLAG and AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG can't be used together" : [ "XCtzJqGkYZM=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|auth transition tests" : + [ + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=", + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=" + ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|auth transition tests|authorized -> authorized to maintain liabilities" : [ "eZbcZvvFQx0=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|auth transition tests|authorized to maintain liabilities -> not authorized" : [ "f920LFPoJ9c=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities" : + [ + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=" + ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "W8unRxcP8mI=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|delete offer" : [ "8P3fMY0H8Uk=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "CqP2D203klk=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "qHfTD7McSYE=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities" : + [ + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=" + ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "ahf1zsZNROg=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|delete offer" : [ "BwhmfEnoE+c=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "0uKr/9DGb6k=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "S0ldi3VUl9w=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], + "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], "authorized to maintain liabilities|protocol version 2|allow trust" : [ "0HxJuvxFaP8=", diff --git a/test-tx-meta-baseline-current/BeginSponsoringFutureReservesTests.json b/test-tx-meta-baseline-current/BeginSponsoringFutureReservesTests.json index 6b0d452d0c..7f7e134aa1 100644 --- a/test-tx-meta-baseline-current/BeginSponsoringFutureReservesTests.json +++ b/test-tx-meta-baseline-current/BeginSponsoringFutureReservesTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "sponsor future reserves|protocol version 0|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 10|sponsorships with precondition that uses v3 extension" : [ "rwI1SSa7khg=" ], @@ -123,6 +124,13 @@ "sponsor future reserves|protocol version 25|sponsoring account is sponsored" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], "sponsor future reserves|protocol version 25|sponsorships with precondition that uses v3 extension" : [ "0EonDaqtUyo=", "/VUxG88a6YU=" ], "sponsor future reserves|protocol version 25|success" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 26|add sponsored entry before adding first sponsored signer" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 26|already sponsored" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 26|bad sponsorship" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 26|sponsored account is sponsoring" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "sponsor future reserves|protocol version 26|sponsoring account is sponsored" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "sponsor future reserves|protocol version 26|sponsorships with precondition that uses v3 extension" : [ "0EonDaqtUyo=", "/VUxG88a6YU=" ], + "sponsor future reserves|protocol version 26|success" : [ "5KjEutNtf8g=" ], "sponsor future reserves|protocol version 2|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 3|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 4|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], diff --git a/test-tx-meta-baseline-current/BumpSequenceTests.json b/test-tx-meta-baseline-current/BumpSequenceTests.json index 480e31d947..4627391484 100644 --- a/test-tx-meta-baseline-current/BumpSequenceTests.json +++ b/test-tx-meta-baseline-current/BumpSequenceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "bump sequence|protocol version 0" : [ @@ -448,6 +449,31 @@ "bump sequence|protocol version 25|test success|large bump" : [ "KDk3TqUQkEU=" ], "bump sequence|protocol version 25|test success|large bump|no more tx when INT64_MAX is reached" : [ "R6/tPSYNWDY=" ], "bump sequence|protocol version 25|test success|small bump" : [ "1x5MkE51m4M=" ], + "bump sequence|protocol version 26" : + [ + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=" + ], + "bump sequence|protocol version 26|seqnum equals starting sequence" : [ "l7Jo9jHXv6w=", "R6/tPSYNWDY=" ], + "bump sequence|protocol version 26|test success|backward jump (no-op)" : [ "SEHtVmEF8Dc=" ], + "bump sequence|protocol version 26|test success|bad seq" : [ "261VQSEf710=", "2TinaXRxsJU=" ], + "bump sequence|protocol version 26|test success|large bump" : [ "KDk3TqUQkEU=" ], + "bump sequence|protocol version 26|test success|large bump|no more tx when INT64_MAX is reached" : [ "R6/tPSYNWDY=" ], + "bump sequence|protocol version 26|test success|small bump" : [ "1x5MkE51m4M=" ], "bump sequence|protocol version 2|not supported" : [ "/lfj8xIFS8I=" ], "bump sequence|protocol version 3" : [ diff --git a/test-tx-meta-baseline-current/ChangeTrustTests.json b/test-tx-meta-baseline-current/ChangeTrustTests.json index 6d608a4e8c..2b0f02268b 100644 --- a/test-tx-meta-baseline-current/ChangeTrustTests.json +++ b/test-tx-meta-baseline-current/ChangeTrustTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "change trust pool share trustline|protocol version 0" : [ "y3OKoeosX6s=", "y3OKoeosX6s=" ], "change trust pool share trustline|protocol version 0|pool trustline sponsorship" : [ "Vv+QRgIt0Cg=", "jba1E+ywrQM=", "TU5dHQFzjW0=" ], @@ -3822,6 +3823,476 @@ "aw48+4kEW7A=" ], "change trust pool share trustline|protocol version 25|pool trustline|too many|too many subentries" : [ "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=" ], + "change trust pool share trustline|protocol version 26" : + [ + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=" + ], + "change trust pool share trustline|protocol version 26|pool trustline" : + [ + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=" + ], + "change trust pool share trustline|protocol version 26|pool trustline sponsorship" : [ "xIXr0bH0EOo=", "Dm2uoHTpU5s=", "JBBdfCqaFR4=" ], + "change trust pool share trustline|protocol version 26|pool trustline sponsorship|create, modify, and remove sponsored entry" : [ "4v5F70Baddw=" ], + "change trust pool share trustline|protocol version 26|pool trustline|below reserve" : [ "IJIdutocexU=", "IJIdutocexU=" ], + "change trust pool share trustline|protocol version 26|pool trustline|below reserve|delete pool share trustline while below the reserve" : [ "l/+mPeJlg1E=", "03ImO74hQL4=", "XQNfhTJy3JQ=", "u4hS+DYM4Ds=" ], + "change trust pool share trustline|protocol version 26|pool trustline|below reserve|delete sponsored pool share trustline while below the reserve" : + [ + "l/+mPeJlg1E=", + "03ImO74hQL4=", + "jZEV4Idmgds=", + "bo8SdhDkOfE=", + "8Sa505Nc0rY=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|existing pool with a native asset" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "tH7cGz2YfH8=", + "wMVdNefjzCI=", + "2jBGHpqK3LA=", + "xNgPy5bOLfw=", + "NWTqWdOn8S0=", + "kI7zGTbTgAw=", + "85mf41CycP4=", + "qPJDOLB7IvE=", + "pZStxLavcRQ=", + "/0O4p0G4IHA=", + "Cni5IFAtjkc=", + "pdUPcAQJE3c=", + "YGll1P5bsvo=", + "Jpiatb19P1k=", + "clmpS+PgZbc=", + "JEDXtKVWBAc=", + "YNwzqiFbCKo=", + "pxEQ8deRSwg=", + "Ae2brvpjbSA=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|existing pool with one issuer asset" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "8JrfhRc4myQ=", + "O+HlJerDQOQ=", + "qNImzimYYk0=", + "ZrW24morUyA=", + "YLNmrCkEcoQ=", + "5MFdstZ9eo4=", + "rncCPXAg8X8=", + "4bX1AkKSNnM=", + "w8HtKd8ETX8=", + "88lnovwJVcA=", + "zj0S8nETZV8=", + "Q7S4l3DxW+Y=", + "NRyYfpwPaeo=", + "tu4Kv0plV04=", + "t/dC9viivMM=", + "P7e+hWxyvew=", + "vsn3Ei4nDCw=", + "/GRAjfWVIhw=", + "3tHU7EfGR0g=", + "NRtZCsektXA=", + "pphE8W8nk5A=", + "DHNHuKBYdFE=", + "Afqcs1Ox+ug=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|existing pool with two issuer assets" : + [ + "OEPUOHLOEoE=", + "ZvZ0WOXhGyE=", + "8JrfhRc4myQ=", + "FieCbvQujPc=", + "qNImzimYYk0=", + "CO5hHDBrb+0=", + "YoBhB/RvbtY=", + "eieA9bJRBig=", + "KFtmJsWp0uE=", + "rVnncy7o4ls=", + "hxZc9HNq7dQ=", + "RvuBvmwRnnU=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|existing pool with two non-native assets" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "YGBSuAidDUw=", + "wSEsuL5cHkw=", + "qNImzimYYk0=", + "ZrW24morUyA=", + "YLNmrCkEcoQ=", + "5MFdstZ9eo4=", + "rncCPXAg8X8=", + "sJabMZaIBeo=", + "VmRA1hJwyPg=", + "P8tJnRY6zCA=", + "kYT2qHjpMfo=", + "8wNYeTTJaH4=", + "rqNifdj5fzE=", + "osZ1JGeONJY=", + "wxED9SUhh5Q=", + "YezIaYNurcw=", + "RxG2sU/eEAg=", + "SUwz6N9ufH8=", + "jytaFh9tJ/s=", + "Jdt8qpaPHxw=", + "5DYA2QVq7Qw=", + "edS8jPoD2wA=", + "zFuie3/nWe0=", + "k+FPiq9pHWk=", + "3e5nIkB4xKU=", + "DKxmPpeQjqI=", + "Ijoqfujr5Dw=", + "MQzpGt1J/N8=", + "Mz9Ee9MBo0Y=", + "yg+p0WfC3gw=", + "RO+5yqdjTZU=", + "sWXMVVlT1nA=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|low reserve" : + [ + "3No6kvp1D7I=", + "tJhnnjVS8Mc=", + "8VmotHeQtBQ=", + "sDmzSNb9u2g=", + "a7DP0lwPt0s=", + "mhG1p4u9RO8=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|new pool with a native asset" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "wZy5erCX0L4=", + "Hp2Olj7oXXw=", + "tBxPBh1d1QI=", + "YkaiTQ7imQM=", + "ab2tqUDqfhk=", + "G8P+f+RHP6U=", + "iVSp0d8Gg+s=", + "q2oZ1o37t7o=", + "DeeXoYn9UzI=", + "Ds1ou5sSVhQ=", + "CHOm6DqQHZI=", + "UD6UCaK+Fi4=", + "u1AwanACaoA=", + "Pgo3l3fbAFk=", + "PZoOde1hlww=", + "vCiOwOGC8Ow=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|new pool with one issuer asset" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "dEExw9gXiy0=", + "VszVdeNWzaA=", + "65CxRHWDR6Y=", + "fhGOLhNJVCg=", + "iPusuweuIA0=", + "W/1dj73Beb0=", + "rMCudO+O+9c=", + "6cEo7UraXL8=", + "asLBRfMClKY=", + "d6L9dtaWOfs=", + "eimErEsxjLw=", + "4RbmRjl2YS0=", + "z3lt1yjnK+8=", + "tQAxNhs0MmQ=", + "PPyxytOH/P8=", + "Vnu/QvMUmdk=", + "D6WVY3J0E+o=", + "cDl8FeELkf0=", + "rSGwMwCCGD0=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|new pool with two issuer assets" : + [ + "HwYjVPlyokM=", + "65FzmhW/cd0=", + "Z+yJEMvtYOI=", + "Tn2UjOstci4=", + "rEQax9Aoi4U=", + "aORoP/L6at8=", + "7mq2zPjCxL8=", + "acKmKVLetOo=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|new pool with two non-native assets" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "dEExw9gXiy0=", + "VszVdeNWzaA=", + "65CxRHWDR6Y=", + "oAaUvifbVJg=", + "sNaoeWUfnHw=", + "5VPtX5C8uy4=", + "DXJbFghABq0=", + "CCtm/0HOcl4=", + "wyL7/ql/9x0=", + "FY2cbLCwbrM=", + "EAju28gpAKg=", + "XSEI7AKeUDw=", + "v17c6BRAHlI=", + "O34D9y5KoIw=", + "NwSOYy4zdro=", + "L3xtRxXrsSs=", + "wViZsViX6LA=", + "rxEqMBj0nvQ=", + "jx6bL4057Kg=", + "+TwpAGQaTqM=", + "WLLYDvFFdXc=", + "u/eBT2w7DOU=", + "SARZEtgzXI4=", + "K1Uty2FcLlg=", + "pwufbJ/fvvY=", + "To+n9ytt/OY=", + "WgFg7ouiMas=", + "QCTLKVx2KYw=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|pool with two alphanum12 assets" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "l3E++G+qXMs=", + "VszVdeNWzaA=", + "1Agodn1ZBXQ=", + "oAaUvifbVJg=", + "ggddE9d3hm4=", + "5VPtX5C8uy4=", + "R/poZIkCjLs=", + "lZldXIrYbcw=", + "wyL7/ql/9x0=", + "FY2cbLCwbrM=", + "EAju28gpAKg=", + "XSEI7AKeUDw=", + "iyAOeCM/isw=", + "kymeieg3KRo=", + "o6poBaauEX0=", + "nv2OSFO5WZI=", + "hs8UAi+GX1Q=", + "PoUSElM/ykU=", + "cHT/zjYj4TI=", + "+TwpAGQaTqM=", + "WLLYDvFFdXc=", + "rXhRmZVMpww=", + "N1lSLAcDI5o=", + "4t2sJpp86UI=", + "PmN0WfU8WnA=", + "Waq1Pj+xHc4=", + "3oBznLFhLOs=", + "zPMajVl9Tuk=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets" : + [ + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|give account enough reserves to transfer the sponsorship" : [ "TFAlwEUi/fw=" ], + "change trust pool share trustline|protocol version 26|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|give owner enough reserves to take on the pool share trustline" : [ "CAxaqlPdDdg=" ], + "change trust pool share trustline|protocol version 26|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|try to transfer the sponsorship but fail" : [ "1Lz3lAoIBhk=" ], + "change trust pool share trustline|protocol version 26|pool trustline|too many" : + [ + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=" + ], + "change trust pool share trustline|protocol version 26|pool trustline|too many|too many subentries" : [ "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=" ], "change trust pool share trustline|protocol version 2|pool trustline" : [ "/lfj8xIFS8I=" ], "change trust pool share trustline|protocol version 2|pool trustline sponsorship" : [ "Vv+QRgIt0Cg=", "jba1E+ywrQM=", "TU5dHQFzjW0=" ], "change trust pool share trustline|protocol version 3" : [ "y3OKoeosX6s=", "y3OKoeosX6s=" ], @@ -4994,6 +5465,69 @@ "change trust|protocol version 25|too many|too many subentries" : [ "PG+6UqbLYsQ=", "PG+6UqbLYsQ=" ], "change trust|protocol version 25|trusting self" : [ "bX7cLSpsIqs=", "Ran3kHICmu0=" ], "change trust|protocol version 25|trustline on native asset" : [ "bX7cLSpsIqs=" ], + "change trust|protocol version 26" : + [ + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=" + ], + "change trust|protocol version 26|basic tests" : + [ + "GOrIZdK4EWA=", + "F1ZwdX8R8Wo=", + "Ao1tWPaJy6Y=", + "mo3OWoXTXVk=", + "EqqIZrDBAZA=", + "dRLKGj3jhJY=", + "0Iqam/50UYU=", + "CuaPOO6Ufvs=" + ], + "change trust|protocol version 26|cannot reduce limit below buying liabilities or delete" : + [ + "IcrOUU5F/8M=", + "NtcRxd3MoEY=", + "GdmSzpe/HXU=", + "x9i4ujqv/Js=", + "BZ2KsNaCAKg=", + "6BwB5XgF1kc=" + ], + "change trust|protocol version 26|create trust line with native buying liabilities" : [ "ozOXzNVBr3M=", "Nm6WGa5tG1I=", "8II0iGd5T0E=" ], + "change trust|protocol version 26|create trust line with native selling liabilities" : + [ + "ozOXzNVBr3M=", + "g+/6K99/PJs=", + "iCYVXgg/1Pg=", + "L92VcKnlzPw=", + "jp3g/Zp30QI=" + ], + "change trust|protocol version 26|issuer does not exist|edit existing" : [ "R3tSLDyYznk=", "7tMf92QFNqA=", "ubJYbsd08IQ=" ], + "change trust|protocol version 26|issuer does not exist|new trust line" : [ "GOrIZdK4EWA=" ], + "change trust|protocol version 26|sponsorship" : [ "h1Lx1hm4SRM=", "xTBz+kpeJZ4=", "h1Lx1hm4SRM=", "xTBz+kpeJZ4=" ], + "change trust|protocol version 26|sponsorship|create, modify, and remove sponsored entry" : [ "yznCBxYN5VA=" ], + "change trust|protocol version 26|too many" : + [ + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=" + ], + "change trust|protocol version 26|too many|too many subentries" : [ "PG+6UqbLYsQ=", "PG+6UqbLYsQ=" ], + "change trust|protocol version 26|trusting self" : [ "bX7cLSpsIqs=", "Ran3kHICmu0=" ], + "change trust|protocol version 26|trustline on native asset" : [ "bX7cLSpsIqs=" ], "change trust|protocol version 2|basic tests" : [ "/lfj8xIFS8I=", diff --git a/test-tx-meta-baseline-current/ClaimableBalanceTests.json b/test-tx-meta-baseline-current/ClaimableBalanceTests.json index e8c150acae..caea4c7e07 100644 --- a/test-tx-meta-baseline-current/ClaimableBalanceTests.json +++ b/test-tx-meta-baseline-current/ClaimableBalanceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "claimableBalance|protocol version 0" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 1" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], @@ -17705,6 +17706,1479 @@ "2vnUfjzq67A=", "nwUbQU2zWvU=" ], + "claimableBalance|protocol version 26" : + [ + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=" + ], + "claimableBalance|protocol version 26|claim claimable trustline issues" : + [ + "IF87YpW8M70=", + "p6UFEgHHfFo=", + "XKG+szxlT0s=", + "PiaBCNeVAS4=", + "F5fsbkUt1sg=", + "0XqQHyU3eqU=", + "TZ8NP1wfSHg=", + "WmowU27TiFw=", + "TE93kBOKEZs=", + "jJSBpPdUwxg=", + "+379KbDFQ0w=", + "4KHUyxFYaLA=" + ], + "claimableBalance|protocol version 26|claim is sponsored" : [ "wHdd57TIHfs=" ], + "claimableBalance|protocol version 26|create is sponsored" : [ "hZvzkHzw+lY=" ], + "claimableBalance|protocol version 26|invalid asset" : [ "xtHaja7O76w=" ], + "claimableBalance|protocol version 26|merge create account before claim" : [ "wHdd57TIHfs=", "s/kQ0KFX9zE=", "6/RFx4/TVUs=" ], + "claimableBalance|protocol version 26|merge sponsoring account" : [ "3cEJnQ+BKGw=", "QN+zg9n9BDo=" ], + "claimableBalance|protocol version 26|multiple claimants try to claim balance in same tx" : [ "Cz9zOTDmbx8=", "9weieLASzLA=", "Dw12IJrsLZk=" ], + "claimableBalance|protocol version 26|multiple creates in tx to test index in hash" : [ "/cZLoIvkgt4=", "ufpXmC+eyi0=" ], + "claimableBalance|protocol version 26|native" : + [ + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=" + ], + "claimableBalance|protocol version 26|native line full" : [ "9al6tq2MkrE=", "tmgSSpTjAXI=", "wIQZlLOuRIs=", "aIv19GtzMkA=" ], + "claimableBalance|protocol version 26|native|balanceID relies on sequence number" : + [ + "iQoYBQR3/k4=", + "xCMDTJ0kZwU=", + "CL/PUeiLHC0=", + "xRQl62UqJDM=", + "VdZQBBTQrdU=" + ], + "claimableBalance|protocol version 26|native|claim balance|balance does not exist" : [ "iQoYBQR3/k4=", "wZe6GyvOmXM=" ], + "claimableBalance|protocol version 26|native|claim balance|no destination match" : [ "iQoYBQR3/k4=", "ZKkXzbft2M8=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|NOT predicate not satisfied" : [ "bMpWX+lsnxI=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|absBefore not satisfied" : [ "l+NVVB04yWc=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|and predicate not satisfied" : [ "fAAyVBOjqTU=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|complex" : [ "f+Ob8NdSWl0=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|complex 2" : [ "ro1DopPX6Ys=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|complex 3" : [ "wfedr694Ndo=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|complex 4" : [ "nJY1NqC8fjQ=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|not unconditional" : [ "Dh9I2IWYMps=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|or predicate not satisfied" : [ "N6y7C1I9ku0=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate not satisfied|relBefore not satisfied" : [ "l+NVVB04yWc=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|NOT predicate satisfied" : [ "RoL07U39Lo0=", "IoTaXoom2Ro=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|Unconditional" : [ "guDU4SIN4LY=", "9flY4xCnPKA=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|absAfter satisfied" : [ "uPsLCXAVpZU=", "jO3cCIZ041I=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|absBefore satisfied" : [ "8Evd63a7S9g=", "SfqWPn8b8BM=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|and predicate satisfied" : [ "bBUGmf3NzlI=", "CVL8GLxVre4=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|complex 1" : [ "67AJMo1JQms=", "qWDFcXqfe6E=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|complex 2" : [ "k/67m5HA+e8=", "xiLvOHytr3c=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|complex 3" : [ "H1JDEetdGZ0=", "gtZj4tx9MIs=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|complex 4" : [ "2H6M/RT2ziA=", "yrJ3SA2Q/eA=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|complex 5" : [ "8pVVtCs9JYs=", "R1UT99Zn1/E=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|or predicate satisfied" : [ "zfojdeXqTLA=", "JECggEvrrEo=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|relAfter satisfied" : [ "uPsLCXAVpZU=", "jO3cCIZ041I=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|relBefore max satisfied" : [ "3pRcziFbCdY=", "603yLTiNxms=" ], + "claimableBalance|protocol version 26|native|claim balance|predicate satisfied|relBefore satisfied" : [ "8Evd63a7S9g=", "SfqWPn8b8BM=" ], + "claimableBalance|protocol version 26|native|multiple create and claims" : + [ + "iQoYBQR3/k4=", + "qDIQ0O651UQ=", + "81Dj16JXAzw=", + "VXyZOj4vx6A=", + "CS0keM/C/SU=" + ], + "claimableBalance|protocol version 26|native|successful createdBy == claimant|create and claim in different tx" : [ "nEFUKe7rrGM=", "sMh/VpB/x20=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=1" : [ "iQoYBQR3/k4=", "qDIQ0O651UQ=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=10" : [ "HU+TbRHa0PM=", "4IePD7nphZs=", "v/zwLFQsgzs=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=2" : [ "hIys2rqcpjA=", "rZizm/qaxfo=", "jJZQULd5rJQ=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=3" : [ "yTcYLRPvAVg=", "15xTSvZLBmk=", "3J0HfrNNDMg=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=4" : [ "TGIOfSzllS4=", "E+x3JnxHNjk=", "6BCxb2zfTfE=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=5" : [ "dIIHm/o0K30=", "LH24Wya57VI=", "GP6XCIA+KCU=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=6" : [ "OI6eNXdGGII=", "S778IAB8tKM=", "JfC2qvGh5dc=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=7" : [ "gg06gNt1D3w=", "RKMd8WJhlcU=", "7PvQDtSB7bs=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=8" : [ "UfmF5IvNxbs=", "c6345PWVuv4=", "OfllUeKyjZk=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|number of claimants=9" : [ "m+zwD30NPxU=", "hDp9HBUuJZM=", "Ce3VLdLzP4o=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|predicate at level 0" : [ "3pRcziFbCdY=", "UJJkuQ0Lnmo=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|predicate at level 1" : [ "AaLVjuRTixk=", "Z9Yi1pZIjKo=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|predicate at level 2" : [ "7WVmSTq3yP8=", "wy00/4E8u2E=" ], + "claimableBalance|protocol version 26|native|valid predicate and claimant combinations|predicate at level 3" : [ "iQoYBQR3/k4=", "DbJkQT/ZN8A=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid amount" : [ "fO5Hh5Gektc=", "eiOYWWzirgA=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|duplicate claimants" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|empty claimants" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid absBefore" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid andPredicate size" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid not nested" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid null not" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid orPredicate size" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid predicate height" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|native|validity checks|invalid claimants|invalid predicate|invalid relBefore" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 26|non-native" : + [ + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=" + ], + "claimableBalance|protocol version 26|non-native|balanceID relies on sequence number" : + [ + "mGKoAhww12o=", + "dgfpb9Uw624=", + "ZQHo0WBsZyk=", + "vCXfaWjfJqY=", + "cKHql/sFXiY=" + ], + "claimableBalance|protocol version 26|non-native|claim balance|balance does not exist" : [ "mGKoAhww12o=", "UegjVZrX3is=" ], + "claimableBalance|protocol version 26|non-native|claim balance|no destination match" : [ "mGKoAhww12o=", "+Xym0HeT/1Y=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|NOT predicate not satisfied" : [ "PNBAzMvx8hc=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|absBefore not satisfied" : [ "LkGvULA7Qh4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|and predicate not satisfied" : [ "xQQcLZ5c4I4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|complex" : [ "NySJUoyWDpM=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|complex 2" : [ "TNhNJQQa8/8=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|complex 3" : [ "WjTIVMkf2QM=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|complex 4" : [ "E9kz6Hnf3Ic=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|not unconditional" : [ "hLdOhomEx6E=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|or predicate not satisfied" : [ "2Hmj/Ceolds=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate not satisfied|relBefore not satisfied" : [ "LkGvULA7Qh4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|NOT predicate satisfied" : [ "E6bY3jbZnls=", "wVqZalLW8nQ=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|Unconditional" : [ "bO43G4ZE6z4=", "MQqfFv7OgLM=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|absAfter satisfied" : [ "lYGW071gUj0=", "ewyH//LimSI=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|absBefore satisfied" : [ "cKJaD6tJ6vQ=", "vB5msTlJb4U=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|and predicate satisfied" : [ "1atfKi31tGc=", "nuP5W0M/BsM=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|complex 1" : [ "kyhukCDkXmE=", "6Q0OKQGKS9c=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|complex 2" : [ "Deb/awR6TxY=", "dXXQ8TlqXtM=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|complex 3" : [ "Bu0xCTMFU7Y=", "SmMEEItbins=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|complex 4" : [ "5shv8SdOS3A=", "2dNt+qcCaXU=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|complex 5" : [ "WYW+yOVUAKY=", "kz00gKYKf7I=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|or predicate satisfied" : [ "AHdoF0mMUJY=", "NNyX9eOpDGQ=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|relAfter satisfied" : [ "lYGW071gUj0=", "ewyH//LimSI=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|relBefore max satisfied" : [ "+xbi8vlQwo8=", "2eLym8iTJfE=" ], + "claimableBalance|protocol version 26|non-native|claim balance|predicate satisfied|relBefore satisfied" : [ "cKJaD6tJ6vQ=", "vB5msTlJb4U=" ], + "claimableBalance|protocol version 26|non-native|multiple create and claims" : + [ + "mGKoAhww12o=", + "olWEQonFQr8=", + "aTzelVVtEOo=", + "j3VrKHElXSM=", + "p/ZZT9JnQ3w=" + ], + "claimableBalance|protocol version 26|non-native|successful createdBy == claimant|create and claim in different tx" : [ "KG4ZCfgo65c=", "Y1MZ52lf5PI=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=1" : [ "mGKoAhww12o=", "olWEQonFQr8=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=10" : [ "vhKz+vj0DrU=", "p25ZP/zG1jg=", "8/BP097P/Zc=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=2" : [ "3ARhLyvn2OE=", "+UPB4EN6Srg=", "kFVyAr8I1JM=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=3" : [ "qasdA7MPaMo=", "BFERMwbFGD4=", "Rd9ZzYoRlqQ=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=4" : [ "WP3FUudffQU=", "g/S41+dwTg4=", "Jk4/Bg2x2Pk=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=5" : [ "OiGx0C3V5BE=", "6dIM3Z5kYZQ=", "y0g4d5XyTSs=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=6" : [ "M/gFF3LrAgc=", "P/D+nMXsmVE=", "+PdU7A3U3Zs=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=7" : [ "4SbAL5JQ9jc=", "CTf49XXhY18=", "dtF1DSid7U4=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=8" : [ "yssmxi7YVv4=", "o5ao0wvOjTM=", "aiHRrA4OmiU=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|number of claimants=9" : [ "yWqzVjq3oEo=", "4Zt9ym8Pj+k=", "kUbRwy1jOT4=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|predicate at level 0" : [ "+xbi8vlQwo8=", "Sh6IF5umQp8=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|predicate at level 1" : [ "fJHNZXDwKf0=", "5enns/kRnn0=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|predicate at level 2" : [ "lXkZ5exmY+c=", "CzTSRiXH9Kc=" ], + "claimableBalance|protocol version 26|non-native|valid predicate and claimant combinations|predicate at level 3" : [ "mGKoAhww12o=", "oVRBC09Hnrs=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid amount" : [ "nbdFtMfH56E=", "6vitIf7N+kg=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|duplicate claimants" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|empty claimants" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid absBefore" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid andPredicate size" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid not nested" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid null not" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid orPredicate size" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid predicate height" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|non-native|validity checks|invalid claimants|invalid predicate|invalid relBefore" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 26|op source account last modified is updated on claim of sponsored balance|claim" : [ "Sa3QK3wT+nY=", "BOVxyPIP1dg=" ], + "claimableBalance|protocol version 26|op source account last modified is updated on claim of sponsored balance|clawback" : [ "rxy9AEEvLJY=", "3yNA702jlkw=", "rtUohNutExc=" ], + "claimableBalance|protocol version 26|source account is issuer" : [ "QCFQMKEfd2s=", "IoxuJAIJAeU=" ], + "claimableBalance|protocol version 26|tx account is different than op account on successful create" : [ "dupwEZTiUAc=", "/q42IhmfUv8=", "nD1CgBvPM9Q=", "Kku4R15nG5E=" ], + "claimableBalance|protocol version 26|validate tx account is used in hash" : + [ + "Z98WFIlrRGc=", + "JjkqnhkiCWE=", + "CLOAqVnKIhI=", + "sc5mPLLz4cM=", + "5VgvMEY9sIk=", + "5zV53bccDX0=", + "2vnUfjzq67A=", + "nwUbQU2zWvU=" + ], "claimableBalance|protocol version 2|not supported before version 14" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "claimableBalance|protocol version 3" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 3|not supported before version 14" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-current/ClawbackClaimableBalanceTests.json b/test-tx-meta-baseline-current/ClawbackClaimableBalanceTests.json index a36ae49578..df530c8416 100644 --- a/test-tx-meta-baseline-current/ClawbackClaimableBalanceTests.json +++ b/test-tx-meta-baseline-current/ClawbackClaimableBalanceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "clawbackClaimableBalance|protocol version 0" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], "clawbackClaimableBalance|protocol version 1" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], @@ -102,8 +103,8 @@ "Do+HQ7zDQXo=" ], "clawbackClaimableBalance|protocol version 17|basic test" : [ "NI0A4zxuiKs=", "vHiJqFzKwSo=", "Rcj3N7FarPU=", "DBA56dnFvoI=" ], - "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is issuer" : [ "bJvMffGuGro=", "E0pKlEQdz7o=" ], - "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is not issuer" : [ "Cp7Ps16cwGY=", "ntfZMpKFVNg=" ], + "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is issuer" : [ "cDG7PLIdGvk=", "bfqfQ1L1fXE=" ], + "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is not issuer" : [ "kcd2xTfptjE=", "Rcj3N7FarPU=" ], "clawbackClaimableBalance|protocol version 17|clawback when issuer already has INT64_MAX liabilities" : [ "D9uwxUsRMmg=", "V+lofDv0638=", "1O3P9gT0QqY=" ], "clawbackClaimableBalance|protocol version 17|errors|not clawback enabled" : [ @@ -183,8 +184,8 @@ "Do+HQ7zDQXo=" ], "clawbackClaimableBalance|protocol version 18|basic test" : [ "NI0A4zxuiKs=", "vHiJqFzKwSo=", "Rcj3N7FarPU=", "DBA56dnFvoI=" ], - "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is issuer" : [ "bJvMffGuGro=", "E0pKlEQdz7o=" ], - "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is not issuer" : [ "Cp7Ps16cwGY=", "ntfZMpKFVNg=" ], + "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is issuer" : [ "cDG7PLIdGvk=", "bfqfQ1L1fXE=" ], + "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is not issuer" : [ "kcd2xTfptjE=", "Rcj3N7FarPU=" ], "clawbackClaimableBalance|protocol version 18|clawback when issuer already has INT64_MAX liabilities" : [ "D9uwxUsRMmg=", "V+lofDv0638=", "1O3P9gT0QqY=" ], "clawbackClaimableBalance|protocol version 18|errors|not clawback enabled" : [ @@ -264,8 +265,8 @@ "M1925OX02LU=" ], "clawbackClaimableBalance|protocol version 19|basic test" : [ "DlVjWy6FyAk=", "/SlT/90/3rU=", "q3+ND7rJyEs=", "7/u+V6ZATgs=" ], - "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is issuer" : [ "JHpDvKOpZEk=", "tHDwzrcHDJM=" ], - "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is not issuer" : [ "cHKmO85ZelA=", "7pzi3ejC60w=" ], + "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is issuer" : [ "IubrCYeR6uQ=", "8pCnEVlLfyM=" ], + "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is not issuer" : [ "toMCyRL+Wcs=", "q3+ND7rJyEs=" ], "clawbackClaimableBalance|protocol version 19|clawback when issuer already has INT64_MAX liabilities" : [ "tG7vmgNH0Ww=", "OZiPJFQQD38=", "AtwtMrLpwcY=" ], "clawbackClaimableBalance|protocol version 19|errors|not clawback enabled" : [ @@ -347,8 +348,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 20|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 20|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 20|errors|not clawback enabled" : [ @@ -428,8 +429,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 21|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 21|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 21|errors|not clawback enabled" : [ @@ -509,8 +510,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 22|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 22|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 22|errors|not clawback enabled" : [ @@ -590,8 +591,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 23|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 23|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 23|errors|not clawback enabled" : [ @@ -671,8 +672,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 24|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 24|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 24|errors|not clawback enabled" : [ @@ -752,8 +753,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 25|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 25|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 25|errors|not clawback enabled" : [ @@ -779,6 +780,87 @@ "No/KX4ID5Ks=" ], "clawbackClaimableBalance|protocol version 25|successful alphanum12 clawback" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "oXVyUyVQNyc=" ], + "clawbackClaimableBalance|protocol version 26" : + [ + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=" + ], + "clawbackClaimableBalance|protocol version 26|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], + "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], + "clawbackClaimableBalance|protocol version 26|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], + "clawbackClaimableBalance|protocol version 26|errors|not clawback enabled" : + [ + "snRVLS8NG54=", + "EMW6NGkgAlU=", + "DlvgrtUeZXU=", + "NlZWujO3CtM=", + "Zuw/Wo5XpIo=", + "e8ldBQMwH/E=" + ], + "clawbackClaimableBalance|protocol version 26|errors|not issuer|assetCode12" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "4/UXi8efC94=" ], + "clawbackClaimableBalance|protocol version 26|errors|not issuer|assetCode4" : [ "r+qTfk8vBhc=", "NFA79rSVcQQ=" ], + "clawbackClaimableBalance|protocol version 26|errors|not issuer|native" : [ "oMiqMnps6gw=", "bc/WP0iyag8=" ], + "clawbackClaimableBalance|protocol version 26|issuer claimable balance" : + [ + "snRVLS8NG54=", + "58bXYWrZd/Y=", + "18ywOwQoMog=", + "S4sNXr7ODL8=", + "ZPaDlc4A3j0=", + "/yeTKVVM40Y=", + "ZU0nhP0eeQI=", + "No/KX4ID5Ks=" + ], + "clawbackClaimableBalance|protocol version 26|successful alphanum12 clawback" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "oXVyUyVQNyc=" ], "clawbackClaimableBalance|protocol version 2|pre V17 errors" : [ "/lfj8xIFS8I=" ], "clawbackClaimableBalance|protocol version 3" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], "clawbackClaimableBalance|protocol version 3|pre V17 errors" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-current/ClawbackTests.json b/test-tx-meta-baseline-current/ClawbackTests.json index 9dc3f18d6b..046fd19d50 100644 --- a/test-tx-meta-baseline-current/ClawbackTests.json +++ b/test-tx-meta-baseline-current/ClawbackTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "clawback|protocol version 0" : [ @@ -1209,6 +1210,125 @@ ], "clawback|protocol version 25|from V17|errors|set options" : [ "0Tfxm4XVEr0=", "d+6niptq9w4=", "tdqsDRpoM3s=" ], "clawback|protocol version 25|from V17|errors|set options clawback immutable" : [ "l77R48sqLpw=", "AH57wge7wl8=", "RkaLElBC+CY=" ], + "clawback|protocol version 26" : + [ + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=" + ], + "clawback|protocol version 26|all version errors" : [ "p4/WJEhlYrk=" ], + "clawback|protocol version 26|from V17" : + [ + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=" + ], + "clawback|protocol version 26|from V17|allow trust" : [ "n6LIgU69wl0=", "n6LIgU69wl0=", "n6LIgU69wl0=" ], + "clawback|protocol version 26|from V17|allow trust|allow trust can't set clawback" : [ "2IteCfyCwhU=", "sTAww/zzaMA=" ], + "clawback|protocol version 26|from V17|allow trust|clawback after revoking auth" : [ "i0CxNCezxac=", "oCDi/0Bb1hY=" ], + "clawback|protocol version 26|from V17|allow trust|clawback after revoking auth to AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG" : [ "5l7/Tyy8zGY=", "uS/pzWBz1oo=" ], + "clawback|protocol version 26|from V17|basic test" : [ "lZTJiD6j/6I=" ], + "clawback|protocol version 26|from V17|clawback after removing liabilites" : + [ + "n6LIgU69wl0=", + "1lZte7ya2Eo=", + "SomBRcy0dYI=", + "UcZprHwrsAI=", + "e9Bkr7o90Mc=" + ], + "clawback|protocol version 26|from V17|clawback when issuer already has INT64_MAX liabilities" : [ "iuNv6Bi0CT0=", "2LCZG/Gsjw4=" ], + "clawback|protocol version 26|from V17|errors|apply|no trust" : [ "0Tfxm4XVEr0=" ], + "clawback|protocol version 26|from V17|errors|apply|not clawback enabled" : [ "0balGGSFtIM=", "qVlDsyHEP/8=", "nWIiEArIuP4=", "iYyoqUwRP44=" ], + "clawback|protocol version 26|from V17|errors|apply|underfunded" : [ "0Tfxm4XVEr0=", "1lZte7ya2Eo=", "UDIlEKz5C9w=", "13DJ/ZYpDZQ=" ], + "clawback|protocol version 26|from V17|errors|check validity" : + [ + "0Tfxm4XVEr0=", + "0LP5DLjBmuc=", + "bK6vnjBD0VQ=", + "drjFOKZHvC0=", + "9rNmV2HCIHo=", + "cIVGh/yHpfE=", + "Z5uq8uXGf+U=", + "BP5deJCm8Vc=", + "j+2qhP5UkQQ=", + "m7+a9+0Xa00=", + "ebv6hZx31rY=", + "bQz/QnTg+Gs=", + "JTW7WKA2nrI=", + "QQsmtXSSMV8=", + "4OQurciAuA8=", + "tdcidOTzj0o=", + "DcjA5DGNg6c=", + "YgXTAsQrOww=", + "yXX1M25JdY8=", + "S9vKwOdc9us=", + "u6AfaV6kAaE=", + "ICitmJpn33I=", + "tiirdAWMjSI=", + "pA0fozCtzFg=", + "pOPWDxSWLJs=", + "N4IpepbVE94=" + ], + "clawback|protocol version 26|from V17|errors|set options" : [ "0Tfxm4XVEr0=", "d+6niptq9w4=", "tdqsDRpoM3s=" ], + "clawback|protocol version 26|from V17|errors|set options clawback immutable" : [ "l77R48sqLpw=", "AH57wge7wl8=", "RkaLElBC+CY=" ], "clawback|protocol version 2|all version errors" : [ "/lfj8xIFS8I=" ], "clawback|protocol version 2|pre V17 errors" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "clawback|protocol version 3" : diff --git a/test-tx-meta-baseline-current/CreateAccountTests.json b/test-tx-meta-baseline-current/CreateAccountTests.json index 7c42496dbf..b97b7138bd 100644 --- a/test-tx-meta-baseline-current/CreateAccountTests.json +++ b/test-tx-meta-baseline-current/CreateAccountTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "create account|protocol version 10|Amount too small to create account" : [ "X2yKCWehH5U=" ], "create account|protocol version 10|Not enough funds (source)" : [ "x6hOin79MFA=", "6VHOcmD0yD4=" ], @@ -244,6 +245,19 @@ "hrHXWVqKXGE=", "DWKVsFqPjZM=" ], + "create account|protocol version 26|Amount too small to create account" : [ "Zby/J3+a3+M=" ], + "create account|protocol version 26|Not enough funds (source)" : [ "MSQOA5zJeR0=", "eLoxbAMaFeM=" ], + "create account|protocol version 26|Success" : [ "d9drKjBULJU=" ], + "create account|protocol version 26|Success|Account already exists" : [ "15rvbjTq2Ig=" ], + "create account|protocol version 26|with native buying liabilities" : [ "BuDREniMj40=", "hOPYBhC5f80=", "gsKAaaHOdCw=" ], + "create account|protocol version 26|with native selling liabilities" : + [ + "BuDREniMj40=", + "WpBVt4ChwFU=", + "WtsecA6H5uM=", + "hrHXWVqKXGE=", + "DWKVsFqPjZM=" + ], "create account|protocol version 2|Amount too small to create account" : [ "/lfj8xIFS8I=" ], "create account|protocol version 2|Not enough funds (source)" : [ "4+svrnV0hxY=", "/lfj8xIFS8I=" ], "create account|protocol version 2|Success" : [ "IxXegoyiQk4=" ], diff --git a/test-tx-meta-baseline-current/EndSponsoringFutureReservesTests.json b/test-tx-meta-baseline-current/EndSponsoringFutureReservesTests.json index 9dbca1ee0e..3795dba606 100644 --- a/test-tx-meta-baseline-current/EndSponsoringFutureReservesTests.json +++ b/test-tx-meta-baseline-current/EndSponsoringFutureReservesTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "confirm and clear sponsor|protocol version 13|not supported" : [ "QJDMJ0PvkYA=" ], "confirm and clear sponsor|protocol version 14|not sponsored" : [ "QJDMJ0PvkYA=" ], @@ -44,5 +45,6 @@ "confirm and clear sponsor|protocol version 22|not sponsored" : [ "0rCskf3w41Q=" ], "confirm and clear sponsor|protocol version 23|not sponsored" : [ "5KjEutNtf8g=" ], "confirm and clear sponsor|protocol version 24|not sponsored" : [ "5KjEutNtf8g=" ], - "confirm and clear sponsor|protocol version 25|not sponsored" : [ "5KjEutNtf8g=" ] + "confirm and clear sponsor|protocol version 25|not sponsored" : [ "5KjEutNtf8g=" ], + "confirm and clear sponsor|protocol version 26|not sponsored" : [ "5KjEutNtf8g=" ] } diff --git a/test-tx-meta-baseline-current/EventTests.json b/test-tx-meta-baseline-current/EventTests.json index f302a1adb5..d21db62196 100644 --- a/test-tx-meta-baseline-current/EventTests.json +++ b/test-tx-meta-baseline-current/EventTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "payment events|protocol version 0" : [ @@ -385,6 +386,25 @@ "payment events|protocol version 25|mint event (payer is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], "payment events|protocol version 25|mint event with memo ID" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], "payment events|protocol version 25|with tx memo" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 26" : + [ + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=" + ], + "payment events|protocol version 26|a pays b, a is mux" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 26|a pays b, b is mux" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 26|a pays b. Also validate fee event" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 26|burn event (payee is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=", "urzqLiB3Ryo=" ], + "payment events|protocol version 26|memo order of precedence" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 26|mint event (payer is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], + "payment events|protocol version 26|mint event with memo ID" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], + "payment events|protocol version 26|with tx memo" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], "payment events|protocol version 2|a pays b, a is mux" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], "payment events|protocol version 2|a pays b, b is mux" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], "payment events|protocol version 2|a pays b. Also validate fee event" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], diff --git a/test-tx-meta-baseline-current/FeeBumpTransactionTests.json b/test-tx-meta-baseline-current/FeeBumpTransactionTests.json index b3b2d9108d..77fadb2045 100644 --- a/test-tx-meta-baseline-current/FeeBumpTransactionTests.json +++ b/test-tx-meta-baseline-current/FeeBumpTransactionTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "fee bump transactions|protocol version 0|apply|bad signatures" : [ "Yhe2gNuDHbY=" ], "fee bump transactions|protocol version 0|apply|extra signatures" : [ "OB5K2o+Lbus=", "2vq/WrMO01Y=" ], @@ -327,6 +328,23 @@ "fee bump transactions|protocol version 25|validity|inner transaction invalid, transaction level" : [ "/7ACbejmtbQ=" ], "fee bump transactions|protocol version 25|validity|insufficient balance" : [ "urCUjHnhTso=" ], "fee bump transactions|protocol version 25|validity|valid" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 26|apply|bad signatures" : [ "NhEx+s6J1Zs=", "yP8dhV0/pQM=" ], + "fee bump transactions|protocol version 26|apply|extra signatures" : [ "CdLCGSh1huU=", "MOQMoybQQxc=", "CwphNloF/gQ=" ], + "fee bump transactions|protocol version 26|apply|fee source does not exist" : [ "NhEx+s6J1Zs=", "fYD+RdGUZ7w=" ], + "fee bump transactions|protocol version 26|apply|inner transaction fails, operation level" : [ "NhEx+s6J1Zs=" ], + "fee bump transactions|protocol version 26|apply|inner transaction fails, transaction level" : [ "NhEx+s6J1Zs=", "xID29F/qzKk=" ], + "fee bump transactions|protocol version 26|apply|insufficient balance" : [ "NhEx+s6J1Zs=", "yE2a74X0L7w=" ], + "fee bump transactions|protocol version 26|apply|one-time signer removal" : [ "H0brR3zmSJ4=", "N/hrQ2v7Thk=", "H0brR3zmSJ4=", "N/hrQ2v7Thk=" ], + "fee bump transactions|protocol version 26|apply|one-time signer removal|not sponsored" : [ "8+/oNk7vshI=", "DaR9c0iTG2k=" ], + "fee bump transactions|protocol version 26|apply|one-time signer removal|sponsored" : [ "8+/oNk7vshI=" ], + "fee bump transactions|protocol version 26|fee processing" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 26|validity|bad signatures, signature invalid" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 26|validity|bad signatures, signature missing" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 26|validity|extra signatures" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 26|validity|inner transaction invalid, operation level" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 26|validity|inner transaction invalid, transaction level" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 26|validity|insufficient balance" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 26|validity|valid" : [ "/7ACbejmtbQ=" ], "fee bump transactions|protocol version 2|apply|bad signatures" : [ "Yhe2gNuDHbY=" ], "fee bump transactions|protocol version 2|apply|extra signatures" : [ "OB5K2o+Lbus=", "2vq/WrMO01Y=" ], "fee bump transactions|protocol version 2|apply|fee source does not exist" : [ "Yhe2gNuDHbY=" ], diff --git a/test-tx-meta-baseline-current/FrozenLedgerKeysTests.json b/test-tx-meta-baseline-current/FrozenLedgerKeysTests.json new file mode 100644 index 0000000000..943089b22f --- /dev/null +++ b/test-tx-meta-baseline-current/FrozenLedgerKeysTests.json @@ -0,0 +1,2066 @@ + +{ + "!cfg protocol version" : 26, + "!rng seed" : 12345, + "!test all versions" : true, + "!versions to test" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "deauth removes offers on frozen account" : + [ + "DacWHBn53mA=", + "BHt32BfGHdg=", + "thRTR69es+0=", + "RQrU/aegI2c=", + "liUp8uVOyp0=", + "iRy/J6geXLQ=", + "GDoBb0yXRAQ=" + ], + "freeze bypass tx hash allows frozen key access at validation time" : + [ + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=" + ], + "frozen ledger keys DEX offer operations" : + [ + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX path payments" : + [ + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=" + ], + "frozen ledger keys apply time validation" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=" + ], + "frozen ledger keys apply time validation|claim claimable balance trustline frozen" : [ "KWQKyjBIFco=" ], + "frozen ledger keys apply time validation|liquidity pool deposit assetA trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool deposit assetB trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool withdraw assetA trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool withdraw assetB trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys in Soroban footprint" : [ "E/Hp+63+Q2Y=" ], + "operation destination frozen" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=" + ], + "operation destination frozen|ClawbackOp from trustline frozen" : [ "dl3b5XRie08=", "6Umcp50dy1w=", "NCE6KjdBf2I=", "6eJJgJRJRVk=" ], + "operation destination frozen|SetTrustLineFlagsOp trustor trustline frozen" : [ "FFNGCyg5dJ4=" ], + "source account frozen" : + [ + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=" + ], + "source account frozen|fee bump source account frozen" : [ "6CmtErdDHKk=" ], + "source account frozen|one of multiple ops source account frozen" : [ "OnSCl340l+U=", "OBYw8xSVvlY=" ], + "source account frozen|op source account frozen" : [ "Z4OpilPA/jk=" ], + "source account frozen|op source frozen via muxed account ID" : [ "R01UcLdO4lI=" ], + "source trustline frozen" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=" + ], + "sponsorship can be removed with frozen sponsor" : [ "DNbanX3bsGI=", "A6H9fxI4C/k=", "eUPWbi2D4Bc=" ] +} diff --git a/test-tx-meta-baseline-current/InflationTests.json b/test-tx-meta-baseline-current/InflationTests.json index b350b5c11d..f905cf892b 100644 --- a/test-tx-meta-baseline-current/InflationTests.json +++ b/test-tx-meta-baseline-current/InflationTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "inflation|protocol version 10|inflation scenarios|50/50 split" : [ @@ -45,8 +46,7 @@ "okLol2/zzkI=", "B5S2fRH2ri8=", "ElojLaOm1x8=", - "15i9Ac2qDrA=", - "I4s+Pkequ8c=" + "15i9Ac2qDrA=" ], "inflation|protocol version 10|inflation scenarios|all to one destination" : [ @@ -61,8 +61,7 @@ "VTMnSq4QfAo=", "Y0RBsIJxSE8=", "8xhlGIhx6f0=", - "mBql+0cJxK4=", - "fCo+/8egePU=" + "mBql+0cJxK4=" ], "inflation|protocol version 10|inflation scenarios|no one over min" : [ @@ -78,7 +77,6 @@ "0OQKWDOLqnw=", "gTd5waf6+pY=", "whqO/nU1IEQ=", - "CMs2zJVJdIw=", "zes9HSGAPb4=", "3CS1kePxH6Q=", "cRAGh4ul+Xk=", @@ -2278,8 +2276,7 @@ "SkAzeo4YgPs=", "Jval1YuxC6w=", "VwHDrLXwm2c=", - "IS91VZZhfUQ=", - "7ijobQ0fB+Y=" + "IS91VZZhfUQ=" ], "inflation|protocol version 10|inflation scenarios|no winner" : [ @@ -2294,8 +2291,7 @@ "GKCPV2dubW8=", "0OQKWDOLqnw=", "gTd5waf6+pY=", - "whqO/nU1IEQ=", - "CMs2zJVJdIw=" + "whqO/nU1IEQ=" ], "inflation|protocol version 10|inflation scenarios|some winner does not exist" : [ @@ -2310,8 +2306,7 @@ "YdBenUbFiEc=", "AzhHkyOSuPM=", "tjrvBlONHHc=", - "KBqgRxqJvGM=", - "KFHhqn/7IGw=" + "KBqgRxqJvGM=" ], "inflation|protocol version 10|inflation scenarios|two guys over threshold" : [ @@ -2434,41 +2429,12 @@ "HjFEn03j0O4=", "vSfv6dmnldw=", "b9sqKjeGb58=", - "BaWwvPGbVs8=", - "arnsoVdb5+s=" - ], - "inflation|protocol version 10|inflation with liabilities|available balance greater than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "6EPKgfSY9sE=", - "bSP0fZ3GGHs=", - "7JSijM9osnU=" - ], - "inflation|protocol version 10|inflation with liabilities|large available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "B/4xkrwFZEA=", - "kgm9Iohtweg=", - "Zf1mhZEHVdU=" - ], - "inflation|protocol version 10|inflation with liabilities|no available balance" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "LIrttP4HQjY=", - "z3ftJsvTIBo=", - "jwLsLdvf5FY=" - ], - "inflation|protocol version 10|inflation with liabilities|small available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "UXKxM34HcWE=", - "61+zX+N8RQg=", - "xu7ZC272ZdM=" + "BaWwvPGbVs8=" ], + "inflation|protocol version 10|inflation with liabilities|available balance greater than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "6EPKgfSY9sE=", "bSP0fZ3GGHs=" ], + "inflation|protocol version 10|inflation with liabilities|large available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "B/4xkrwFZEA=", "kgm9Iohtweg=" ], + "inflation|protocol version 10|inflation with liabilities|no available balance" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "LIrttP4HQjY=", "z3ftJsvTIBo=" ], + "inflation|protocol version 10|inflation with liabilities|small available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "UXKxM34HcWE=", "61+zX+N8RQg=" ], "inflation|protocol version 10|not time" : [ "7lvxYNMEkXM=", @@ -2491,8 +2457,7 @@ "okLol2/zzkI=", "B5S2fRH2ri8=", "ElojLaOm1x8=", - "15i9Ac2qDrA=", - "I4s+Pkequ8c=" + "15i9Ac2qDrA=" ], "inflation|protocol version 11|inflation scenarios|all to one destination" : [ @@ -2507,8 +2472,7 @@ "VTMnSq4QfAo=", "Y0RBsIJxSE8=", "8xhlGIhx6f0=", - "mBql+0cJxK4=", - "fCo+/8egePU=" + "mBql+0cJxK4=" ], "inflation|protocol version 11|inflation scenarios|no one over min" : [ @@ -2524,7 +2488,6 @@ "0OQKWDOLqnw=", "gTd5waf6+pY=", "whqO/nU1IEQ=", - "CMs2zJVJdIw=", "zes9HSGAPb4=", "3CS1kePxH6Q=", "cRAGh4ul+Xk=", @@ -4724,8 +4687,7 @@ "SkAzeo4YgPs=", "Jval1YuxC6w=", "VwHDrLXwm2c=", - "IS91VZZhfUQ=", - "7ijobQ0fB+Y=" + "IS91VZZhfUQ=" ], "inflation|protocol version 11|inflation scenarios|no winner" : [ @@ -4740,8 +4702,7 @@ "GKCPV2dubW8=", "0OQKWDOLqnw=", "gTd5waf6+pY=", - "whqO/nU1IEQ=", - "CMs2zJVJdIw=" + "whqO/nU1IEQ=" ], "inflation|protocol version 11|inflation scenarios|some winner does not exist" : [ @@ -4756,8 +4717,7 @@ "YdBenUbFiEc=", "AzhHkyOSuPM=", "tjrvBlONHHc=", - "KBqgRxqJvGM=", - "KFHhqn/7IGw=" + "KBqgRxqJvGM=" ], "inflation|protocol version 11|inflation scenarios|two guys over threshold" : [ @@ -4880,41 +4840,12 @@ "HjFEn03j0O4=", "vSfv6dmnldw=", "b9sqKjeGb58=", - "BaWwvPGbVs8=", - "arnsoVdb5+s=" - ], - "inflation|protocol version 11|inflation with liabilities|available balance greater than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "6EPKgfSY9sE=", - "bSP0fZ3GGHs=", - "7JSijM9osnU=" - ], - "inflation|protocol version 11|inflation with liabilities|large available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "B/4xkrwFZEA=", - "kgm9Iohtweg=", - "Zf1mhZEHVdU=" - ], - "inflation|protocol version 11|inflation with liabilities|no available balance" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "LIrttP4HQjY=", - "z3ftJsvTIBo=", - "jwLsLdvf5FY=" - ], - "inflation|protocol version 11|inflation with liabilities|small available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "UXKxM34HcWE=", - "61+zX+N8RQg=", - "xu7ZC272ZdM=" + "BaWwvPGbVs8=" ], + "inflation|protocol version 11|inflation with liabilities|available balance greater than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "6EPKgfSY9sE=", "bSP0fZ3GGHs=" ], + "inflation|protocol version 11|inflation with liabilities|large available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "B/4xkrwFZEA=", "kgm9Iohtweg=" ], + "inflation|protocol version 11|inflation with liabilities|no available balance" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "LIrttP4HQjY=", "z3ftJsvTIBo=" ], + "inflation|protocol version 11|inflation with liabilities|small available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "UXKxM34HcWE=", "61+zX+N8RQg=" ], "inflation|protocol version 11|not time" : [ "7lvxYNMEkXM=", @@ -4945,8 +4876,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 1|inflation scenarios|all to one destination" : [ @@ -4961,8 +4891,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 1|inflation scenarios|no one over min" : [ @@ -4978,7 +4907,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -7178,8 +7106,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 1|inflation scenarios|no winner" : [ @@ -7194,8 +7121,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 1|inflation scenarios|some winner does not exist" : [ @@ -7210,8 +7136,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 1|inflation scenarios|two guys over threshold" : [ @@ -7334,41 +7259,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 1|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 1|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 1|not time" : [ "/lfj8xIFS8I=", @@ -7384,6 +7280,7 @@ "inflation|protocol version 23|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 24|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 25|not supported" : [ "Zby/J3+a3+M=" ], + "inflation|protocol version 26|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 2|inflation scenarios|50/50 split" : [ "kLAIaEj7I2M=", @@ -7397,8 +7294,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 2|inflation scenarios|all to one destination" : [ @@ -7413,8 +7309,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 2|inflation scenarios|no one over min" : [ @@ -7430,7 +7325,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -9630,8 +9524,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 2|inflation scenarios|no winner" : [ @@ -9646,8 +9539,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 2|inflation scenarios|some winner does not exist" : [ @@ -9662,8 +9554,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 2|inflation scenarios|two guys over threshold" : [ @@ -9786,41 +9677,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 2|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 2|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 2|not time" : [ "/lfj8xIFS8I=", @@ -9843,8 +9705,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 3|inflation scenarios|all to one destination" : [ @@ -9859,8 +9720,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 3|inflation scenarios|no one over min" : [ @@ -9876,7 +9736,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -12076,8 +11935,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 3|inflation scenarios|no winner" : [ @@ -12092,8 +11950,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 3|inflation scenarios|some winner does not exist" : [ @@ -12108,8 +11965,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 3|inflation scenarios|two guys over threshold" : [ @@ -12232,41 +12088,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 3|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 3|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 3|not time" : [ "/lfj8xIFS8I=", @@ -12289,8 +12116,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 4|inflation scenarios|all to one destination" : [ @@ -12305,8 +12131,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 4|inflation scenarios|no one over min" : [ @@ -12322,7 +12147,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -14522,8 +14346,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 4|inflation scenarios|no winner" : [ @@ -14538,8 +14361,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 4|inflation scenarios|some winner does not exist" : [ @@ -14554,8 +14376,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 4|inflation scenarios|two guys over threshold" : [ @@ -14678,41 +14499,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 4|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 4|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 4|not time" : [ "/lfj8xIFS8I=", @@ -14735,8 +14527,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 5|inflation scenarios|all to one destination" : [ @@ -14751,8 +14542,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 5|inflation scenarios|no one over min" : [ @@ -14768,7 +14558,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -16968,8 +16757,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 5|inflation scenarios|no winner" : [ @@ -16984,8 +16772,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 5|inflation scenarios|some winner does not exist" : [ @@ -17000,8 +16787,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 5|inflation scenarios|two guys over threshold" : [ @@ -17124,41 +16910,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 5|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 5|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 5|not time" : [ "/lfj8xIFS8I=", @@ -17181,8 +16938,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 6|inflation scenarios|all to one destination" : [ @@ -17197,8 +16953,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 6|inflation scenarios|no one over min" : [ @@ -17214,7 +16969,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -19414,8 +19168,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 6|inflation scenarios|no winner" : [ @@ -19430,8 +19183,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 6|inflation scenarios|some winner does not exist" : [ @@ -19446,8 +19198,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 6|inflation scenarios|two guys over threshold" : [ @@ -19570,41 +19321,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 6|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 6|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 6|not time" : [ "/lfj8xIFS8I=", @@ -19627,8 +19349,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 7|inflation scenarios|all to one destination" : [ @@ -19643,8 +19364,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 7|inflation scenarios|no one over min" : [ @@ -19660,7 +19380,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -21860,8 +21579,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 7|inflation scenarios|no winner" : [ @@ -21876,8 +21594,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 7|inflation scenarios|some winner does not exist" : [ @@ -21892,8 +21609,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 7|inflation scenarios|two guys over threshold" : [ @@ -22016,41 +21732,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 7|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 7|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 7|not time" : [ "/lfj8xIFS8I=", @@ -22073,8 +21760,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 8|inflation scenarios|all to one destination" : [ @@ -22089,8 +21775,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 8|inflation scenarios|no one over min" : [ @@ -22106,7 +21791,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -24306,8 +23990,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 8|inflation scenarios|no winner" : [ @@ -24322,8 +24005,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 8|inflation scenarios|some winner does not exist" : [ @@ -24338,8 +24020,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 8|inflation scenarios|two guys over threshold" : [ @@ -24462,41 +24143,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 8|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 8|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 8|not time" : [ "/lfj8xIFS8I=", @@ -24519,8 +24171,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 9|inflation scenarios|all to one destination" : [ @@ -24535,8 +24186,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 9|inflation scenarios|no one over min" : [ @@ -24552,7 +24202,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -26752,8 +26401,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 9|inflation scenarios|no winner" : [ @@ -26768,8 +26416,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 9|inflation scenarios|some winner does not exist" : [ @@ -26784,8 +26431,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 9|inflation scenarios|two guys over threshold" : [ @@ -26908,41 +26554,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 9|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 9|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 9|not time" : [ "/lfj8xIFS8I=", diff --git a/test-tx-meta-baseline-current/InvokeHostFunctionTests.json b/test-tx-meta-baseline-current/InvokeHostFunctionTests.json index 657217d9fc..878c33b4b1 100644 --- a/test-tx-meta-baseline-current/InvokeHostFunctionTests.json +++ b/test-tx-meta-baseline-current/InvokeHostFunctionTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "Failed write still causes ttl observation" : [ "+cR3oq2qY0I=", "qJ8KIK1AUN8=", "mvtbiiIU4+E=", "tLtF1ukXymY=" ], "Module cache" : [ "MR6BJ3xmn2c=" ], @@ -38,296 +39,296 @@ "Module cache cost with restore gaps" : [ "+cR3oq2qY0I=", - "otnd+GHMKpE=", - "/VLp/3iN+To=", + "aNLDpx+d0IQ=", + "xUGbgZ/E+CU=", "+cR3oq2qY0I=", - "otnd+GHMKpE=", - "/VLp/3iN+To=" + "aNLDpx+d0IQ=", + "xUGbgZ/E+CU=" ], "Module cache miss on immediate execution" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], - "Module cache miss on immediate execution|same ledger upload and execution" : [ "otnd+GHMKpE=", "/VLp/3iN+To=", "NDnBxhxdn4o=", "RCvKpCbS0VA=" ], + "Module cache miss on immediate execution|same ledger upload and execution" : [ "aNLDpx+d0IQ=", "xUGbgZ/E+CU=", "c5cI6O8UE2k=", "U18PA9C2bOU=" ], "Native stellar asset contract" : [ "+cR3oq2qY0I=", - "DUET1r2TwOg=", - "j3E4E4zpoHM=", - "nOOGkrrnOFw=", - "UivZvwUUrZ0=", - "HnO1VwITuAw=", - "NC1BmSQafHo=" + "v/UMJBmXfpU=", + "c5hMI0Elm+M=", + "Hy46FpEBO/4=", + "Y47MsGv0nS8=", + "VW84T3660GI=", + "15WZmVivTk4=" ], "Soroban authorization" : [ "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=", + "fmUTHKvD/oc=", "+cR3oq2qY0I=", - "eXRag4qphMs=" + "fmUTHKvD/oc=" ], "Soroban authorization|classic account with weights" : [ @@ -361,427 +362,427 @@ ], "Soroban authorization|multisig classic account" : [ - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=", - "hk2rDeFSMfE=", + "828qTZIN62M=", "zRcsukev3/o=" ], "Soroban classic account authentication" : [ "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=", + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=", "+cR3oq2qY0I=", - "506wsfQ6WH8=", - "cygdg0act80=", - "roLvvQHEvZU=" + "KZu7zfNieRw=", + "z4n404MMtso=", + "gjWPsRTDO9U=" ], "Soroban classic account authentication|account with required multisig" : [ @@ -898,409 +899,409 @@ "Soroban footprint validation" : [ "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=", + "DYMU3nlUXvo=", "+cR3oq2qY0I=", - "D6gZiurAyn8=" + "DYMU3nlUXvo=" ], "Soroban non-refundable resource fees are stable|protocol version 20" : [ "bKDF6V5IzTo=" ], "Soroban non-refundable resource fees are stable|protocol version 21" : [ "bKDF6V5IzTo=" ], @@ -1308,22 +1309,23 @@ "Soroban non-refundable resource fees are stable|protocol version 23" : [ "+cR3oq2qY0I=" ], "Soroban non-refundable resource fees are stable|protocol version 24" : [ "+cR3oq2qY0I=" ], "Soroban non-refundable resource fees are stable|protocol version 25" : [ "+cR3oq2qY0I=" ], + "Soroban non-refundable resource fees are stable|protocol version 26" : [ "+cR3oq2qY0I=" ], "Stellar asset contract transfer with CAP-67 address types" : [ "+cR3oq2qY0I=", - "ZSWXwiEvmGc=", - "qZijGr6z0/Q=", + "Rs/PGnv73JY=", + "10hZi1wChI0=", "NjESxGWSAbY=", "bFkjDfabs9w=", - "dZtj/r2V8e8=", - "1cZ+FujNqNk=", + "N+Zof/XqwL8=", + "g6OoL0u5VkM=", "+cR3oq2qY0I=", - "ZSWXwiEvmGc=", - "qZijGr6z0/Q=", + "Rs/PGnv73JY=", + "10hZi1wChI0=", "NjESxGWSAbY=", "bFkjDfabs9w=", - "dZtj/r2V8e8=", - "1cZ+FujNqNk=" + "N+Zof/XqwL8=", + "g6OoL0u5VkM=" ], "Trustline stellar asset contract|protocol version 20" : [ @@ -1403,6 +1405,20 @@ "Xl79rsoQeGo=", "wHwgNBvEIfA=" ], + "Trustline stellar asset contract|protocol version 26" : + [ + "NTGGdj1offM=", + "dJ7wIRG9fGM=", + "m7dhjUPnS7c=", + "JXXSYU51PEk=", + "i6QEhSSAatQ=", + "rZB9oqyMSdg=", + "ei4T6aiso3E=", + "yYwUqope2ZU=", + "Xl79rsoQeGo=", + "wHwgNBvEIfA=", + "kskE4Ud1al0=" + ], "Vm instantiation tightening" : [ "MR6BJ3xmn2c=" ], "archival meta|protocol version 20" : [ @@ -1644,6 +1660,61 @@ "+cR3oq2qY0I=", "lCieN6G6nuM=" ], + "archival meta|protocol version 26" : + [ + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=" + ], "autorestore contract instance" : [ "+cR3oq2qY0I=", @@ -1755,13 +1826,28 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "basic contract invocation|protocol version 26" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "buying liabilities plus refund is greater than INT64_MAX" : [ "+cR3oq2qY0I=", - "WWgZ3GYf720=", - "AY2cswXoaYc=", + "h7hz+vlrMS4=", + "VWUk+WBJs24=", "MCDwmrFHzQY=", - "ME40pL8heq0=" + "zaFBAJ/pKdg=" ], "charge rent fees for storage resize" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=", "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], "classic payment source same as soroban fee bump source|protocol version 21" : [ "NTGGdj1offM=", "WQxK0L0eSCg=", "XYBFgdXMM2Q=", "qTDm8RGyn5o=" ], @@ -1769,23 +1855,27 @@ "classic payment source same as soroban fee bump source|protocol version 23" : [ "NTGGdj1offM=", "/BL0GVDK25E=", "el74K0RTG3s=", "G2A+Ze4n0j0=" ], "classic payment source same as soroban fee bump source|protocol version 24" : [ "NTGGdj1offM=", "/BL0GVDK25E=", "el74K0RTG3s=", "G2A+Ze4n0j0=" ], "classic payment source same as soroban fee bump source|protocol version 25" : [ "NTGGdj1offM=", "/BL0GVDK25E=", "el74K0RTG3s=", "G2A+Ze4n0j0=" ], + "classic payment source same as soroban fee bump source|protocol version 26" : [ "NTGGdj1offM=", "JkjG87qxDtA=", "gOE41BpipEE=", "rZI7+N9E35o=" ], "classic payment to soroban fee bump account|protocol version 21" : [ "NTGGdj1offM=", "fjoLcDhWHYA=", "4IRpUOj0+wQ=", "sSgQaOxyoRw=" ], "classic payment to soroban fee bump account|protocol version 22" : [ "NTGGdj1offM=", "uATUQupgc10=", "Bm2FUdIKm9s=", "lvpJjIticYI=" ], "classic payment to soroban fee bump account|protocol version 23" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], "classic payment to soroban fee bump account|protocol version 24" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], "classic payment to soroban fee bump account|protocol version 25" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], + "classic payment to soroban fee bump account|protocol version 26" : [ "NTGGdj1offM=", "aHlgICbAAQs=", "1S4Ni3f8c/0=", "wiDaeJY86QQ=" ], "classic phase bumps sequence of soroban source account|protocol version 20" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "9Rpfyyb4ewI=" ], "classic phase bumps sequence of soroban source account|protocol version 21" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "9Rpfyyb4ewI=" ], "classic phase bumps sequence of soroban source account|protocol version 22" : [ "NTGGdj1offM=", "CTLGLR5LLHY=", "xXpwdFz6+Uc=" ], "classic phase bumps sequence of soroban source account|protocol version 23" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "3KNBsUHfZIc=" ], "classic phase bumps sequence of soroban source account|protocol version 24" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "3KNBsUHfZIc=" ], "classic phase bumps sequence of soroban source account|protocol version 25" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "3KNBsUHfZIc=" ], + "classic phase bumps sequence of soroban source account|protocol version 26" : [ "NTGGdj1offM=", "da8GTCxd54M=", "9CwFTVdoLAc=" ], "classic phase sets master weight of soroban source account to 0|protocol version 20" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "Xrc/DmdG8do=" ], "classic phase sets master weight of soroban source account to 0|protocol version 21" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "Xrc/DmdG8do=" ], "classic phase sets master weight of soroban source account to 0|protocol version 22" : [ "NTGGdj1offM=", "CTLGLR5LLHY=", "FBx7+A8nzD8=" ], "classic phase sets master weight of soroban source account to 0|protocol version 23" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "CpEmfvshkZs=" ], "classic phase sets master weight of soroban source account to 0|protocol version 24" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "CpEmfvshkZs=" ], "classic phase sets master weight of soroban source account to 0|protocol version 25" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "CpEmfvshkZs=" ], + "classic phase sets master weight of soroban source account to 0|protocol version 26" : [ "NTGGdj1offM=", "da8GTCxd54M=", "EgZGRWa/jP0=" ], "complex contract|diagnostics disabled" : [ "+cR3oq2qY0I=" ], "complex contract|diagnostics enabled" : [ "+cR3oq2qY0I=" ], "contract constructor support" : @@ -1871,8 +1961,19 @@ "+cR3oq2qY0I=" ], "contract storage|protocol version 25|footprint|unused readWrite key" : [ "DoR65weeeAk=" ], - "create in first stage delete in second stage" : [ "+cR3oq2qY0I=", "MQWsAsiP/Lg=", "9ztD9SE/Uek=" ], - "delete in first stage extend in second stage" : [ "+cR3oq2qY0I=", "MQWsAsiP/Lg=", "9ztD9SE/Uek=" ], + "contract storage|protocol version 26" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], + "contract storage|protocol version 26|footprint|unused readWrite key" : [ "cPvvRUP0NPQ=" ], + "create in first stage delete in second stage" : [ "+cR3oq2qY0I=", "0hd/OzcsUOc=", "WlN4KxDWk6Q=" ], + "delete in first stage extend in second stage" : [ "+cR3oq2qY0I=", "0hd/OzcsUOc=", "WlN4KxDWk6Q=" ], "delete non existent entry with parallel apply" : [ "+cR3oq2qY0I=", "MQWsAsiP/Lg=" ], "failure diagnostics" : [ "+cR3oq2qY0I=" ], "fee bump inner account merged then used as inner account on soroban fee bump|protocol version 21" : @@ -1915,6 +2016,14 @@ "4wVGUgmORrk=", "9/RHd8t1ab4=" ], + "fee bump inner account merged then used as inner account on soroban fee bump|protocol version 26" : + [ + "+cR3oq2qY0I=", + "436Fz1Yi0Ts=", + "KvGyFNFxZNU=", + "atdtuKny6hU=", + "3ZsUMDlmszc=" + ], "fee bump refund account merged|protocol version 20" : [ "NTGGdj1offM=", @@ -1963,6 +2072,14 @@ "VANzopQnZEI=", "5SMRvgvDsPg=" ], + "fee bump refund account merged|protocol version 26" : + [ + "NTGGdj1offM=", + "hKYDUB68SCM=", + "UYuGUCgj4ZE=", + "c5hUdIZ/qhk=", + "DHmwRyYdmCc=" + ], "ledger entry size limit enforced" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], "loadgen Wasm executes properly" : [ "+cR3oq2qY0I=" ], "merge account then SAC payment scenarios|protocol version 20" : @@ -2055,6 +2172,21 @@ "XgQ36O588Cw=", "AeLB0v5FV3E=" ], + "merge account then SAC payment scenarios|protocol version 26" : + [ + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=", + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=", + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=" + ], "multiple soroban ops in a tx|protocol version 20" : [ "bKDF6V5IzTo=", "n9Sc/mMA2VA=", "bKDF6V5IzTo=", "n9Sc/mMA2VA=" ], "multiple soroban ops in a tx|protocol version 20|with fee bump" : [ "nfyrGO2ZGaM=" ], "multiple soroban ops in a tx|protocol version 21" : [ "bKDF6V5IzTo=", "SStJyt3nT/c=", "bKDF6V5IzTo=", "SStJyt3nT/c=" ], @@ -2067,12 +2199,15 @@ "multiple soroban ops in a tx|protocol version 24|with fee bump" : [ "+6PP7MKB9TU=" ], "multiple soroban ops in a tx|protocol version 25" : [ "+cR3oq2qY0I=", "dVqD6K4nmbM=", "+cR3oq2qY0I=", "dVqD6K4nmbM=" ], "multiple soroban ops in a tx|protocol version 25|with fee bump" : [ "+6PP7MKB9TU=" ], + "multiple soroban ops in a tx|protocol version 26" : [ "+cR3oq2qY0I=", "IL12u4uPsBM=", "+cR3oq2qY0I=", "IL12u4uPsBM=" ], + "multiple soroban ops in a tx|protocol version 26|with fee bump" : [ "JBz2FcMw6No=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 20" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 21" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 22" : [ "NTGGdj1offM=", "uXD8Cnl+z1A=", "geKndLx9Dwk=", "up/hSXkPDJo=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 23" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 24" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 25" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], + "non-fee source account is recipient of payment in both classic and soroban|protocol version 26" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], "overly large soroban values are handled gracefully" : [ "+cR3oq2qY0I=", @@ -2651,56 +2786,56 @@ ], "persistent entry archival|eviction|key accessible after restore in same ledger" : [ - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=" + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=" ], "persistent entry archival|eviction|key accessible after restore in same ledger|failed auto restores and manual restores across stages" : [ - "PNtHDHajXz4=", - "wHoV3BY03HQ=", - "DL1g7Vel8yU=", - "PNtHDHajXz4=", - "wHoV3BY03HQ=", - "DL1g7Vel8yU=" + "m/UYMpeCgsA=", + "nujSAjZQHO4=", + "mHXUwK62gHE=", + "m/UYMpeCgsA=", + "nujSAjZQHO4=", + "mHXUwK62gHE=" ], "persistent entry archival|eviction|key accessible after restore in same ledger|restore, delete, restore" : [ - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=" + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=" ], "persistent entry archival|expiration without eviction" : [ @@ -2725,101 +2860,105 @@ ], "persistent entry archival|expiration without eviction|key accessible after restore in same ledger" : [ - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=", - "ImGdUJJCFZM=", - "RH+UShPLOJY=" + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=", + "vN6VaEUAMfE=", + "++g0jjlKRcE=" ], "persistent entry archival|expiration without eviction|key accessible after restore in same ledger|failed auto restores and manual restores across stages" : [ - "PNtHDHajXz4=", - "wHoV3BY03HQ=", - "DL1g7Vel8yU=", - "PNtHDHajXz4=", - "wHoV3BY03HQ=", - "DL1g7Vel8yU=" + "m/UYMpeCgsA=", + "nujSAjZQHO4=", + "mHXUwK62gHE=", + "m/UYMpeCgsA=", + "nujSAjZQHO4=", + "mHXUwK62gHE=" ], "persistent entry archival|expiration without eviction|key accessible after restore in same ledger|restore, delete, restore" : [ - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=", - "qkHKGYYnCSI=", - "bxv547+A4zA=" + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=", + "BoasYJcGpvk=", + "25DgJYP2eWs=" ], - "put in first stage and then update value in second stage" : [ "+cR3oq2qY0I=", "MQWsAsiP/Lg=", "9ztD9SE/Uek=" ], + "put in first stage and then update value in second stage" : [ "+cR3oq2qY0I=", "0hd/OzcsUOc=", "WlN4KxDWk6Q=" ], "read-only bumps across threads" : [ "+cR3oq2qY0I=", - "hFmIG0TZzKk=", - "07gXFzPdYd8=", - "qLimGbOITx8=", - "Ailk5Wavd1Y=", - "DhlYrpLW8OY=", - "T9nnMuwBnIo=", - "ewn8a2qomCo=", - "q008p8qGHIs=", - "+M8i+OyobEE=", - "RD4SbL+fpW4=" + "tVPF7dLrrcw=", + "G3GdRfm4wRQ=", + "xqdH+rKz3xs=", + "uo+J8KRgD5s=", + "qEDkOyMmalg=", + "JGhz45XykmA=", + "s4/V4wDDtK4=", + "pwhxutYoRlI=", + "iw1evm/FAio=", + "HdrEpKm+apQ=" ], "readonly ttl bumps across threads and stages" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=", "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], - "readonly ttl bumps across threads and stages|extend_persistent contract function across stages" : [ "kWYr7JsyOAA=", "cWjuJ/NVUEM=", "W1s8kYSi65Q=" ], - "readonly ttl bumps across threads and stages|multiple readonly ttl bumps across stages" : [ "kWYr7JsyOAA=", "cWjuJ/NVUEM=", "W1s8kYSi65Q=" ], - "readonly ttl bumps across threads and stages|multiple readonly ttl bumps same stage" : [ "kWYr7JsyOAA=", "cWjuJ/NVUEM=", "W1s8kYSi65Q=" ], - "readonly ttl bumps across threads and stages|readonly ttl bumps with mixed stages" : [ "kWYr7JsyOAA=", "cWjuJ/NVUEM=", "W1s8kYSi65Q=", "1z01ayx4NdE=" ], + "readonly ttl bumps across threads and stages|extend_persistent contract function across stages" : [ "NWxuZNiBUPk=", "ynPosgyDKK4=", "bZSbdr+3ekM=" ], + "readonly ttl bumps across threads and stages|multiple readonly ttl bumps across stages" : [ "NWxuZNiBUPk=", "ynPosgyDKK4=", "bZSbdr+3ekM=" ], + "readonly ttl bumps across threads and stages|multiple readonly ttl bumps same stage" : [ "NWxuZNiBUPk=", "ynPosgyDKK4=", "bZSbdr+3ekM=" ], + "readonly ttl bumps across threads and stages|readonly ttl bumps with mixed stages" : [ "NWxuZNiBUPk=", "ynPosgyDKK4=", "bZSbdr+3ekM=", "zWs8m7t1uRk=" ], "refund account merged|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=", "l3luGRqcBNU=" ], "refund account merged|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=", "l3luGRqcBNU=" ], "refund account merged|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=", "51g/NdOY708=", "qBAN8h2uYsI=" ], "refund account merged|protocol version 23" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=", "VANzopQnZEI=" ], "refund account merged|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=", "VANzopQnZEI=" ], "refund account merged|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=", "VANzopQnZEI=" ], + "refund account merged|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=", "c5hUdIZ/qhk=" ], "refund is sent to fee-bump source|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund is sent to fee-bump source|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund is sent to fee-bump source|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=", "51g/NdOY708=" ], "refund is sent to fee-bump source|protocol version 23" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund is sent to fee-bump source|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund is sent to fee-bump source|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], + "refund is sent to fee-bump source|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], "refund still happens on bad auth|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund still happens on bad auth|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund still happens on bad auth|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=", "51g/NdOY708=" ], "refund still happens on bad auth|protocol version 23" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund still happens on bad auth|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund still happens on bad auth|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], + "refund still happens on bad auth|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], "refund test with closeLedger|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=" ], "refund test with closeLedger|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=" ], "refund test with closeLedger|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=" ], "refund test with closeLedger|protocol version 23" : [ "NTGGdj1offM=", "6peNuI0WUWU=" ], "refund test with closeLedger|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=" ], "refund test with closeLedger|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=" ], + "refund test with closeLedger|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=" ], "refund to source in tx1 and SAC transfer from same account in tx2|protocol version 20" : [ "NTGGdj1offM=", @@ -2874,6 +3013,15 @@ "iA54BbkrMmc=", "KLpBGpyr9Fg=" ], + "refund to source in tx1 and SAC transfer from same account in tx2|protocol version 26" : + [ + "NTGGdj1offM=", + "kqd1AzcRBeU=", + "oxBuoWbPY2M=", + "NTGGdj1offM=", + "kqd1AzcRBeU=", + "oxBuoWbPY2M=" + ], "resource fee exceeds uint32" : [ "+cR3oq2qY0I=", @@ -2891,28 +3039,28 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], - "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee with high inclusion fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee with low resource fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|other account fee bump|failure|insufficient fee bumper balance" : [ "WBATg5AATZk=", "Qi9f98GkVqg=" ], - "resource fee exceeds uint32|other account fee bump|success|inclusion fee and refund exceed uint32" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|other account fee bump|success|inclusion fee exceeds uint32" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|other account fee bump|success|low inclusion fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee with high inclusion fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee with low resource fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|failure|insufficient fee bumper balance" : [ "WBATg5AATZk=", "Qi9f98GkVqg=" ], - "resource fee exceeds uint32|self fee bump|success|inclusion fee and refund exceed uint32" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|success|inclusion fee exceeds uint32" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], - "resource fee exceeds uint32|self fee bump|success|low inclusion fee" : [ "WBATg5AATZk=", "JxOQiPepSZ4=" ], + "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee with high inclusion fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|other account fee bump|failure|fee bump fee is not sufficient to cover the resource fee with low resource fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|other account fee bump|failure|insufficient fee bumper balance" : [ "QCYuPRuwr0o=", "nxKoRdhkvH8=" ], + "resource fee exceeds uint32|other account fee bump|success|inclusion fee and refund exceed uint32" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|other account fee bump|success|inclusion fee exceeds uint32" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|other account fee bump|success|low inclusion fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee with high inclusion fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|failure|fee bump fee is not sufficient to cover the resource fee with low resource fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|failure|insufficient fee bumper balance" : [ "QCYuPRuwr0o=", "nxKoRdhkvH8=" ], + "resource fee exceeds uint32|self fee bump|success|inclusion fee and refund exceed uint32" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|success|inclusion fee exceeds uint32" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], + "resource fee exceeds uint32|self fee bump|success|low inclusion fee" : [ "QCYuPRuwr0o=", "8hnk3kwQsaE=" ], "settings upgrade" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], "settings upgrade command line utils" : [ - "5Dik3DGN1A4=", - "5Dik3DGN1A4=", - "5Dik3DGN1A4=", - "5Dik3DGN1A4=", - "5Dik3DGN1A4=" + "zXMGEuOWxwE=", + "zXMGEuOWxwE=", + "zXMGEuOWxwE=", + "zXMGEuOWxwE=", + "zXMGEuOWxwE=" ], "source account of first tx is in second txs footprint|protocol version 20" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], "source account of first tx is in second txs footprint|protocol version 21" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], @@ -2920,6 +3068,7 @@ "source account of first tx is in second txs footprint|protocol version 23" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "source account of first tx is in second txs footprint|protocol version 24" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "source account of first tx is in second txs footprint|protocol version 25" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], + "source account of first tx is in second txs footprint|protocol version 26" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], "state archival operation errors|protocol version 20" : [ "bKDF6V5IzTo=", @@ -2986,6 +3135,17 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "state archival operation errors|protocol version 26" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "state archival|protocol version 20" : [ "bKDF6V5IzTo=", @@ -3094,6 +3254,24 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "state archival|protocol version 26" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "transaction validation diagnostics" : [ "+cR3oq2qY0I=" ], "trustline deletion then SAC payment|protocol version 20" : [ @@ -3161,6 +3339,17 @@ "T452ExvJRU0=", "U3cl0rcrkIE=" ], + "trustline deletion then SAC payment|protocol version 26" : + [ + "+cR3oq2qY0I=", + "b/fY7LlgGo4=", + "g6TpGLXhIY4=", + "v3bfhcmu/lA=", + "1sdvrI0ljdU=", + "8+WGK0Ogv8k=", + "T452ExvJRU0=", + "U3cl0rcrkIE=" + ], "validate return values|protocol version 20" : [ "bKDF6V5IzTo=", @@ -3227,5 +3416,16 @@ "q25JLYe6/DE=", "n3yV5IX7urw=" ], + "validate return values|protocol version 26" : + [ + "+cR3oq2qY0I=", + "IL12u4uPsBM=", + "TsmRFGNQZXw=", + "3vL2mMtcm70=", + "ndN3JwediTI=", + "N+dicBLi5m0=", + "crqL+imN/4Y=", + "UBoXpTeXotI=" + ], "version test" : [ "766L+TYsWqA=" ] } diff --git a/test-tx-meta-baseline-current/LiquidityPoolDepositTests.json b/test-tx-meta-baseline-current/LiquidityPoolDepositTests.json index 33806cd448..1d764317aa 100644 --- a/test-tx-meta-baseline-current/LiquidityPoolDepositTests.json +++ b/test-tx-meta-baseline-current/LiquidityPoolDepositTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "liquidity pool deposit|protocol version 10|not supported before protocol 18" : [ "X2yKCWehH5U=" ], "liquidity pool deposit|protocol version 11|not supported before protocol 18" : [ "X2yKCWehH5U=" ], @@ -1657,6 +1658,208 @@ "rWgI3zRbOIE=", "9xMyUK9Hqgo=" ], + "liquidity pool deposit|protocol version 26|bad price in existing pool due to 0 calculated deposit amounts for both assets" : + [ + "3Z8M0tc2y4o=", + "82/LqEGmN4Q=", + "+Dz1kPXWG40=", + "MzAHgiW1f2s=", + "TmxbA7OSPfI=", + "CN3XD6Y0lPE=", + "mqFZhAUxCaA=", + "FZvWRJ8PQzM=" + ], + "liquidity pool deposit|protocol version 26|both non-native without liabilities" : + [ + "KPadaxNwZEQ=", + "dKxoH50Kji0=", + "+DXwkil4Ekk=", + "CnVpXVZVG90=", + "bHQfXGWqzEs=", + "63FxEYRLy2w=", + "qBn1xAn5dPA=", + "UDWqLfj0e+E=", + "s0saHEjddN8=", + "CbYM83NEDbE=", + "dMFdIx+mytw=", + "BqwIayU4/Vg=", + "MGNrEEO3eJ8=", + "AICPdC/v5+k=", + "FRZWdlEimpw=", + "3CuiEuSAh88=", + "lxf2QnhY1I8=", + "fLvlDdLzvDI=", + "m6g4Svik7z0=", + "Qw3LLYggtBY=", + "TAVKIwU1vHk=", + "PbEe87PG7Oo=", + "W0PMhvOfyvY=", + "1jx49+gqTA4=", + "2YTSCJt9Fvs=", + "/P/eZN9IesM=", + "fT0gdlzHeLI=", + "KECr1nKb8Bc=", + "X56Ntb/lF1k=", + "4Rf/Oi1/OaE=", + "qe5cGAuA1YA=", + "jAwi4AEoFog=", + "r3skzXmlKV4=", + "/Mnfp3PuqyU=", + "UEKKmuogRpM=", + "uFLCmV+3vPg=", + "zwX2BJRAPKI=", + "dF6uPvEbNEA=", + "fkv1wgY+9WM=", + "RGIJTjNi6ms=" + ], + "liquidity pool deposit|protocol version 26|one non-native without liabilities" : + [ + "KPadaxNwZEQ=", + "l1HCxSd4aRA=", + "LYFG721ojsA=", + "A+v0AsH0O60=", + "7fWi6Vih0zM=", + "f2jrR3qD2Rc=", + "v8Xa2paSLII=", + "Rl63n62ndfo=", + "mV26iQfEKWE=", + "bSDPZ/bCVo0=", + "JhJmwf9U86M=", + "brrJ3YS2BJI=", + "kqHqoNS03FA=", + "vfdfU56vqG4=", + "1YtJttx0Rgw=", + "wlBzWGVWNE4=", + "qwqsYHNHOWc=", + "Yqylhvzil/w=", + "droWXE6EHYo=", + "iU0CngPLHdY=", + "YWRAzQzdwKg=", + "7yDCPmLhpmI=", + "Z8wFC7sZxFc=", + "MosLnj2LFQA=", + "Ac7UfH0CnWI=", + "W6zApeuTczY=", + "9TMWJ3D5juw=", + "O9YnlS64xe4=", + "SOs6N28/XYU=", + "3wBeOJJOEeM=", + "Fg/7s1YVHhg=", + "pcp9V2U8xd4=" + ], + "liquidity pool deposit|protocol version 26|pool share calculation overflows for one asset" : + [ + "3Z8M0tc2y4o=", + "n38JJ0P5t08=", + "XUTu0d5Phpw=", + "q4lbyr614Ns=", + "8vjLWn3FPvc=", + "+dZuGYEOOrc=", + "sNDdWz/lx4I=", + "niKzBOa5MH0=", + "5QJkJ3iHAcQ=", + "zBYS9iFaXTw=", + "/RhSmssDtJM=", + "kCcBGDCL6B4=", + "3Z8M0tc2y4o=", + "n38JJ0P5t08=", + "XUTu0d5Phpw=", + "q4lbyr614Ns=", + "8vjLWn3FPvc=", + "+dZuGYEOOrc=", + "sNDdWz/lx4I=", + "niKzBOa5MH0=", + "5QJkJ3iHAcQ=", + "zBYS9iFaXTw=", + "/RhSmssDtJM=", + "kCcBGDCL6B4=" + ], + "liquidity pool deposit|protocol version 26|pool share calculation overflows for one asset|deposit then withdraw - rounding results in extra asset in pool - assetA fail" : [ "5n1S3BUJEUM=", "9wcTNyGR/QM=", "/47n/Cv7Jr0=", "fkh77qTimgA=" ], + "liquidity pool deposit|protocol version 26|pool share calculation overflows for one asset|deposit then withdraw - rounding results in extra asset in pool - assetB fail" : [ "0jPmYtweOvk=", "l/2TbkSPkIE=", "eXwDMwWCXy8=", "qf50g7Ch4YI=" ], + "liquidity pool deposit|protocol version 26|underfunded due to liabilities" : + [ + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=", + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=", + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=" + ], + "liquidity pool deposit|protocol version 26|underfunded due to liabilities|assetA" : + [ + "A0rxRc/TlIA=", + "FZ1PIzsoTbA=", + "y8CFjdD0VEs=", + "M/Z41Cbq4iM=", + "0dcgbhrfx2c=", + "HoL45XD4gjw=", + "+k49/n6WCQ0=", + "yYWB6dIXpFI=", + "z48yvi/h/FE=", + "pKGcmChGbag=" + ], + "liquidity pool deposit|protocol version 26|underfunded due to liabilities|assetB" : + [ + "3o+NIkSOrYM=", + "FZ1PIzsoTbA=", + "BeHdQh1w0TE=", + "olhQp66/aQc=", + "0dcgbhrfx2c=", + "HoL45XD4gjw=", + "5Q2ivM7H49E=", + "yYWB6dIXpFI=", + "/SYrVARU5OQ=", + "LlRZJJxKzmU=" + ], + "liquidity pool deposit|protocol version 26|underfunded due to liabilities|native" : + [ + "iymAmKwyMQA=", + "6DhobJYecJQ=", + "/FpEPyuFGL8=", + "Vzj+s4gsqmo=", + "9pfkxNpG7RA=", + "FcYbCwOfSOE=", + "pEXsKuz8yDY=", + "o4XI8ePjWzU=", + "76TPVczLZwE=", + "8lr0vbko2I8=", + "ENxm6pGMmVk=", + "mhGCU5d2c/o=", + "sd/UseinCHY=", + "Rdua52j41yA=", + "KnodtZT8gC8=" + ], + "liquidity pool deposit|protocol version 26|validity checks" : + [ + "Zby/J3+a3+M=", + "c3wyZ9CLvUY=", + "JuC4AuiIpbs=", + "RpcbumH8vz8=", + "gfKt+nb+HGo=", + "E+1gFs0xgc4=", + "+IopLW8CNwc=", + "zWL1ZtG34Jg=", + "HCraC1rTyGE=", + "Mph+WRIoQDM=", + "K2Xp/o5UFaA=", + "rWgI3zRbOIE=", + "9xMyUK9Hqgo=" + ], "liquidity pool deposit|protocol version 2|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], "liquidity pool deposit|protocol version 3|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], "liquidity pool deposit|protocol version 4|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-current/LiquidityPoolTradeTests.json b/test-tx-meta-baseline-current/LiquidityPoolTradeTests.json index b6f31d5126..2513448995 100644 --- a/test-tx-meta-baseline-current/LiquidityPoolTradeTests.json +++ b/test-tx-meta-baseline-current/LiquidityPoolTradeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "liquidity pool trade|protocol version 18|CUR1, CUR2|chooses best price" : [ @@ -16647,5 +16648,2082 @@ "liquidity pool trade|protocol version 25|without offers|one native, strict send|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], "liquidity pool trade|protocol version 25|without offers|one native, strict send|pool sells native|at limit" : [ "azMuD88dCkU=" ], "liquidity pool trade|protocol version 25|without offers|one native, strict send|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], - "liquidity pool trade|protocol version 25|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ] + "liquidity pool trade|protocol version 25|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|chooses best price" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|chooses best price|book has strictly better price" : [ "1idf6qqcC4Q=", "nsxaelSu21M=", "88h/3pddn4c=", "/PD8oiagY7g=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|chooses best price|both prices equal" : [ "30H9KZ3jFgI=", "d1WK+HgwjuE=", "bk61FSHHbpk=", "hL2gIbEJ6kA=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|chooses best price|pool has strictly better price" : [ "1idf6qqcC4Q=", "nsxaelSu21M=", "uoQx538BxG4=", "8UoqXbU1NUg=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in opposite directions" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times" : [ "2AwHrS6wykc=", "2AwHrS6wykc=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times|strict receive" : [ "QB+kfYBW5/8=", "7eXzB1YsV/I=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times|strict send" : [ "QB+kfYBW5/8=", "7eXzB1YsV/I=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times" : [ "hgEJXBqQBb4=", "wPjsYkGaFdk=", "hgEJXBqQBb4=", "wPjsYkGaFdk=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict receive" : [ "7CtIquKmEfo=", "pKSMkpCxPlI=", "T4zBa/avARo=", "HreVih42xWc=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict send" : + [ + "ZLPTwl/EzxU=", + "3g3TxOBYms0=", + "1E9ykqio9cE=", + "IRDexUyTMF8=", + "kiUZCuyxY8g=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times|strict receive" : [ "T4zBa/avARo=", "v2LGpc22URI=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times|strict send" : [ "T4zBa/avARo=", "rD5rlp6j168=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop" : [ "0WeWWmFry7k=", "TV5RMDwS8R0=", "0WeWWmFry7k=", "TV5RMDwS8R0=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict receive" : [ "T4zBa/avARo=", "Xkpj75WtVhg=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict send" : [ "T4zBa/avARo=", "Xkpj75WtVhg=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop" : [ "j+Vh/O2mlOA=", "Bu0IuxaitXE=", "j+Vh/O2mlOA=", "Bu0IuxaitXE=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict receive" : [ "T4zBa/avARo=", "Wet6BjDbzxQ=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict send" : [ "T4zBa/avARo=", "Wet6BjDbzxQ=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop" : [ "M3v5n92xflc=", "4cIgiEreFws=", "M3v5n92xflc=", "4cIgiEreFws=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict receive" : [ "T4zBa/avARo=", "xrKYH4syXtE=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict send" : [ "T4zBa/avARo=", "6GYWaNgllys=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|order book both times" : [ "d7yibHVwTf4=", "DJ4ZL7Kc/J0=", "d7yibHVwTf4=", "DJ4ZL7Kc/J0=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|order book both times|strict receive" : [ "T4zBa/avARo=", "q7CXWxiHsn8=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|cross the same pair twice in the same direction|order book both times|strict send" : [ "T4zBa/avARo=", "q7CXWxiHsn8=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|liquidity pool charges the correct fee" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "2AwHrS6wykc=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "2AwHrS6wykc=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|liquidity pool charges the correct fee|strict receive" : [ "QB+kfYBW5/8=", "oFuMpzT5/0g=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|liquidity pool charges the correct fee|strict send" : [ "QB+kfYBW5/8=", "oFuMpzT5/0g=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|max offers to cross" : + [ + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|max offers to cross|liquidity pool fails when crossing one above limit" : + [ + "XJcTPWOr8rE=", + "i8CXc+ffC4Y=", + "lMqnbV+hjDw=", + "DjpOkMz6q78=", + "gClDf/W22Jc=", + "NB/k1EMXdt8=", + "aS+Lp6WTq/o=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|max offers to cross|liquidity pool succeeds when crossing limit" : [ "XJcTPWOr8rE=", "GWBV/wUIRnk=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|max offers to cross|order book fails when crossing one above limit" : [ "YjYn982b8+g=", "i8CXc+ffC4Y=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|max offers to cross|order book succeeds when crossing limit" : [ "YjYn982b8+g=", "z9TNHHlIjto=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|order book is better, but there is a self-trade" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|order book is better, but there is a self-trade|strict receive|no self trade" : [ "m4DMzye4STs=", "v1m1W8YdE0A=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|order book is better, but there is a self-trade|strict receive|self trade" : [ "2tc96YzF5ls=", "Xp4CJx7lo/Q=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|order book is better, but there is a self-trade|strict send|no self trade" : [ "m4DMzye4STs=", "vHQuHjal1MI=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|order book is better, but there is a self-trade|strict send|self trade" : [ "2tc96YzF5ls=", "Xp4CJx7lo/Q=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment into pool would be larger than INT64_MAX" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "OsaGWTRDcIs=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "1KXxz9e/1Gs=", + "5A9fKOmF378=", + "Uiazntlkamw=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment into pool would be larger than INT64_MAX|strict receive" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that a market maker participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "fJ2pdS6t5aM=", + "jyjxGnhtQGQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "fJ2pdS6t5aM=", + "jyjxGnhtQGQ=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that a market maker participates in|strict receive" : [ "rX+FXU5Tag4=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that a market maker participates in|strict send" : [ "rX+FXU5Tag4=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the destination participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "z/J9FjCjmPs=", + "1frK1TvX9aM=", + "q4bRDzg5H8A=", + "kAh4djC8e18=", + "Wg8lqRELqEA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "z/J9FjCjmPs=", + "1frK1TvX9aM=", + "q4bRDzg5H8A=", + "kAh4djC8e18=", + "Wg8lqRELqEA=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the destination participates in|strict receive" : [ "j6tHMpdf/14=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the destination participates in|strict send" : [ "j6tHMpdf/14=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the sender participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the sender participates in|strict receive" : [ "4LdY9l7ZIf0=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through a pool that the sender participates in|strict send" : [ "4LdY9l7ZIf0=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through empty liquidity pools" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "7mklc0KyvKE=", + "BwoMPmvt5Vw=", + "6EnneHN8vD0=", + "L4T/6iPhf4o=", + "wQ86b5xJ848=", + "mC59mA054cI=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "7mklc0KyvKE=", + "BwoMPmvt5Vw=", + "6EnneHN8vD0=", + "L4T/6iPhf4o=", + "wQ86b5xJ848=", + "mC59mA054cI=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through empty liquidity pools|strict receive" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through empty liquidity pools|strict send" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through pool after offer that yields nothing" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "xw1HaX1EoqA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "mwYZszOnj/g=", + "pfjMjwAI3dM=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=", + "KuiafWI8woI=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through pool after offer that yields nothing|strict send" : [ "OKq29a3HWFo=", "yidLcZxajJw=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through pool that yields nothing" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "VoIw2rGAkJc=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment through pool that yields nothing|strict send" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment would receive more than the reserve" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "OsaGWTRDcIs=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "k4+j9exyGhQ=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|payment would receive more than the reserve|strict receive" : [ "QB+kfYBW5/8=", "bnwzjUxDAAo=", "ZOg1vYd66As=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|trade fails due to excess reserves" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "SXARJE9hdHs=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "SXARJE9hdHs=" + ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|trade fails due to excess reserves|strict receive" : [ "QB+kfYBW5/8=", "pyHrXCwrei4=" ], + "liquidity pool trade|protocol version 26|CUR1, CUR2|trade fails due to excess reserves|strict send" : [ "QB+kfYBW5/8=", "pyHrXCwrei4=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|chooses best price" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|chooses best price|book has strictly better price" : [ "rgU3E3KrQP8=", "Y6SkZ57nWls=", "gqUla51RoCs=", "mVMhZs+koog=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|chooses best price|both prices equal" : [ "sjR96OGIjEo=", "OGm/oJP+Lag=", "RcQ+swdN710=", "YBiqxTrwLok=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|chooses best price|pool has strictly better price" : [ "rgU3E3KrQP8=", "Y6SkZ57nWls=", "m+VfXbDDFkE=", "wY+Wsq691Ic=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in opposite directions" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times" : [ "W5IrbHh1mEM=", "W5IrbHh1mEM=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times|strict receive" : [ "QB+kfYBW5/8=", "eNWZthsSWMc=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times|strict send" : [ "QB+kfYBW5/8=", "eNWZthsSWMc=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times" : [ "8FfQAly+ITI=", "OGFIVsoNSIo=", "8FfQAly+ITI=", "OGFIVsoNSIo=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict receive" : [ "QurnT01khwI=", "JqG3PMy3Uw0=", "T4zBa/avARo=", "UzlycVmt2YM=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict send" : + [ + "aVt4idxeGVM=", + "W5SkZpAOrQg=", + "mAUgw292idY=", + "IRDexUyTMF8=", + "f0tuCQxAalc=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times|strict receive" : [ "T4zBa/avARo=", "P4cKVBRO2oo=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times|strict send" : [ "T4zBa/avARo=", "PkRp+D7OELI=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop" : [ "xipyLwVqK+U=", "GbAnn4uzjZI=", "xipyLwVqK+U=", "GbAnn4uzjZI=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict receive" : [ "T4zBa/avARo=", "DjUa8s81zx8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict send" : [ "T4zBa/avARo=", "DjUa8s81zx8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop" : [ "ZCYpWKyL+NE=", "sIvwfNpkeZI=", "ZCYpWKyL+NE=", "sIvwfNpkeZI=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict receive" : [ "T4zBa/avARo=", "fZj0Ac9t2ao=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict send" : [ "T4zBa/avARo=", "fZj0Ac9t2ao=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop" : [ "DtCu6Y+X2Xo=", "8rtXCdzMnUA=", "DtCu6Y+X2Xo=", "8rtXCdzMnUA=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict receive" : [ "T4zBa/avARo=", "5EAwzxAfco8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict send" : [ "T4zBa/avARo=", "PqCtHi98PCA=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|order book both times" : [ "O7VVW13ioQs=", "pB4Wg16XMrM=", "O7VVW13ioQs=", "pB4Wg16XMrM=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|order book both times|strict receive" : [ "T4zBa/avARo=", "xS3e2wBQsMQ=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|cross the same pair twice in the same direction|order book both times|strict send" : [ "T4zBa/avARo=", "xS3e2wBQsMQ=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|liquidity pool charges the correct fee" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "W5IrbHh1mEM=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "W5IrbHh1mEM=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|liquidity pool charges the correct fee|strict receive" : [ "QB+kfYBW5/8=", "g1/MlEWFPaY=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|liquidity pool charges the correct fee|strict send" : [ "QB+kfYBW5/8=", "g1/MlEWFPaY=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|max offers to cross" : + [ + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|max offers to cross|liquidity pool fails when crossing one above limit" : + [ + "/o3X7QzeRJE=", + "i8CXc+ffC4Y=", + "4y5R3DybfKo=", + "DjpOkMz6q78=", + "0lHckhHHa+I=", + "sbeDrgv6/eg=", + "aS+Lp6WTq/o=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|max offers to cross|liquidity pool succeeds when crossing limit" : [ "/o3X7QzeRJE=", "3o2c9OJDVLw=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|max offers to cross|order book fails when crossing one above limit" : [ "H+sjMQpO2QY=", "i8CXc+ffC4Y=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|max offers to cross|order book succeeds when crossing limit" : [ "H+sjMQpO2QY=", "6uZArrsZu9s=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|order book is better, but there is a self-trade" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|order book is better, but there is a self-trade|strict receive|no self trade" : [ "4pOq/SKFLg0=", "qFaN7hkwp+I=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|order book is better, but there is a self-trade|strict receive|self trade" : [ "No9kQ15bEd0=", "61GVuTgS1tw=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|order book is better, but there is a self-trade|strict send|no self trade" : [ "4pOq/SKFLg0=", "1rjUpg7HBS8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|order book is better, but there is a self-trade|strict send|self trade" : [ "No9kQ15bEd0=", "61GVuTgS1tw=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment into pool would be larger than INT64_MAX" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "zDRGlHRPtSU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "VfKh7Mqmf2s=", + "xaEZTuWcI/A=", + "WHsyl28xpL8=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment into pool would be larger than INT64_MAX|strict receive" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that a market maker participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "20lAYj+2q/w=", + "6DVHVqxV7f8=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "20lAYj+2q/w=", + "6DVHVqxV7f8=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that a market maker participates in|strict receive" : [ "sbv+GIZfMTk=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that a market maker participates in|strict send" : [ "sbv+GIZfMTk=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the destination participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "XaOHGgiDS7M=", + "Gt5XxwhKanY=", + "MudyJYS7Qh4=", + "VfazWtZVHpA=", + "jPNzZZ5UK4M=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "XaOHGgiDS7M=", + "Gt5XxwhKanY=", + "MudyJYS7Qh4=", + "VfazWtZVHpA=", + "jPNzZZ5UK4M=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the destination participates in|strict receive" : [ "rfq0jhmV5aQ=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the destination participates in|strict send" : [ "rfq0jhmV5aQ=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the sender participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the sender participates in|strict receive" : [ "NYwYFPeHAj0=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through a pool that the sender participates in|strict send" : [ "NYwYFPeHAj0=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through empty liquidity pools" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "+V51XryRTlc=", + "g8235W1R1xo=", + "TaIZc0PXOwc=", + "LCYGjVC6uRo=", + "Ai6iOZXY2/k=", + "mC59mA054cI=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "+V51XryRTlc=", + "g8235W1R1xo=", + "TaIZc0PXOwc=", + "LCYGjVC6uRo=", + "Ai6iOZXY2/k=", + "mC59mA054cI=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through empty liquidity pools|strict receive" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through empty liquidity pools|strict send" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through pool after offer that yields nothing" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "xw1HaX1EoqA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "/ES7XV64ijE=", + "pfjMjwAI3dM=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=", + "XoumJjWza2o=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through pool after offer that yields nothing|strict send" : [ "OKq29a3HWFo=", "yidLcZxajJw=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through pool that yields nothing" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "gnCW6thOpK8=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment through pool that yields nothing|strict send" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment would receive more than the reserve" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "zDRGlHRPtSU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "6m7okHuk+Jw=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|payment would receive more than the reserve|strict receive" : [ "QB+kfYBW5/8=", "bnwzjUxDAAo=", "jOhl5lGyNPY=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|trade fails due to excess reserves" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "DR+Vl3N8rlc=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "DR+Vl3N8rlc=" + ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|trade fails due to excess reserves|strict receive" : [ "QB+kfYBW5/8=", "6VUvx7HXbOs=" ], + "liquidity pool trade|protocol version 26|CUR2, CUR1|trade fails due to excess reserves|strict send" : [ "QB+kfYBW5/8=", "6VUvx7HXbOs=" ], + "liquidity pool trade|protocol version 26|without offers" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=" + ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur1|at limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur1|satisfies limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur2|at limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur2|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict receive|pool sells cur2|satisfies limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur1|at limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur1|satisfies limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur2|at limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur2|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|both non-native, strict send|pool sells cur2|satisfies limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells cur1|at limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells native|at limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict receive|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells cur1|at limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|at limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ] } diff --git a/test-tx-meta-baseline-current/LiquidityPoolWithdrawTests.json b/test-tx-meta-baseline-current/LiquidityPoolWithdrawTests.json index 6546d35c2b..f18bf095a3 100644 --- a/test-tx-meta-baseline-current/LiquidityPoolWithdrawTests.json +++ b/test-tx-meta-baseline-current/LiquidityPoolWithdrawTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "liquidity pool withdraw|protocol version 0" : [ "1kTXt7VFL1o=" ], "liquidity pool withdraw|protocol version 1" : [ "1kTXt7VFL1o=" ], @@ -12316,6 +12317,1539 @@ "4isDr+X5NBQ=", "ZXOCz0P9J2w=" ], + "liquidity pool withdraw|protocol version 26" : + [ + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=" + ], + "liquidity pool withdraw|protocol version 26|both non-native issuer deposit and withdraw" : + [ + "Qgk3guxhcVI=", + "CHuj+qrc0Tk=", + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "tMPf2GY/5z0=", + "pxgUi2S26TM=", + "h1jJVHJ3Iow=", + "h2UgPzdxmrQ=", + "CTtFRzm8Z9Q=", + "LfYrZeUAaFk=" + ], + "liquidity pool withdraw|protocol version 26|both non-native one asset withdraw is zero" : + [ + "I2iIYR+cu2w=", + "09cc2uWQBKg=", + "clpvLcM5i0Y=", + "UdO5P7LffTQ=", + "cQLiZIK9KNE=", + "aEoD5FR/irI=", + "JR/c+VfJsrs=", + "0F7DPJnys7Y=", + "4wI0GNamyE0=", + "J68MeiK/89I=", + "93d+jR3tDJ0=", + "pXAS6NXfttw=", + "L7Yomzi3eFc=" + ], + "liquidity pool withdraw|protocol version 26|both non-native without liabilities" : + [ + "JalXUAF9b20=", + "Qpa3JrV4pLY=", + "pSCTBOr9yks=", + "sTDCmgYe/s0=", + "pBx/q6UNLdg=", + "PqCcTjPfKw4=", + "RJUCj6Qk2Nc=", + "Zg1VvoVVgbI=", + "B98PykTfhH4=", + "WvD+Cx8NWzE=", + "WbBOlufInd8=", + "qiFgKHxEH+M=", + "pJ6fI9onSPQ=", + "uHeNfeldpeY=", + "DfBFTlAW7X4=", + "+eTxOM93SoA=", + "ljG2/2WumfY=", + "R62Am0Pb53A=", + "16FqBMQhObE=", + "Jdsn9etSx9I=", + "j3i8AGxW97I=", + "UkPTyIceS5w=", + "Z2DlFN+HZbc=", + "YofrdSRuoa0=", + "yYQRgBMsOcQ=", + "On7F5pwtk+A=", + "+7ug0I4odzI=", + "jV1iTe4NBnk=", + "L3NX8yvH3Dw=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1000" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "6lV+Q8szXTQ=", + "mXjv3723hFs=", + "ruvVfGazffo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "xI2gT6C81rM=", + "oD/ItykwNDs=", + "7ssun2DqZWI=", + "YGK+xC1S71c=", + "71R80Y7MUUA=", + "CzS7t3iy+6M=", + "extEk5ryvxA=", + "2kHRkR6uBcI=", + "MO+zCVtx6zw=", + "r/o1iHX7L7M=", + "KPW2nN0oFKw=", + "7ZNaDlfK/7A=", + "vYmN0ehour4=", + "XpMjQCX3WDE=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1001" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "qbNWWS94uis=", + "kSPd6ffqo3E=", + "CfYlLDA8wLs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "+nZ0q1e7ZIo=", + "R1eE+oAKeXo=", + "O5HZx6IzFjQ=", + "P42D+cLdhd8=", + "Z44OdYoYlJI=", + "9t5iFVGFOgI=", + "jmAsAV4sIEE=", + "RcSrneHVmRg=", + "Fm24fbjC+OU=", + "lIabVllYFfI=", + "jdxxS9ydLtM=", + "MNKTLnpYOUc=", + "sqfAX5mine8=", + "sqlHfVgSZ+A=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1002" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "P3CrjwQpwrs=", + "s2ZG3LnofOQ=", + "aNVxvW32h+g=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "yqzx+3k3D60=", + "VbO/3UcCBzA=", + "a158pO2ALDA=", + "W/cKDy5Zxxo=", + "lN3farzpMMo=", + "yPDWIhxhPRk=", + "r6tHmIpPPE4=", + "HT9ekiicI70=", + "QWUUnJMC6Tw=", + "shBaODT+QXI=", + "QwNJsdtLnFY=", + "ogctZfqX0AQ=", + "AEmaN9oW8LY=", + "gDdF8Sg+kjQ=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1003" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "gZbrCZFCl/k=", + "oz4nTemvbmA=", + "5/p1qoUI8xY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "uLtl50CPOgI=", + "Qg8QGwEWlr4=", + "qaoU11u5NzI=", + "ff0KRHGRNto=", + "ujUXYLeply8=", + "9S1hiFrkDCw=", + "pizvNXzqplQ=", + "vCukk+zkgYQ=", + "GO+Lbh6br8Q=", + "t0LcZ3N1Eo0=", + "wrUfsAu55EM=", + "AmpPkRt/54E=", + "ZGntxzVSY9Q=", + "BO18lKIdCNk=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1004" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "xI4o28Ma/CI=", + "ZSzrQAPIs7U=", + "UqzkAuSC6W8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "h8yhhqSWE+s=", + "g2dWQE5D2ug=", + "CSFYMAkTrVs=", + "mI2q5ikWQkw=", + "4t1nh2NRMbA=", + "OaHUr5jXbdQ=", + "hzgfHce1iv8=", + "CnQmFDjm7jU=", + "cCq85GmjJmQ=", + "gHoxPOpBY68=", + "5oGZKe4MbpY=", + "D6SsxF9d/S0=", + "L+ZpFlEFKTs=", + "kPKse+XAfo4=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1005" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "/yy4cXD226Y=", + "F6DQ40+sl74=", + "aILq+wL0zJA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "yV7F2HHdhIY=", + "WwQrN7XyWr8=", + "u1FoS8lXD18=", + "pcrqOUhOrPU=", + "f4dvJNr2cYw=", + "w1iPKbHb+ZM=", + "vyh5thrfu+Q=", + "G6drLodnrK4=", + "OOGWBy2VO18=", + "8DKAcroOYVo=", + "/DLjfaVaaEo=", + "SPUCNtIpndk=", + "CJOJLEPtyR8=", + "B1MZRCttCEo=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1006" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "9YF4PsUENZo=", + "Ax1X1tS534k=", + "zO5jKWFkLOE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QtvzWjRNyps=", + "rK4WVA9S2rc=", + "BZSdPpvQzQE=", + "vNz2gVTNnwA=", + "KpraksXYFFA=", + "xE0mAKTVE/Q=", + "BZjRQSsLIlM=", + "iYrMAhI+DYI=", + "l/Jd0wWXq4Q=", + "wE3nWyfMd2M=", + "MmGtHSSY/pk=", + "jEu79aIe2y4=", + "bWo7Ra77or4=", + "SZvBu+HP4hU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1007" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "GNFLpQUK/OE=", + "3u8KjQRyHbI=", + "PC2MRXhpvr4=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WKsO1i0qvM0=", + "32l8pYiZ3mw=", + "uuoJauGZP7k=", + "FhMm/6S88Zw=", + "sIK8N56erVY=", + "9uSiSsk5IcY=", + "4t8CECZj6w4=", + "QQhAmL52wpg=", + "jj6vUQF74VM=", + "rAX7H4BDnio=", + "T46wwytY7l4=", + "CksbEy6bL3w=", + "9uqU6zJ0OBQ=", + "0OoHounEokc=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1008" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "b9VMvhugQSQ=", + "W+zXZQNS2bw=", + "DHkVZwJEmGI=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "4r6m09DEmNQ=", + "aGdl/S82jBc=", + "LM+AMYtTfo4=", + "Y/16m8lCk7k=", + "3avfSqDnbRs=", + "lJ3gNlNPJKw=", + "8zJgrExyf/U=", + "qTyaTUf1wzo=", + "Y2t3mBY6svU=", + "Vkc+QjCCU7Y=", + "EBMywg94nWU=", + "tLenvWIfk0Q=", + "hommyF+kkCQ=", + "iAMLZA9XZ2o=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1009" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "YVcZatfyI+k=", + "6Yse299GGN8=", + "e5QqIk640lw=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "qS3Td8WbvDY=", + "krH7GJh4GZA=", + "jYiKG8QQAq8=", + "lSmWGugpbCA=", + "6zbQD4rgCfo=", + "j5msCJHaEBw=", + "SoliTFakZ2k=", + "GLaTWqJ8xYg=", + "PEOuzxgdgBI=", + "GbeWHP7kiUw=", + "ds8q2jV6fvM=", + "jFa2QGyqE2Q=", + "RNR47XCgJhs=", + "v6t1gfaUbGM=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1010" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "rQAkH41fSSI=", + "u2raXDhM8UQ=", + "cG3OPmDy3XA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "CoVaQnuwzYo=", + "IqWOHV0R6G4=", + "L8eBEgt2uOg=", + "ycIsHKbErJQ=", + "6OZXGnV3770=", + "tGvvL3AYXnw=", + "j3hQU04RIWs=", + "0bX8WYFcZKg=", + "1pLH9Kfgsxg=", + "eq1gGFuXQaU=", + "Gqv8LHaopD0=", + "utTuqbK2G94=", + "9Z00lvCDNZM=", + "/OtOSSHpSp0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1011" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "zfvHIT53uSM=", + "D8gTjk9CMZ8=", + "fcjo+HS8mng=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "DFUcRNgyHlY=", + "Y1Y2v9YcpfA=", + "PKy7I4Zq/YA=", + "dMyWALjg9Lg=", + "BxYUv+Zpifo=", + "gRGnc+KY0jQ=", + "D7mxsSeCn14=", + "QCZi6iIWhkA=", + "Xg+OTorBb2I=", + "KCqY6ZdZjrM=", + "GN8Bu9/vHFE=", + "7x3aIudQkbo=", + "6AGUGdNIl6M=", + "7JTCOFumpcU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1012" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "/4jF7ulo21g=", + "Fe4fkcbcRMY=", + "3JTK0woNY4g=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "v6Bau2Rv8Uc=", + "ITnkXHgd31o=", + "a1cYZ1TYWAs=", + "UG/fkCUjYao=", + "IC5slD36/mo=", + "l4X8jhWpmo8=", + "K8DwRYFZGdg=", + "/Lz8lFNoCJw=", + "Bf3xhTWF4u0=", + "RVyXaG89+s8=", + "RLw4WQEJSXo=", + "W2ROW4LZMwk=", + "XFpC2lBX7vM=", + "/NOjl2SwdE0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1013" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "1cs8o/5lN2g=", + "3+yGcyAN878=", + "Wo7XjYt3pgs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "jSf4Q/d91qQ=", + "fmWQYEfCxrs=", + "WanSh3/LIVQ=", + "yXT/NkoISlY=", + "2eznaCyENnM=", + "p4ULYvzuDxY=", + "cujnkhsZ4HI=", + "gG310bb8e2g=", + "egX4NZuRQCU=", + "QSZenLcXOes=", + "g87QomHDcnI=", + "wIlEN9HpVrU=", + "GsupsiuJCnc=", + "8qx5CqdS0aw=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1014" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "pyBAMcvtTMQ=", + "oTSp543wilw=", + "T/fzU1z6txs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "kjO1IuzaGuQ=", + "U4W9a3+Rc9E=", + "T8cd/9b2u5c=", + "kzi84lxrcg4=", + "A3mYQ8AYnIs=", + "zVJYyUxEQzQ=", + "ZRKmaTqQDKM=", + "kc5RxpDlYEs=", + "FZXOOQL51RY=", + "iNOf0FzHmK4=", + "lMQXWhTudrA=", + "6nRnfkFDSxc=", + "+8cfw74gFOM=", + "GpBFPiL/nzw=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1015" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "lL9f6+MIATk=", + "Mx0b2rPCPlg=", + "BMgptnJdP7M=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "iG/UMnp3PDQ=", + "EFmH/eVp8pg=", + "SOruWYQujOE=", + "mo1Pay/bAyA=", + "D8OFbICav9o=", + "NPAcW7wNiec=", + "d5wguaLWKt8=", + "Ma1aTwvZzzE=", + "EeKw6CGbUhc=", + "es7DT4CIKBY=", + "UbNiaFJi4wk=", + "+PGbNa0qdAc=", + "bsvP1xn29X4=", + "LfkyxUzDS2g=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1016" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Iaa/Y61Je1o=", + "vS+6hfVRb+0=", + "c/9whUMk2Qo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WGLz2587Yj8=", + "PmUs/naNgEI=", + "PLfr1DVL3IE=", + "uCitfbNaRMw=", + "oXfiAC7fpr8=", + "/y32MW4LKYs=", + "cteCHhUPPxg=", + "VEcrSOYNZVs=", + "ftqB0lmSLHI=", + "vZVjgsy6r1Y=", + "Sa8y+E6Xvxg=", + "hhaXTbcbOCE=", + "uOpVNsyqj/Y=", + "MRWokxW+BGo=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1017" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "40PoRjMwA90=", + "4yuNwvJoHtQ=", + "5FCxZQY3HsE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "dkH4JmLFsGA=", + "hbLb4XkqK1k=", + "4PVK956931s=", + "+hTICGsTc/U=", + "MmoeJxt3X/0=", + "fIh9MEhXE6Q=", + "VTsWbSMgRFE=", + "0IU6A3dyEpE=", + "yo6K3bql1ow=", + "nstW36LoMH0=", + "yahILXL8DBI=", + "Cdg0UQcARdw=", + "zx/sIJRrjSI=", + "I8mVxYcOcdE=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1018" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "IvVdsKstucE=", + "o/F2r2LiLY4=", + "wGhtJdr+SDY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WTHEHuDIOSQ=", + "pZrNEldVp+M=", + "zqORM3GyE4A=", + "gAfteTpqQjE=", + "0l6iVScnSCs=", + "eltkla0KNk0=", + "RGajbpqyyDQ=", + "aBSqXq5be6Y=", + "KPBu3XfMQZ8=", + "YzeIUhzk3RM=", + "/ioVCktafoU=", + "FP51O5+MzuQ=", + "MfzmIuhTbVA=", + "U6BVheX+UdA=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1019" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ZKYmGZN0HDs=", + "GqyOvzRBNhc=", + "tc+XraFigAY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "PlC3D+bGnj4=", + "HOht19xaz+A=", + "7enrDuTtEAM=", + "NvIBQNUL4eA=", + "Wjk755Pn3zE=", + "ScQ61+NtVJo=", + "28yMCf6+N+g=", + "NBVRhQasEBU=", + "gigwrmI5xRQ=", + "fF0q60urSyU=", + "gbg1Zart4N0=", + "Z7eez+Fy8ac=", + "YKKwzp1tjh4=", + "f4GHW0DJpgo=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1020" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Zwxhb+7OjX4=", + "MjrIRCcjTT4=", + "eQc6MV1HvXI=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "H1wfwW5zn0g=", + "W4Nx2FPuUqA=", + "Pl19l1jVrHo=", + "ARJ/L+v+iOI=", + "xUnlU5T6Z5w=", + "qAoiAn3n7Yc=", + "LuFQyhT+GZk=", + "VA1Fu8BoSGE=", + "VulwvtxNrsA=", + "bvkoV0rTT+w=", + "5bUQ/c1DMfE=", + "vUzNSYDj9aA=", + "Eb62/bWgwR4=", + "UTot0TylJ1U=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1021" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "i7vU1ICPlu8=", + "Kl9x4g1Lw1Q=", + "3wIO4vtLCH8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "FBQinfQJofA=", + "WUcZ278RTLo=", + "LkekHf0zsbI=", + "npuJj0JHVi8=", + "cXkjeEpJak8=", + "TPl0GPrT9sQ=", + "SzLN6WGOB+4=", + "Mry25IOvpaY=", + "kpQQBhSN2M0=", + "aQAZCfo5v8w=", + "6Od8dkTwyOI=", + "TCgBjW28qHs=", + "uqJpCYb8XsE=", + "FTmkVKC0Q5Q=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1022" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "9SNTrsaIxkc=", + "hkPhWmu9kFo=", + "8l4KkomIGQo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "lC40lapEKAU=", + "jUzMEmUKxOE=", + "+E5W38JBZrI=", + "cXqh1ykM7WI=", + "sCwbjIp58d0=", + "7JFuCBM+oJc=", + "Kp0xs3n2xpc=", + "idNYRjNkrOI=", + "IBXTDPHMyiM=", + "PfvpiCw3HCQ=", + "xlzs+Bmaqwg=", + "2On63jnYmxI=", + "rLnavBciXsE=", + "xICeUMEQweU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1023" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "HlAnqLU/ZEY=", + "nr4eW+PAUz4=", + "5WI7QrHSrSs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "jlwkcu9tmkg=", + "yy+I+dG9Ous=", + "abDD2VYp/hc=", + "r5zu89G1Mhk=", + "EqMNfZAAgSM=", + "cep++ra2F+8=", + "sKeetENXNEw=", + "WileP+5B/dM=", + "SVcewr4BuWQ=", + "viyQsBAeBkI=", + "eQT7oqMWncU=", + "k+ghW5/U268=", + "nCeTBECszW8=", + "OgWKB0zOeJY=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1024" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Kv2zJdNLNPY=", + "nJlG49hAKnw=", + "IGJiZiplguo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0EK+7NOljf8=", + "QtuPQtAsrnA=", + "hl4fZtHr3LU=", + "ZPC+XB/owWM=", + "OzyDa87GNTE=", + "d5ntoF3yBKY=", + "7EysrSbV4ic=", + "PEZkeBkk80g=", + "pW8zG/YDhnQ=", + "HU7sbTyARB4=", + "EEhfpsdXR9M=", + "rLyXBUBO0fg=", + "18SkYY9VyH0=", + "wq8p1VuDi0Y=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1025" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "JaLoDujzoBk=", + "bXvs47RvIp0=", + "38bxHEpLNp0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "4yC5kYhn598=", + "HlINWQTfZrk=", + "TN5LT9iW1vM=", + "AgTkM7loANY=", + "AkkzrbGcPk0=", + "SJ69npsVjdw=", + "lroWI9kjxSk=", + "D90woIDoY9U=", + "BfyIytd8fwI=", + "xqDzdGv7jLw=", + "b0mP8ZqcNv4=", + "kbma6p+TYI8=", + "36PNEoSSK2E=", + "VUJ3jqx1+Q4=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1026" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "TQ7uOubiH8Q=", + "OIGbVYi+vps=", + "L9W1tvo9IQQ=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "sVEVwW+M9J0=", + "PGbU8P3qfHc=", + "lGdxC9KJRug=", + "5uewMGRBhhk=", + "FFMWOPYv+TQ=", + "PhYxyLHSwNM=", + "PKWrRNhGCtM=", + "MQFCX4+kiUs=", + "66HU7QWsnL4=", + "CQcmuIlT8ZM=", + "3WrIzroMaJ0=", + "bTQDp0nEl0Y=", + "ivG5BikTXpg=", + "161K7D0ylEU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1027" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "3ucGSWDgcIE=", + "67jFXlSzG+s=", + "BM5s8nFNaR4=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QbQZV7G4o9o=", + "4rzYZPch2Sw=", + "IT3h1Hj6dxA=", + "2m4R9nF6RR0=", + "HeS5Qf35wN8=", + "G27JjGXAJxc=", + "yoQqY6wnnOU=", + "aklju40E2P0=", + "u4sU0Mn5xK0=", + "92W2/U3w1Ws=", + "0vZUtUJncPk=", + "D7BwBTi9s1Y=", + "Q1D4/a5ndFQ=", + "yWQmx6powQc=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1028" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "zbl3YuuQPvU=", + "znyBim3TAz8=", + "H7j3XhLZMUo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "R9a7Z2ET5eA=", + "lErDEKTEg0k=", + "XaiafLZOQS4=", + "9pwd1xUl7uc=", + "ZwH/nCrVvvM=", + "I5htP6p4+1s=", + "WUHHfbm1NIQ=", + "W3xC5V3q2VI=", + "7k1vhxX3uLI=", + "rL0KgS+71cQ=", + "SHwwlT9siZQ=", + "zsTPBLmmaiw=", + "hlCKx6MjZ4U=", + "NxXZ7iWOLLo=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1029" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "3kwlwyCnQ/s=", + "Dst3rhkcB8w=", + "phfkPaBqpl0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "37En36xWIJo=", + "DkfIzMbu5QE=", + "6czkgnZaMV8=", + "3teU3ltOC9c=", + "tfna7PsGFDs=", + "JjO+DLKdNpQ=", + "4GF83rEOCrY=", + "ZTJ/cjy8IIU=", + "Z18bTk1hAvE=", + "a0BG3jBTWAw=", + "uCs1p1J5/RU=", + "YRrejynRMhY=", + "67NNijQ3USs=", + "Nqllw7Ypy+E=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1030" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "qGq1bictV34=", + "gsxUKQr0xak=", + "BDc7sa10AVo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "9DpthlKXkkQ=", + "fJcyaqsbcJs=", + "mY+wSwcIfGY=", + "PIkKYek6SUA=", + "LirzEmoJiOM=", + "+0zViQgq0KI=", + "E8JgvwUKeaU=", + "76c/XyeP5bI=", + "v+gkpvn2H1w=", + "2jS6XfA4iT4=", + "EYwV3UVMyO0=", + "p7Dv0E2ONP0=", + "nuMohuwOUVQ=", + "S+UnIEhG+l8=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1031" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "e6RG6dF5flc=", + "d31YFKri0t0=", + "bRy7/mMqjd0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "xVGXru6wxJw=", + "+laOcwOjGZA=", + "202phgKg0nc=", + "iiBk2IfrMTA=", + "MMFKjcKRqA4=", + "TnnXB33Ufcg=", + "Ub2KjMCtkbk=", + "K/2uHJSqt5s=", + "uQ5gj8oBqRs=", + "dIFs1S6kVA4=", + "4Gm5+ALBUuQ=", + "9TwMlnz3hjg=", + "zN4TNQfdf08=", + "AJW2Tg1wM6w=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1032" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "PnednxvliLg=", + "w5OGZiM3QYA=", + "oWAsDE5acSM=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "XkMFMWNo8Ec=", + "u7G7ECBh5pM=", + "WryFCpYU0WI=", + "6YCow6SErdo=", + "W+xbufi/ESw=", + "nRSecrxDlM4=", + "4cefO5stPx8=", + "2kdWuMU/Nmg=", + "j1ZKd0jGx3o=", + "GGGh5uVnAuc=", + "e9AL/bXLCEQ=", + "57wBd+7+49Y=", + "ApGwHAH3ziU=", + "H1EUp4XgTC4=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1033" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "P35hP2NOBMw=", + "3dX9viiFHAY=", + "S/xpjy1R8Aw=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0hGX0Xbi6BA=", + "fqM05CAewPo=", + "lOETegqRhcg=", + "wuk0rN78PuY=", + "65kHj2//EKA=", + "JtGkuSWVL3g=", + "o3lZxnvnn6g=", + "vciJNFNCHiA=", + "vB73RIgj81s=", + "ds+QF9u87nE=", + "xumjAfIJoAg=", + "jg7iExM7xP4=", + "NT2OS3b8Yng=", + "aEWc8CFDS5s=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1034" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "CFUiAfko1ng=", + "MJi9JCS+5JQ=", + "lRFXWrTNd+Y=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "Q3h7gZD7iEg=", + "zRrdOxOhPVQ=", + "vomzEpsOtZE=", + "Ud0n3+rP3r4=", + "U0GQlfFaJZ0=", + "sUjJykVRRN0=", + "4tkwdqoPs64=", + "VN6iG+nF7Tw=", + "WBz8tz+ZmL0=", + "dFYCiDxG5kI=", + "V+12tTVFjr4=", + "qcVqZuj0/0k=", + "Carev2GF4vE=", + "jAjMCNgkrS0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1035" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "EPX/eyCZOj4=", + "JiFpxIAW+2A=", + "KxEtnecz1vk=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "lJrvjG2efCE=", + "ZKGcYboqblc=", + "Lv49qGwqVXs=", + "9KV7nuDHbGU=", + "lf49pC7iJzc=", + "u/L0LmYDcI0=", + "GV22TYlAwgM=", + "ZONURRG1Oms=", + "skaOrO5kg6Y=", + "wm9bS9eKuzs=", + "jZOdKh5TY2U=", + "22Ox4t3ziaM=", + "LleJPw3ee3E=", + "jmZmhGYHwB4=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1036" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "HEAYDajiqcQ=", + "2LLNohcXFd8=", + "tumqu8zm3BA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "HbK5Ih1UxgM=", + "snggIDH+XrU=", + "gJbBgJgdM4w=", + "iV+UupZzXuo=", + "138zrz98qfo=", + "Qd7Rx+40lCw=", + "m3Q3qysSR8g=", + "8vY1igF/Af4=", + "PMJwjUibRhc=", + "z+50kiL2Xx4=", + "Y74uvNEgtvY=", + "qc96IsmzO9I=", + "nfIhfuxaGSw=", + "jXEzSGJei+0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1037" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ndazgwezaTI=", + "+sarIWLA0iw=", + "QkXdjJYhOvY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "hEyMitrZhMg=", + "yrnxRnnrTo4=", + "qdZxkVQV9PE=", + "cNUxME+m/WQ=", + "KBNsciGdRTo=", + "5t63V3tAPho=", + "0mAkDwHaUvE=", + "+99rUQfScic=", + "OR/QSKqew98=", + "rsJymufdULU=", + "BMFl3naspbk=", + "i6n6Xq4SBys=", + "DwI94/W0qmI=", + "AX8HrhyfjZM=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1038" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "YqlYxtk35gw=", + "loB5M7LxOcY=", + "EQMjm63r5Fc=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "Ewu4RDxTbtc=", + "FXn5C1T7XyM=", + "G4+VyONlOV0=", + "mfMdLcJwd4M=", + "6bDrD8+4cAw=", + "L3WHqvdAUOc=", + "yRpv1snKYOo=", + "Ae6hMedb0+8=", + "N2/F0P/SuFc=", + "UnQtMCupjRQ=", + "0bgcAOUtP7U=", + "Qi0l81Z6Ii4=", + "efvyc6thViI=", + "1A61FhE8cb0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1039" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "vkBc89y9Eg8=", + "JdrInXErMKM=", + "6msh8+Pd68Q=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "+iglweNHWas=", + "Dx84GJQ27cw=", + "v8/cWweCe7I=", + "GZqi+wxN6VM=", + "+ZImvTLUpkI=", + "AgpfIupS91Q=", + "Tn3c5nGy4EQ=", + "2v2CJWRixPw=", + "7WDw+Pg0Sxo=", + "RopcjwmGgTM=", + "UmJw2cg/17Y=", + "VtHPv7d1cks=", + "xG+vLi35FAM=", + "AFg5mIDEHaU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1040" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "D0r1Gf3lHc0=", + "rEdctVnqTcA=", + "UROGcsd0jiA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "SyY72Sn3mq4=", + "t1iqSb+aplU=", + "JYZ/AzkZymc=", + "1UmSxRtWZQ0=", + "zDUKPbBOWCY=", + "H1orHmMxN/8=", + "kPqSs4aG2n4=", + "ELWmAxrwA0A=", + "CwqbyxEdYC8=", + "80qzRfXGDis=", + "9X1js/Kr+sM=", + "6nA8u2K1XN4=", + "0Eayfr2QKBw=", + "B7eyX9A2nik=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1041" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "OU2HKwHSBhc=", + "4zAdEsr3blQ=", + "M1nR34QEMio=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0v5reNxfOK8=", + "6faNIdDoHrc=", + "73vol8PhrC4=", + "VOw14kmShW4=", + "qYjcYfwnfvo=", + "TMJMhf6uPPE=", + "GE//Y3OraRQ=", + "rlpX9py0Y2Y=", + "iAp8nQH5rRc=", + "99zlb20ut+s=", + "ZNYs9ATni+g=", + "E2pCPQj0PNg=", + "/0moNYrMa5Q=", + "W6Zy6Ct8Lec=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1042" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "nFCnUcdB+Jo=", + "SjComeuYS04=", + "YJKxJgX2uXs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "EWjFg7uYhFg=", + "rHBiuzDPRRU=", + "Jmok2YYIXj8=", + "j2XdXJE4sf4=", + "7LKVuKzROL4=", + "zHrLzZdkpjM=", + "pdriHWaJ1+g=", + "uBvkC2RUSi4=", + "IyEGpFm6vSk=", + "b2jv5B59qSI=", + "EjqRD8qF+n0=", + "v22QOrr/fdw=", + "FTnK9bxIl/I=", + "0sk1nev6It0=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1043" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "U1ePGX2KguE=", + "FcdRlPlEsGQ=", + "xf0VYnHTakE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "6kYtThvJTY8=", + "4J6phBPKwDQ=", + "QWjakhJhkF4=", + "EOUjOeS8FIs=", + "+wvo3rTBYas=", + "oqwyspDvVOA=", + "OHqV9dRWej0=", + "zWz2YQO2ZG0=", + "XZpFpNC8mg8=", + "AeMvwQCmUIQ=", + "oIXrjOwVpiI=", + "5aZal3wswBU=", + "3kzrAhrtk2I=", + "64MJLIjqcjw=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1044" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ydYOhz1prhc=", + "6erfh15ueOQ=", + "hJ6ZT9e8Ps8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "R3zyV+OOyzU=", + "T8IfLyFY1eo=", + "UNzWqxoDA6Y=", + "wuR6elgLH98=", + "ZBg04QPH3oY=", + "5scTjWH7xdU=", + "uAggR9UDb0c=", + "mQwWi8zajy4=", + "BuriI22NNOQ=", + "PpVC+KZOCTU=", + "j6IqvbN3hiw=", + "eb/5nasgk2I=", + "GL0+9/V7imU=", + "haMDd9/ZeMw=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1045" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Bq7Uc20Vef8=", + "aJWrxkhUlgE=", + "w5PqeUXM1mM=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "b/MosnXmv60=", + "qejjIE6V1R8=", + "9hV7TaM/TzM=", + "fMXgfc5ujDQ=", + "bOCKrlZEr8s=", + "anSNS4uKJiM=", + "Np8Ags4YVws=", + "HkSre1hHrqw=", + "By7Lx4PRenY=", + "5O5Q72PDaN4=", + "bT6TRH78YHU=", + "ynxuz8r2aLo=", + "ZQasWk0LmQ0=", + "GXBgDrfU8vQ=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1046" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "vQTqgqTiCn8=", + "VMniDiHei1E=", + "vJUoMi4E16M=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "PmmCEajWaCw=", + "1jp29f2Qs+U=", + "f/OaKkoVvLo=", + "R4Tg3JlnUxo=", + "j53tzASBXgw=", + "oJOvdYkDjTM=", + "f30/8KetVmI=", + "UMyaZK81M8Y=", + "RkPVvbwf0Bw=", + "a9LscoWqCYU=", + "MD3RlLft1ds=", + "RFN4CE2hw8I=", + "c3Ma8D6+6to=", + "vQA3ZM9yLBU=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1047" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "AHEnAUtaxfo=", + "p/w9zXhgv/Y=", + "H8ufjzkvCE8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QupPB1++TzY=", + "D7ZSIe2GqcI=", + "wkyn6Snl71U=", + "wuSMzAJcaDA=", + "XUiTqiAFaxw=", + "EbPop27GR/8=", + "5T367ZOL/W8=", + "+JkwhbJcxSo=", + "bECvqSI5dRU=", + "i55Ad2Zraq4=", + "1JNFVXbIp/U=", + "bzt8ZtHlZBQ=", + "akpfHN4EIVs=", + "qlt1oDPA+Qg=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1048" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "BpLeGJQE+Ag=", + "C2dDlSlMrcQ=", + "r1P6PmtFmgk=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "pQcyPATyIjk=", + "V39m3uSx/rY=", + "Ff0ZIBzp80g=", + "0G0uIB9uMfA=", + "7tKaJwRVlds=", + "uhexqreriCg=", + "t5KRuGQC9Cc=", + "2H+9QkfqnSI=", + "m+oaaiVEC80=", + "bNXiSEI5jXM=", + "bEnLQ+PxNSQ=", + "bMdTyI7cF5s=", + "o8TK5+vB1XA=", + "pSOdZK+VZJA=" + ], + "liquidity pool withdraw|protocol version 26|large deposit/withdraw test|deposit amount = 1049" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "OHkzt3/I7zI=", + "mpRR4LrQ1Rw=", + "Dmv66d53SeU=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "X4twjyauFSI=", + "H7jd0Y3sSSg=", + "nPnU7bCPTw8=", + "VqFeJyhxg6s=", + "FNq509I6nuE=", + "RYeCftgcaCo=", + "7gC9itvUgso=", + "SxI2wVnKcLg=", + "Q0HpCR6Gx70=", + "tCTkCZjs4nM=", + "bjrtN7+yIMM=", + "E9QSFRGJwCU=", + "riHdEyb35Qo=", + "4EOFMftdQcs=" + ], + "liquidity pool withdraw|protocol version 26|line full on native balance" : + [ + "liGKKb9ZNGk=", + "0yWmXC8bHpg=", + "eI5ziCODOlA=", + "ylnSrcEMJ3g=", + "gSe1rKSyHaU=", + "rQro+2Ibehg=", + "cd66r5vmsgY=", + "8sL/A7nus4A=", + "natoretSKDk=" + ], + "liquidity pool withdraw|protocol version 26|malformed" : [ "JalXUAF9b20=", "GJ6Rc2VHP0Q=", "HeihScr6Tyg=" ], + "liquidity pool withdraw|protocol version 26|native asset withdraw is zero" : + [ + "I2iIYR+cu2w=", + "NZJc7DiSGXY=", + "1TNLdSWwsM4=", + "UGNeAi2j5fs=", + "dWbt+4lbYh4=", + "AKO1qOlPL2Y=" + ], + "liquidity pool withdraw|protocol version 26|one non-native issuer deposit and withdraw" : [ "bSl8k7iMyac=", "JNr0i65xn74=", "JpCDuLI1u80=", "/DhkYr01MHo=" ], + "liquidity pool withdraw|protocol version 26|one non-native without liabilities" : + [ + "JalXUAF9b20=", + "Qpa3JrV4pLY=", + "l0IDfLJkBzk=", + "fhkDjsSqrgI=", + "CQszqePQepU=", + "0iEqEJpeZ50=", + "4FwZU0ikZxY=", + "KiPWjA9bQmQ=", + "0j6Ne+t6ykY=", + "CNk0nC757gA=", + "mBJCELO/eFQ=", + "26kYQEE8IEI=", + "TsSNnZOS9LM=", + "48oVIEKawz0=", + "PlBwqOn+/t4=", + "LgRa8XFgs7U=" + ], + "liquidity pool withdraw|protocol version 26|withdraw into account with liabilities" : + [ + "c9sqqp4FuMM=", + "d91AowKrXxo=", + "VW0dXuy+Oag=", + "/fbkyJsiS+A=", + "Ozp68JQ9I/g=", + "8daVV/7fzPA=", + "pYY3wVxDTHw=", + "lqIEookVBfE=", + "R5R7r8pfDfQ=", + "NwUUkeNANpU=", + "tAmczXqjI5M=", + "XRyGRxzGjhw=", + "4isDr+X5NBQ=", + "ZXOCz0P9J2w=" + ], "liquidity pool withdraw|protocol version 2|not supported before version 18" : [ "/lfj8xIFS8I=" ], "liquidity pool withdraw|protocol version 3" : [ "1kTXt7VFL1o=" ], "liquidity pool withdraw|protocol version 3|not supported before version 18" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-current/ManageBuyOfferTests.json b/test-tx-meta-baseline-current/ManageBuyOfferTests.json index 419922d1d1..ea609b0827 100644 --- a/test-tx-meta-baseline-current/ManageBuyOfferTests.json +++ b/test-tx-meta-baseline-current/ManageBuyOfferTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "manage buy offer exactly crosses existing offers|protocol version 0" : [ @@ -237,6 +238,18 @@ "+csPLbBQNXA=" ], "manage buy offer exactly crosses existing offers|protocol version 24" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "R/Dhcj3Ognk=", + "feEGCG8xQnA=", + "RJH2yrEZR7g=", + "DbDbNM4jcwU=", + "XLv6OD5dMYk=", + "+csPLbBQNXA=" + ], + "manage buy offer exactly crosses existing offers|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -284,12 +297,12 @@ "XLv6OD5dMYk=", "+csPLbBQNXA=" ], - "manage buy offer exactly crosses existing offers|protocol version 24|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], - "manage buy offer exactly crosses existing offers|protocol version 24|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], - "manage buy offer exactly crosses existing offers|protocol version 24|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], - "manage buy offer exactly crosses existing offers|protocol version 24|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], - "manage buy offer exactly crosses existing offers|protocol version 24|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], - "manage buy offer exactly crosses existing offers|protocol version 25" : + "manage buy offer exactly crosses existing offers|protocol version 25|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], + "manage buy offer exactly crosses existing offers|protocol version 25|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], + "manage buy offer exactly crosses existing offers|protocol version 25|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], + "manage buy offer exactly crosses existing offers|protocol version 25|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], + "manage buy offer exactly crosses existing offers|protocol version 25|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], + "manage buy offer exactly crosses existing offers|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -337,11 +350,11 @@ "XLv6OD5dMYk=", "+csPLbBQNXA=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], "manage buy offer exactly crosses existing offers|protocol version 3" : [ "0V3jr/3FY6U=", @@ -457,7 +470,9 @@ "manage buy offer failure modes|protocol version 22|negative offerID" : [ "yPMAWpGp2E0=" ], "manage buy offer failure modes|protocol version 23" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], "manage buy offer failure modes|protocol version 23|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 24" : + "manage buy offer failure modes|protocol version 24" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], + "manage buy offer failure modes|protocol version 24|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 25" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", @@ -500,9 +515,9 @@ "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|no issuer" : + "manage buy offer failure modes|protocol version 25|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|no issuer" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -513,11 +528,11 @@ "HYUqomaUYCY=", "TP2z2mbq/aY=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check offer valid|sell not authorized" : + "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check offer valid|sell not authorized" : [ "dc25tqTZu48=", "AwmjK3/10OE=", @@ -527,14 +542,14 @@ "/aP5f7hCJD4=", "1fMM5Je5E6k=" ], - "manage buy offer failure modes|protocol version 24|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 24|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 24|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 24|compute offer exchange parameters|buying liabilities" : + "manage buy offer failure modes|protocol version 25|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 25|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 25|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|buying liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -545,7 +560,7 @@ "R806tTuTVNE=", "nlKy3Zs8rmI=" ], - "manage buy offer failure modes|protocol version 24|compute offer exchange parameters|reserve" : + "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|reserve" : [ "siROrgQ74bc=", "ZdOlOkmdVkE=", @@ -560,7 +575,7 @@ "qkNMg2AOz+k=", "1FFnJoy76j4=" ], - "manage buy offer failure modes|protocol version 24|compute offer exchange parameters|selling liabilities" : + "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|selling liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -570,8 +585,8 @@ "lwCFYyQS0B8=", "WvKSEatXFxI=" ], - "manage buy offer failure modes|protocol version 24|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 24|offer must exist and be owned by source account to modify or delete" : + "manage buy offer failure modes|protocol version 25|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 25|offer must exist and be owned by source account to modify or delete" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -588,7 +603,7 @@ "6DLBf9kAP8U=", "o16tYBoJUAI=" ], - "manage buy offer failure modes|protocol version 25" : + "manage buy offer failure modes|protocol version 26" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", @@ -631,9 +646,9 @@ "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer" : + "manage buy offer failure modes|protocol version 26|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -644,11 +659,11 @@ "HYUqomaUYCY=", "TP2z2mbq/aY=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell not authorized" : + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell not authorized" : [ "dc25tqTZu48=", "AwmjK3/10OE=", @@ -658,14 +673,14 @@ "/aP5f7hCJD4=", "1fMM5Je5E6k=" ], - "manage buy offer failure modes|protocol version 25|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 25|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 25|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|buying liabilities" : + "manage buy offer failure modes|protocol version 26|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 26|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 26|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|buying liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -676,7 +691,7 @@ "R806tTuTVNE=", "nlKy3Zs8rmI=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|reserve" : + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|reserve" : [ "siROrgQ74bc=", "ZdOlOkmdVkE=", @@ -691,7 +706,7 @@ "qkNMg2AOz+k=", "1FFnJoy76j4=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|selling liabilities" : + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|selling liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -701,8 +716,8 @@ "lwCFYyQS0B8=", "WvKSEatXFxI=" ], - "manage buy offer failure modes|protocol version 25|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 25|offer must exist and be owned by source account to modify or delete" : + "manage buy offer failure modes|protocol version 26|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 26|offer must exist and be owned by source account to modify or delete" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -863,6 +878,14 @@ "lpBD3TY8r4U=" ], "manage buy offer matches manage sell offer when executing entirely|protocol version 24" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "4OrSi9z+GKo=", + "lpBD3TY8r4U=" + ], + "manage buy offer matches manage sell offer when executing entirely|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -910,7 +933,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -929,7 +952,7 @@ "Si8l8KP2zb8=", "Ih2+vm4DZCQ=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -948,7 +971,7 @@ "9LwahxtBXB4=", "P7iW0J54EZs=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -967,7 +990,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -986,7 +1009,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1005,7 +1028,7 @@ "nXD0+n+EWQ0=", "VxWvzwnKA9A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1024,7 +1047,7 @@ "Si8l8KP2zb8=", "JXbg50JohVk=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1043,7 +1066,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1062,7 +1085,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 24|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1081,7 +1104,7 @@ "nXD0+n+EWQ0=", "rP1qKilDQxY=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1129,7 +1152,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1148,7 +1171,7 @@ "Si8l8KP2zb8=", "Ih2+vm4DZCQ=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1167,7 +1190,7 @@ "9LwahxtBXB4=", "P7iW0J54EZs=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1186,7 +1209,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1205,7 +1228,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1224,7 +1247,7 @@ "nXD0+n+EWQ0=", "VxWvzwnKA9A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1243,7 +1266,7 @@ "Si8l8KP2zb8=", "JXbg50JohVk=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1262,7 +1285,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1281,7 +1304,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1493,6 +1516,14 @@ "lpBD3TY8r4U=" ], "manage buy offer matches manage sell offer when executing partially|protocol version 24" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "4OrSi9z+GKo=", + "lpBD3TY8r4U=" + ], + "manage buy offer matches manage sell offer when executing partially|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1540,7 +1571,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1559,7 +1590,7 @@ "ewA0B4P0VwM=", "g21h4bL9KPk=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1578,7 +1609,7 @@ "Sha01cifH5k=", "z2yzf+lUsJE=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1597,7 +1628,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1616,7 +1647,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1635,7 +1666,7 @@ "Ac5A6C1nHwE=", "Hju0hRJNoAg=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1654,7 +1685,7 @@ "ewA0B4P0VwM=", "y06bMgzL924=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1673,7 +1704,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1692,7 +1723,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 24|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1711,7 +1742,7 @@ "Ac5A6C1nHwE=", "3Gc1DytluY0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1759,7 +1790,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1778,7 +1809,7 @@ "ewA0B4P0VwM=", "g21h4bL9KPk=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1797,7 +1828,7 @@ "Sha01cifH5k=", "z2yzf+lUsJE=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1816,7 +1847,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1835,7 +1866,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1854,7 +1885,7 @@ "Ac5A6C1nHwE=", "Hju0hRJNoAg=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1873,7 +1904,7 @@ "ewA0B4P0VwM=", "y06bMgzL924=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1892,7 +1923,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1911,7 +1942,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -2003,7 +2034,8 @@ "manage buy offer matches manage sell offer when not executing|protocol version 21" : [ "Vazya62AJ3s=", "HXWRSmG+rKE=", "T2T23nzwrC4=" ], "manage buy offer matches manage sell offer when not executing|protocol version 22" : [ "Vazya62AJ3s=", "HXWRSmG+rKE=", "T2T23nzwrC4=" ], "manage buy offer matches manage sell offer when not executing|protocol version 23" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24" : + "manage buy offer matches manage sell offer when not executing|protocol version 24" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], + "manage buy offer matches manage sell offer when not executing|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2033,7 +2065,7 @@ "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2044,7 +2076,7 @@ "0A4JreVKLiA=", "a8CqyX+7nf8=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2055,7 +2087,7 @@ "0A4JreVKLiA=", "pr7SQKU6GO0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2066,7 +2098,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2077,7 +2109,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2088,7 +2120,7 @@ "0A4JreVKLiA=", "hHb8T/k28GM=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2099,7 +2131,7 @@ "0A4JreVKLiA=", "TrGur5LvGC0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2110,7 +2142,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2121,7 +2153,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 24|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2132,7 +2164,7 @@ "0A4JreVKLiA=", "poB17duzuw0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25" : + "manage buy offer matches manage sell offer when not executing|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2162,7 +2194,7 @@ "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2173,7 +2205,7 @@ "0A4JreVKLiA=", "a8CqyX+7nf8=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2184,7 +2216,7 @@ "0A4JreVKLiA=", "pr7SQKU6GO0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2195,7 +2227,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2206,7 +2238,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2217,7 +2249,7 @@ "0A4JreVKLiA=", "hHb8T/k28GM=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2228,7 +2260,7 @@ "0A4JreVKLiA=", "TrGur5LvGC0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2239,7 +2271,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2250,7 +2282,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2405,6 +2437,14 @@ "Kp44x9HwAyw=" ], "manage buy offer releases liabilities before modify|protocol version 24" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "6O3ED6Csu7U=", + "gJvu7dUL/Pw=", + "Kp44x9HwAyw=" + ], + "manage buy offer releases liabilities before modify|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2417,9 +2457,9 @@ "gJvu7dUL/Pw=", "Kp44x9HwAyw=" ], - "manage buy offer releases liabilities before modify|protocol version 24|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 24|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 25" : + "manage buy offer releases liabilities before modify|protocol version 25|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 25|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2432,8 +2472,8 @@ "gJvu7dUL/Pw=", "Kp44x9HwAyw=" ], - "manage buy offer releases liabilities before modify|protocol version 25|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 25|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 26|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 26|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], "manage buy offer releases liabilities before modify|protocol version 3" : [ "0V3jr/3FY6U=", @@ -2695,6 +2735,18 @@ "W5/GHvJp4RA=" ], "manage buy offer with zero liabilities|protocol version 24" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "dmU0zDhOpkY=", + "KRGajCKCuZY=", + "sYQ0bUdhZKA=", + "Vgyx0jvcc6k=", + "BYFbJiQDgw0=", + "W5/GHvJp4RA=" + ], + "manage buy offer with zero liabilities|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2715,9 +2767,9 @@ "BYFbJiQDgw0=", "W5/GHvJp4RA=" ], - "manage buy offer with zero liabilities|protocol version 24|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], - "manage buy offer with zero liabilities|protocol version 24|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], - "manage buy offer with zero liabilities|protocol version 25" : + "manage buy offer with zero liabilities|protocol version 25|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], + "manage buy offer with zero liabilities|protocol version 25|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], + "manage buy offer with zero liabilities|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2738,8 +2790,8 @@ "BYFbJiQDgw0=", "W5/GHvJp4RA=" ], - "manage buy offer with zero liabilities|protocol version 25|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], - "manage buy offer with zero liabilities|protocol version 25|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], + "manage buy offer with zero liabilities|protocol version 26|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], + "manage buy offer with zero liabilities|protocol version 26|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], "manage buy offer with zero liabilities|protocol version 3" : [ "0V3jr/3FY6U=", diff --git a/test-tx-meta-baseline-current/ManageDataTests.json b/test-tx-meta-baseline-current/ManageDataTests.json index 55609e1efb..b82e9688cf 100644 --- a/test-tx-meta-baseline-current/ManageDataTests.json +++ b/test-tx-meta-baseline-current/ManageDataTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "manage data|protocol version 0" : [ @@ -1155,6 +1156,69 @@ "manage data|protocol version 25|sponsorship" : [ "Nxc1wCMphbc=", "Q/Dc+hiCDls=", "Nxc1wCMphbc=", "Q/Dc+hiCDls=" ], "manage data|protocol version 25|sponsorship|create, modify, and remove sponsored entry" : [ "pqClGK5j2ws=" ], "manage data|protocol version 25|too many subentries" : [ "/MwafQLVTVY=", "VYl/z2T+lco=", "/MwafQLVTVY=", "VYl/z2T+lco=" ], + "manage data|protocol version 26" : + [ + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=" + ], + "manage data|protocol version 26|create data with native buying liabilities" : [ "+UuZn22VTR0=", "mXXwh1WHTiY=", "NZZl1uFhgvE=" ], + "manage data|protocol version 26|create data with native selling liabilities" : + [ + "+UuZn22VTR0=", + "X3XyNCCIBWc=", + "3KrfexL0wJ4=", + "lHEs/qReu4Y=", + "p0uwSHnLadw=" + ], + "manage data|protocol version 26|sponsorship" : [ "Nxc1wCMphbc=", "Q/Dc+hiCDls=", "Nxc1wCMphbc=", "Q/Dc+hiCDls=" ], + "manage data|protocol version 26|sponsorship|create, modify, and remove sponsored entry" : [ "pqClGK5j2ws=" ], + "manage data|protocol version 26|too many subentries" : [ "/MwafQLVTVY=", "VYl/z2T+lco=", "/MwafQLVTVY=", "VYl/z2T+lco=" ], "manage data|protocol version 2|create data with native buying liabilities" : [ "qCwjFNJMBnw=", "SKX1KAqXh00=", "rRWd2ki0jOc=" ], "manage data|protocol version 2|create data with native selling liabilities" : [ "qCwjFNJMBnw=", "53GEXRQ7pjE=", "rRWd2ki0jOc=" ], "manage data|protocol version 2|sponsorship" : [ "WgWa5IeywWM=", "Ic4hzQF8UuA=", "WgWa5IeywWM=", "Ic4hzQF8UuA=" ], diff --git a/test-tx-meta-baseline-current/MergeTests.json b/test-tx-meta-baseline-current/MergeTests.json index 7d410f34b8..8304a131e9 100644 --- a/test-tx-meta-baseline-current/MergeTests.json +++ b/test-tx-meta-baseline-current/MergeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,34 +30,36 @@ 22, 23, 24, - 25 - ], - "merge event reconciler|protocol version 0" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 1" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 10" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 11" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 12" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 13" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 14" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 15" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 16" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 17" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 18" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 19" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 2" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 20" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 21" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 22" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 23" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 24" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 25" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 3" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 4" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 5" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 6" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 7" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 8" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 9" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], + 25, + 26 + ], + "merge event reconciler|protocol version 0" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 1" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 10" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 11" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 12" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 13" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 14" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 15" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 16" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 17" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 18" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 19" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 2" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 20" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 21" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 22" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 23" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 24" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 25" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 26" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 3" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 4" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 5" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 6" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 7" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 8" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 9" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], "merge|protocol version 0" : [ "Z97ih4XRAb8=", @@ -915,14 +917,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 14|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "Fq2c8yQBLn0=" ], - "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "hDXdvyC4Fes=" ], + "merge|protocol version 14|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "JmvR8bH5qF0=" ], + "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "RmPoe6vRz30=" ], "merge|protocol version 14|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 14|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 14|sponsorships|with sponsored signers|into sponsoring account" : [ "gX3QhwjCqEY=" ], + "merge|protocol version 14|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 14|sponsorships|with sponsored signers|into sponsoring account" : [ "ihnMK2cyRtA=" ], "merge|protocol version 14|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 14|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 15" : @@ -1084,14 +1086,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 15|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "Fq2c8yQBLn0=" ], - "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "hDXdvyC4Fes=" ], + "merge|protocol version 15|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "JmvR8bH5qF0=" ], + "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "RmPoe6vRz30=" ], "merge|protocol version 15|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 15|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 15|sponsorships|with sponsored signers|into sponsoring account" : [ "gX3QhwjCqEY=" ], + "merge|protocol version 15|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 15|sponsorships|with sponsored signers|into sponsoring account" : [ "ihnMK2cyRtA=" ], "merge|protocol version 15|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 15|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 16" : @@ -1253,14 +1255,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 16|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 16|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 16|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 16|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 16|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 16|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 16|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 16|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 16|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 17" : @@ -1422,14 +1424,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 17|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 17|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 17|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 17|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 17|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 17|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 17|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 17|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 17|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 18" : @@ -1591,14 +1593,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 18|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 18|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 18|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 18|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 18|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 18|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 18|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 18|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 18|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 19" : @@ -1766,14 +1768,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 19|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 19|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 19|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 19|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 19|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 19|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 19|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 19|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 19|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 1|Account has static auth flag set" : [ "DH8wilAcZes=", "R6/tPSYNWDY=" ], @@ -2057,14 +2059,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 20|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 20|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 20|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 20|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 20|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 20|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 20|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 20|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 20|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 21" : @@ -2232,14 +2234,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 21|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 21|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 21|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 21|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 21|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 21|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 21|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 21|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 21|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 22" : @@ -2407,14 +2409,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 22|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 22|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 22|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 22|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 22|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 22|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 22|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 22|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 22|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 23" : @@ -2582,14 +2584,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 23|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 23|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 23|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 23|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 23|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 23|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 23|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 23|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 23|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 24" : @@ -2757,14 +2759,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 24|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 24|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 24|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 24|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 24|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 24|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 24|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 24|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 24|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 25" : @@ -2932,16 +2934,191 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 25|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 25|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 25|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 25|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 25|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 25|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 25|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 25|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 25|with create" : [ "zKyJfQIorUY=" ], + "merge|protocol version 26" : + [ + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=" + ], + "merge|protocol version 26|Account has static auth flag set" : [ "1U499PvTlHs=", "YZJAzGEP3ko=" ], + "merge|protocol version 26|With sub entries|account has data" : [ "zjgW8Jfzn40=", "Q43hpkPZ2x8=" ], + "merge|protocol version 26|With sub entries|account has signer" : [ "KQVxfIosim4=", "x/61dcZnEXs=" ], + "merge|protocol version 26|With sub entries|with trustline" : [ "O5uZEchwQEg=", "O5uZEchwQEg=" ], + "merge|protocol version 26|With sub entries|with trustline|account has offer" : + [ + "q1QR2McHDX0=", + "EMGUjScmiC0=", + "KgAt5UNq788=", + "545JQLQHdmE=", + "fX3f7SMNOGw=", + "sUbdy04L16M=" + ], + "merge|protocol version 26|With sub entries|with trustline|account has trust line" : [ "Q43hpkPZ2x8=" ], + "merge|protocol version 26|account has only base reserve" : [ "OVfYZoFrA7k=", "Ao6n0zrZKug=" ], + "merge|protocol version 26|account has only base reserve + one operation fee" : [ "beRc/55COqA=", "hEX8+qLql7o=" ], + "merge|protocol version 26|account has only base reserve + one operation fee + one stroop" : [ "ukFQmqrJzWw=", "9KMjlR1hbFU=" ], + "merge|protocol version 26|account has only base reserve + one operation fee - one stroop" : [ "Yd//3V9VIs4=", "zCf+3+CzXyE=" ], + "merge|protocol version 26|account has only base reserve + one stroop" : [ "17bpaMB3N+w=", "CDzct1YRvcg=" ], + "merge|protocol version 26|account has only base reserve + two operation fees" : [ "jhJdi00ew0k=", "ulUTwrgKKYk=" ], + "merge|protocol version 26|account has only base reserve + two operation fees - one stroop" : [ "n+tYG8Dkdy0=", "ISd63KPuaqU=" ], + "merge|protocol version 26|create, merge, create" : [ "zKyJfQIorUY=" ], + "merge|protocol version 26|destination with native buying liabilities" : + [ + "joVc5JdE7TQ=", + "I1V2eny1cDU=", + "CrODblM6ngc=", + "0fH4zn9tu/c=", + "IcHqJuoy2SE=", + "fZKlldTLLMs=" + ], + "merge|protocol version 26|merge account twice" : [ "hf3MnqNclDQ=" ], + "merge|protocol version 26|merge account twice to non existing account" : [ "hf3MnqNclDQ=" ], + "merge|protocol version 26|merge into non existent account" : [ "nk9cf8La5oQ=" ], + "merge|protocol version 26|merge into self" : [ "nk9cf8La5oQ=" ], + "merge|protocol version 26|merge too far|at max = success" : [ "3NZBFImk70o=", "YwNXLRJ3Chk=" ], + "merge|protocol version 26|merge too far|passed max = failure" : [ "8EbIzn1aeuw=", "ik+DaOcjIWs=" ], + "merge|protocol version 26|merge, create different, merge into the same" : [ "zKyJfQIorUY=" ], + "merge|protocol version 26|merge, create, merge back" : [ "Hr8sfoaK+Yc=" ], + "merge|protocol version 26|merge, create, merge into the same" : [ "zKyJfQIorUY=" ], + "merge|protocol version 26|sponsorships" : + [ + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=" + ], + "merge|protocol version 26|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], + "merge|protocol version 26|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], + "merge|protocol version 26|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 26|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], + "merge|protocol version 26|success|success - basic" : [ "TeBkT0wCpMo=" ], + "merge|protocol version 26|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 2|Account has static auth flag set" : [ "DH8wilAcZes=", "R6/tPSYNWDY=" ], "merge|protocol version 2|With sub entries|account has data" : [ "/V2F8Zok2J8=", "R6/tPSYNWDY=" ], "merge|protocol version 2|With sub entries|account has signer" : [ "4TxVqBANtaY=", "D0MsJYVHews=" ], diff --git a/test-tx-meta-baseline-current/OfferTests.json b/test-tx-meta-baseline-current/OfferTests.json index 9d264b9287..f7c39f6410 100644 --- a/test-tx-meta-baseline-current/OfferTests.json +++ b/test-tx-meta-baseline-current/OfferTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "create offer|protocol version 0" : [ @@ -9757,13 +9758,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -9928,13 +9929,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -10099,13 +10100,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -11254,13 +11255,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -11425,13 +11426,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -11596,13 +11597,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -12596,7 +12597,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 14|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 14|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -12609,7 +12610,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 14|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -14210,13 +14211,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -14381,13 +14382,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -14552,13 +14553,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -15707,13 +15708,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -15878,13 +15879,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -16049,13 +16050,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -17049,7 +17050,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 15|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 15|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -17062,7 +17063,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 15|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -18663,13 +18664,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -18834,13 +18835,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -19005,13 +19006,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -20160,13 +20161,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -20331,13 +20332,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -20502,13 +20503,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -21502,7 +21503,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 16|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 16|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -21515,7 +21516,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 16|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -23127,13 +23128,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -23298,13 +23299,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -23469,13 +23470,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -24624,13 +24625,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -24795,13 +24796,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -24966,13 +24967,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -25966,7 +25967,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -25978,7 +25979,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -25991,7 +25992,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -26003,7 +26004,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 17|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -27615,13 +27616,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -27786,13 +27787,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -27957,13 +27958,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -29112,13 +29113,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -29283,13 +29284,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -29454,13 +29455,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -30454,7 +30455,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -30466,7 +30467,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -30479,7 +30480,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -30491,7 +30492,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 18|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -32103,13 +32104,13 @@ "jEi/oDgMYTw=", "zQZnPZHP1+4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "uHmjY4zDD2c=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "EMtaGdvCxvg=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "M+ooT5wqn/M=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Q5TbT9AfRVA=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "NxMm0z6AEl0=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4Q3ZJTMesvQ=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Q8yQJ78/D0c=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "ld8dzi6CBz0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "yrBkfWB0eo8=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "4FWGMURbRO0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "d/nxWjB1zoM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "xux24VYPfds=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "HUWaiBHMRgs=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "GC+EDDK7GDo=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "AoNHCcYoPKk=", @@ -32274,13 +32275,13 @@ "r+ywmAxw/AY=", "0wJE93BslBI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "MEupXemQue0=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "PN7pZjrM2/w=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "0o0QijLiKaw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "xngxhFTQ1No=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "6CopCTT35nI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "N/G0xnk/M8c=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "kKlC+swAEEE=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "h3YA0jIySfQ=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Smt9j6hDJEg=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "AdMjXK21GVc=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "IRgYEMMq0fo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "Lexh4wdCr50=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "JVUZFyidNJo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "glK8GrMd3rk=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "AoNHCcYoPKk=", @@ -32445,13 +32446,13 @@ "old2Zl1sG3A=", "NAZJaGU3yNo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "hRuyazaAwww=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "oLwJdGCISzg=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "Feh+CBYMnco=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "q1dUNzxXFpA=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "MtLeS2hIDTw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "qs/wEDtF7MI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "Xkb954/BILk=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "DZhSBu0oqvI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "G6CaPXcpOjo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "JVj8XHaMNzg=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "Xr1Gkg0VVQY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "qCbUyx30jnY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "x9giCFTQuyI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "q13x3qDWIrI=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "AoNHCcYoPKk=", @@ -33600,13 +33601,13 @@ "jEi/oDgMYTw=", "zQZnPZHP1+4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "Jz46JCpWQ1k=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "6IdBlR8/ozM=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "Z46iC83UVrE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "A7+KHeHgaYY=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "h9fMQr980Yk=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9zZ4adH+hfs=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "mtId1LPsXqo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "ryjRgzh0IXI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "pjKM9dyOhR4=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "Hb1MGgqGsLo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "IItDyLXtqfQ=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "njjy3MxIRRI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "vNu6r9wS4Go=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "rY7iXm8OyMo=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "AoNHCcYoPKk=", @@ -33771,13 +33772,13 @@ "r+ywmAxw/AY=", "0wJE93BslBI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "pNH5L8O6wmM=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "ePC7/qUbMWs=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "dSKh6oRn0Nk=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RI2lm4juTps=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "H0sNkma6qRE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "yz420C1ggMw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "rL9oNM1lBEo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "MKgeodq4d1g=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "isxPENkzBtY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "66D6WHjzsgA=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "E1cmcYP2+uU=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "IpSAsTorIaM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "kdTX7QboO4A=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "iHzAiwB06+4=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "AoNHCcYoPKk=", @@ -33942,13 +33943,13 @@ "old2Zl1sG3A=", "NAZJaGU3yNo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "O2BlaOvGmJo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "g03dKmxeLJE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "OWE/P1TA1VI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "3UzYH7nBAH4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "mb8IP2dHr+U=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "NHS2gvwOj78=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "dYK1L6NrRGw=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "Zc3ZMi1P72E=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "1tmJWTeaPb0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "8wgeedu6HTM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "C5NjAxfFp7A=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "lwkVEhFxf/k=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "ugFjJoaGlH4=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "FfUwXLzWR5o=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "AoNHCcYoPKk=", @@ -34942,7 +34943,7 @@ "BbLK9YJrn5A=", "zzbX2podNyQ=", "4FbINmzBIBA=", - "u+0yKubT8ZI=" + "0M4jbR07Hyo=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -34954,7 +34955,7 @@ "BbLK9YJrn5A=", "zzbX2podNyQ=", "4FbINmzBIBA=", - "u+0yKubT8ZI=" + "0M4jbR07Hyo=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "D5amKeoTQrU=", "D5amKeoTQrU=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -34967,7 +34968,7 @@ "ZF9n5UpDFGU=", "LPmGBC5MPlU=", "UrWxEkoTuRE=", - "NUUHleQt54w=" + "K4M4ktmiXRw=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -34979,7 +34980,7 @@ "ZF9n5UpDFGU=", "LPmGBC5MPlU=", "UrWxEkoTuRE=", - "NUUHleQt54w=" + "K4M4ktmiXRw=" ], "create offer|protocol version 19|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -37880,13 +37881,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -38051,13 +38052,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -38222,13 +38223,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -39377,13 +39378,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -39548,13 +39549,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -39719,13 +39720,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -40719,7 +40720,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -40731,7 +40732,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -40744,7 +40745,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -40756,7 +40757,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 20|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -42368,13 +42369,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -42539,13 +42540,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -42710,13 +42711,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -43865,13 +43866,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -44036,13 +44037,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -44207,13 +44208,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -45207,7 +45208,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -45219,7 +45220,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -45232,7 +45233,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -45244,7 +45245,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 21|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -46856,13 +46857,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -47027,13 +47028,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -47198,13 +47199,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -48353,13 +48354,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -48524,13 +48525,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -48695,13 +48696,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -49695,7 +49696,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -49707,7 +49708,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -49720,7 +49721,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -49732,7 +49733,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 22|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -51344,13 +51345,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -51515,13 +51516,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -51686,13 +51687,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -52841,13 +52842,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -53012,13 +53013,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -53183,13 +53184,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -54183,7 +54184,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -54195,7 +54196,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -54208,7 +54209,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -54220,7 +54221,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 23|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -55832,13 +55833,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -56003,13 +56004,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -56174,13 +56175,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -57329,13 +57330,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -57500,13 +57501,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -57671,13 +57672,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -58671,7 +58672,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -58683,7 +58684,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -58696,7 +58697,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -58708,7 +58709,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 24|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -60320,13 +60321,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -60491,13 +60492,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -60662,13 +60663,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -61817,13 +61818,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -61988,13 +61989,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -62159,13 +62160,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -63159,7 +63160,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -63171,7 +63172,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -63184,7 +63185,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -63196,7 +63197,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 25|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -63417,6 +63418,4494 @@ "hiJ2B0okUrQ=", "g/DPny6DRMs=" ], + "create offer|protocol version 26" : + [ + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=" + ], + "create offer|protocol version 26|cannot create offer that would lead to excess liabilities|native buying liabilities" : + [ + "cdx9sXUdAsM=", + "lkQrDje8Tbc=", + "ldTJh9v0SfY=", + "VfGVmWS4s2Y=", + "/zYBi1Ww41g=", + "18J1s/8oKjg=", + "hkXgu5TUO9I=", + "SgFUBd4pxdo=", + "A1um9SR+i4E=", + "144GsFI44Uk=", + "UNm1vlBsZjw=", + "WOhFu94ASjg=" + ], + "create offer|protocol version 26|cannot create offer that would lead to excess liabilities|native selling liabilities" : + [ + "TpbtCUm7fvs=", + "6H1BgbsMh3I=", + "8LLdl+NRa0E=", + "vNfuva16tUA=", + "hymMKqtWtb0=", + "CB/ijLs1Euk=", + "h5/+BesVuew=", + "ypUXpmkh3/o=", + "jTbWBy3+gtk=", + "0kEhfVBhpuQ=" + ], + "create offer|protocol version 26|cannot create offer that would lead to excess liabilities|non-native buying liabilities" : + [ + "3GvVv4IuXeg=", + "pv13qalnq+g=", + "BlZXnCcFhSc=", + "QL5gZ8vtk/I=", + "Q7GdQX5bMcQ=", + "Yad09Sx2DEE=", + "DENPOds7NcQ=", + "EQ7qHaZGkbc=" + ], + "create offer|protocol version 26|cannot create offer that would lead to excess liabilities|non-native selling liabilities" : + [ + "3GvVv4IuXeg=", + "Caj3pLBn1i8=", + "N8SyLZb7y6A=", + "QL5gZ8vtk/I=", + "u7yqQYlKEbk=", + "A8arn5pzEXo=", + "SLySKIF+lHk=", + "5buJDWM1z0Q=" + ], + "create offer|protocol version 26|cannot create unauthorized offer|allow trust" : + [ + "I+8qq0t8CQk=", + "Xge+5pLaTYA=", + "prBE5Ub8KzM=", + "2NvfnXl4dFY=", + "/pFfRwei3hQ=", + "+EISFUAHZT0=", + "KiIWn8PRFeE=", + "ZupADRRggFk=" + ], + "create offer|protocol version 26|cannot create unauthorized offer|set trustline flags" : + [ + "I+8qq0t8CQk=", + "Xge+5pLaTYA=", + "prBE5Ub8KzM=", + "2NvfnXl4dFY=", + "/pFfRwei3hQ=", + "+EISFUAHZT0=", + "KiIWn8PRFeE=", + "ZupADRRggFk=" + ], + "create offer|protocol version 26|cannot modify offer that would lead to excess liabilities|native buying liabilities" : + [ + "cdx9sXUdAsM=", + "lkQrDje8Tbc=", + "ldTJh9v0SfY=", + "CmZwLDjCabE=", + "5xXEvm1lGgo=", + "snZTifbtnTc=", + "BdHTUMO516w=", + "7Z+gaP2v36o=", + "99auBHjXqiI=", + "mS0j7gp5EBY=", + "eLN1WcT4dTM=", + "tG6KZoeWgnk=", + "w22hAQg52Z0=", + "uISn8aF5bP0=", + "QtCZiA3eJAk=", + "LX0ihE2U+Yo=" + ], + "create offer|protocol version 26|cannot modify offer that would lead to excess liabilities|native selling liabilities" : + [ + "TpbtCUm7fvs=", + "6H1BgbsMh3I=", + "8LLdl+NRa0E=", + "PinFuw7sOY8=", + "bUZSJBtMuy0=", + "L45GQ818WYs=", + "57zPrBA4Dyo=", + "dbbr6nXISXs=", + "LmdMLj/0e6Y=", + "5LJqmzXWo3k=", + "tEDDdk2AL8c=", + "fTTA9HhrjsQ=", + "2b75EzDvgdI=", + "uR+4d9PTOrI=" + ], + "create offer|protocol version 26|cannot modify offer that would lead to excess liabilities|non-native buying liabilities" : + [ + "3GvVv4IuXeg=", + "pv13qalnq+g=", + "BlZXnCcFhSc=", + "WZEuXBdbjJY=", + "nhYZXq0gCSQ=", + "HmGdl5yx42k=", + "g77Azpm4Nmg=", + "aKGs8St/tAI=", + "9n31IC74pY8=", + "V8lJOm3deR8=" + ], + "create offer|protocol version 26|cannot modify offer that would lead to excess liabilities|non-native selling liabilities" : + [ + "3GvVv4IuXeg=", + "Caj3pLBn1i8=", + "N8SyLZb7y6A=", + "2d/GKR3mVs4=", + "g5bYUlp7PgI=", + "DaGf+qI9PcQ=", + "eTcJyMbl+Cw=", + "cnZq+T+92VU=", + "1P3u0UM7bYE=", + "0PnaSbS5uq4=" + ], + "create offer|protocol version 26|create offer" : + [ + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=" + ], + "create offer|protocol version 26|create offer errors|create offer with amount 0" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "nFcaIqjnkMo=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 26|create offer errors|create offer with invalid prices" : + [ + "TduHde2iHmg=", + "kLdTQSsnWU4=", + "m5n9nsLNMaY=", + "0Ok6SxRrGR0=", + "ehm+8ayTp2M=", + "RdgrA1SdQzw=", + "dnicyr78wKc=", + "uyPYStzcIjM=", + "ox4sYMwWLII=", + "2fw0j//bItg=" + ], + "create offer|protocol version 26|create offer errors|create offer with trustline filled up" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "nFcaIqjnkMo=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 26|create offer errors|create offer with trustline filled up to INT64_MAX" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "LTxe8kcDRcg=", + "o+vsh9+4vjM=", + "/S9Ll+qP8KE=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 26|create offer errors|create offer without XLM to make for reserve" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "tD7+50CJxD4=" + ], + "create offer|protocol version 26|create offer errors|create offer without account" : [ "R6/tPSYNWDY=" ], + "create offer|protocol version 26|create offer errors|create offer without having any amount of asset" : [ "gtWbZb+BzI4=", "t5veyk9epYo=", "OPl5DSNzLgE=" ], + "create offer|protocol version 26|create offer errors|create offer without issuer for buying" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "Y9NuNOe899E=", + "saP+bkFFruM=", + "E9EXeSjP+qk=" + ], + "create offer|protocol version 26|create offer errors|create offer without issuer for selling" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "4vsxQY/8qxs=", + "saP+bkFFruM=", + "PqaAm1A88SA=" + ], + "create offer|protocol version 26|create offer errors|create offer without trustline for buying" : [ "gtWbZb+BzI4=", "t5veyk9epYo=", "4vsxQY/8qxs=", "DNTypdsjvJs=" ], + "create offer|protocol version 26|create offer errors|create offer without trustline for selling" : [ "gtWbZb+BzI4=", "A2JZa+wbHLQ=" ], + "create offer|protocol version 26|create offer|idr -> xlm" : [ "5wW4tGamaUs=" ], + "create offer|protocol version 26|create offer|issuer offers" : [ "HTSSlz3tj5M=", "HTSSlz3tj5M=" ], + "create offer|protocol version 26|create offer|issuer offers|issuer claims an offer from somebody else" : [ "xKX+wrJbovM=" ], + "create offer|protocol version 26|create offer|issuer offers|issuer creates an offer, claimed by somebody else" : [ "LjFWaBDy6Vk=", "xsQzSRmzlzo=", "5UCQtJsuw+U=" ], + "create offer|protocol version 26|create offer|multiple offers" : + [ + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=" + ], + "create offer|protocol version 26|create offer|multiple offers|authorized|multiple offers with small amount crosses" : + [ + "eDqyEqV6bgM=", + "x6hXsqriF2E=", + "AXeJPXc4JqM=", + "ujNuc4fWgX4=", + "pNr3+wNG7ns=", + "cmX2xkdOOH4=", + "qknNuQHeRAA=", + "G7JfYbf09QQ=", + "wNCjwdRnD3s=", + "Jivde3Mb2FQ=", + "GoNx0g6KoxE=" + ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer crosses and removes first" : [ "eDqyEqV6bgM=", "GhLrKY4r7g0=" ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer crosses, removes all offers, and remains" : [ "eDqyEqV6bgM=", "ynmF6LKBn+I=" ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer crosses, removes first six and changes seventh" : [ "eDqyEqV6bgM=", "yk3XEMqVruM=" ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer crosses, removes first six and removes seventh by adjustment" : [ "eDqyEqV6bgM=", "oQMpLfBIG4A=" ], + "create offer|protocol version 26|create offer|multiple offers|authorized|offer does not cross" : [ "eDqyEqV6bgM=", "BmAWapQvpJc=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|multiple offers with small amount crosses" : + [ + "ux/M43lvKnA=", + "4sl7NkHB70s=", + "3bmnSFiJyLg=", + "39ndYX+hYys=", + "r8vPjvmrx9M=", + "NoB8JOIlCFs=", + "MdD7mCz/2eU=", + "ySh22OnMLMk=", + "+ZjinSYre2g=", + "3BKiqyBeppU=", + "L5hAzMZF5jY=", + "p5jTcJ9HYjw=", + "BVyqkL1FVi4=" + ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses and removes first" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "6WifU9vBAxA=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes all offers, and remains" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "shfaaKzg/vY=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes first six and changes seventh" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "FL1fc/Qld/s=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes first six and removes seventh by adjustment" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "EHbXY/+ZhGU=" ], + "create offer|protocol version 26|create offer|multiple offers|buy authorized to maintain liabilities|offer does not cross" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "1vzKlVseBLg=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|multiple offers with small amount crosses" : + [ + "ux/M43lvKnA=", + "S4FgTbDbFcc=", + "3bmnSFiJyLg=", + "oINzJvkRyfc=", + "v8VFXcQXFfM=", + "B4aNgYgAajY=", + "YD3nFbAavIc=", + "08cYGDB8h6I=", + "D85YxjeeG8E=", + "6esArL0jeR4=", + "d3KROGvYdeI=", + "vDUaO7x+POc=", + "i280WSrs/VY=" + ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses and removes first" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "mjerHq6T8WI=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes all offers, and remains" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "4TNv513kubY=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes first six and changes seventh" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "9lVwv21QKA8=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes first six and removes seventh by adjustment" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "hEuc6vTedDQ=" ], + "create offer|protocol version 26|create offer|multiple offers|sell authorized to maintain liabilities|offer does not cross" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "1vzKlVseBLg=" ], + "create offer|protocol version 26|create offer|offers with limit when buying" : + [ + "rtv4NP6/SfU=", + "7T5TOndu1Dk=", + "7ITTnsOOO7I=", + "67NARNPBvkg=", + "lF1tGsCoxrA=", + "k4LDu8nJI1o=", + "cAbvuKMHaPU=", + "sA1e5OlnGvo=", + "DJT2Gd+6EHk=", + "sdsdVVXOKxE=", + "rtv4NP6/SfU=", + "7T5TOndu1Dk=", + "7ITTnsOOO7I=", + "67NARNPBvkg=", + "lF1tGsCoxrA=", + "k4LDu8nJI1o=", + "cAbvuKMHaPU=", + "sA1e5OlnGvo=", + "DJT2Gd+6EHk=", + "sdsdVVXOKxE=" + ], + "create offer|protocol version 26|create offer|offers with limit when buying|Source account limit" : [ "NuhnPlMJJTQ=" ], + "create offer|protocol version 26|create offer|offers with limits" : + [ + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=" + ], + "create offer|protocol version 26|create offer|xlm -> idr|create" : [ "gk4zDxN50KY=" ], + "create offer|protocol version 26|create offer|xlm -> idr|crossing + create" : [ "Z1GdApZ7O54=", "Z1GdApZ7O54=" ], + "create offer|protocol version 26|create offer|xlm -> idr|crossing + create|large amount (oversell) - cross & create" : + [ + "fv4EOrltvdA=", + "6E1zKJkbmSQ=", + "k8PeEI+Pyvw=", + "JV9pSVVZJJ8=", + "3AWx823Lp9Q=" + ], + "create offer|protocol version 26|create offer|xlm -> idr|crossing + create|small offer amount - cross only" : [ "lF0rRjrHFlI=", "C5nBWSjJ9QE=", "EmWNbn5lEu4=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 26|crossing offers with rounding" : + [ + "rZWQi2rdOhw=", + "1zoEpg+I/vI=", + "Z2qEW4jm/0c=", + "HCrZ/W1EZK0=", + "RPSb1pgwf1w=", + "rZWQi2rdOhw=", + "1zoEpg+I/vI=", + "Z2qEW4jm/0c=", + "HCrZ/W1EZK0=", + "RPSb1pgwf1w=" + ], + "create offer|protocol version 26|crossing offers with rounding|ask before bid uses ask price" : [ "8U+42RXP+uw=", "vmJ6mQLQ10Q=" ], + "create offer|protocol version 26|crossing offers with rounding|bid before ask uses bid price" : [ "lF/pfIuAXps=", "YWM9maRQpjk=" ], + "create offer|protocol version 26|issuer offers|issuer offers contribute buying liabilities to other assets" : [ "3GvVv4IuXeg=", "8mg1a6qFdcs=", "BOnCUDANbzY=", "jSKbIBqTGJ0=" ], + "create offer|protocol version 26|issuer offers|issuer offers contribute selling liabilities to other assets" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "ldTJh9v0SfY=", + "vAM1L00uv7M=", + "iw7Ek6Ip5KU=" + ], + "create offer|protocol version 26|issuer offers|issuer offers do not overflow buying liabilities" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "ldTJh9v0SfY=", + "/uorqYeEyII=", + "H2uTj+cYFFM=" + ], + "create offer|protocol version 26|issuer offers|issuer offers do not overflow selling liabilities" : [ "3GvVv4IuXeg=", "8mg1a6qFdcs=", "iFtZk/E8xxw=", "CFzWWmhWFNI=" ], + "create offer|protocol version 26|large offer id|erase" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "waW0tEoMvso=", + "PU2PBOTsLZs=", + "zsVxyD+zl/E=", + "k7HrycW3erw=" + ], + "create offer|protocol version 26|large offer id|modify" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "waW0tEoMvso=", + "PU2PBOTsLZs=", + "zsVxyD+zl/E=", + "k7HrycW3erw=" + ], + "create offer|protocol version 26|max liabilities|buying non-native" : + [ + "I+8qq0t8CQk=", + "CC9+ZKviQJs=", + "iPDVE/wNf74=", + "s7ppZHmtInU=", + "sFCOo/eL+HU=", + "bDyfyQeaZYM=", + "CLugErteCIY=" + ], + "create offer|protocol version 26|max liabilities|selling non-native" : + [ + "I+8qq0t8CQk=", + "CC9+ZKviQJs=", + "iPDVE/wNf74=", + "s7ppZHmtInU=", + "sFCOo/eL+HU=", + "tMvUEgNke28=", + "/33LwYX6t2w=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|buying native change both assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "UJfxwbH5Aeo=", + "tpPOF4y1XtY=", + "N8NBMgL+IYc=", + "XQOwhl+NqEM=", + "O3c9GDizLuk=", + "9cQy+4hWbWk=", + "mLI101sHiQI=", + "yTrJsuJsT0Y=", + "Vsym25toRuo=", + "Ef+FPPoUg40=", + "1rwwNMgOy5E=", + "YHQ8+8qRl8g=", + "fYRm1E+ApJw=", + "8290h5gxeh4=", + "Z3y5m1zhn9k=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|buying native change buying asset" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "7AhVLkjP25E=", + "86Ma/qSRnAo=", + "uzmBRd+8zs8=", + "UoETjUIpZVk=", + "m0Z7cwww/14=", + "JN8oTg7AKOo=", + "5IACqtmzOC4=", + "2qjDKnJ7LdQ=", + "Z9Qd+JxOd+o=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|buying native change selling asset" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "UJfxwbH5Aeo=", + "tpPOF4y1XtY=", + "N8NBMgL+IYc=", + "pAH2DJjeLsY=", + "GtcxVR+LY8c=", + "HMzW8LUbkzY=", + "A3a7UJmW52U=", + "Xz4VVlu/rfs=", + "J1i6THnDlUU=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|buying native swap assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "OHtgSNB6KTY=", + "nsLFT1O2F3g=", + "oS+dntdckzw=", + "uBLxbVAZjhk=", + "8uaM4h4eZNQ=", + "g861flXOOow=", + "PkPq0tArJM4=", + "UGrBOMAI3/w=", + "ClwRtFG3h2c=", + "bu7DAYVGGgY=", + "jMCWLSEcySY=", + "LS+bJjgZ2C0=", + "pYdau/ZYH2w=", + "lfd+o7CTWU8=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native change both assets non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "XYpVK7Cd/Dc=", + "hIXPaBAqTU0=", + "WMTgA+WXUU8=", + "cuzb1MIMb3Q=", + "AA7m/Dv0Km0=", + "OtOyIvc0axY=", + "ydVIMF5Ip6U=", + "6DGnLQal1w4=", + "rdHxahR/qro=", + "EG+eOiF9pIE=", + "/86HXwHTjzs=", + "tMT9bnfGVWY=", + "2Y7lvrNa1ic=", + "4+pNZQASUdg=", + "iu22Ib5UH4M=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native change buying asset native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "oXyBhx1c88E=", + "6pOug+ACCb0=", + "voBB9TcvUKY=", + "pbAEPovvO80=", + "8xJ/dEVK/Kg=", + "A2JUrvylrHY=", + "R57z1wNkHAk=", + "Z2YWh0uWRNU=", + "mE/NwUNIO+s=", + "/fv40CwR0Ks=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native change buying asset non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "5gaGVVwg6PU=", + "YdtLYmYOAEM=", + "Z6iMF3+XE3E=", + "2HL8xhUpLpM=", + "1CvUjnhoyCc=", + "ialsfffok54=", + "jpEQ3xGuLkw=", + "BEJacrFDIHU=", + "66apAsurOgI=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native change selling asset native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "xjgR8rRWfrU=", + "7Iu6MmRep4k=", + "HxldriCBgiU=", + "6qPsK99hJoU=", + "0/KaC1fsUeU=", + "owdx9qUyXjg=", + "PYWImtknRFg=", + "MatRcYAk/wk=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native change selling asset non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "XYpVK7Cd/Dc=", + "hIXPaBAqTU0=", + "WMTgA+WXUU8=", + "tSkHug76cU4=", + "y/LafS8TT00=", + "E3tz7nSj4+I=", + "XMhA4e9auWg=", + "TSYoMznvj3A=", + "oEPL4aGrRcs=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|non-native swap assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "N79WNJNwWw0=", + "tMo9sDTj7LU=", + "cv06DGr91gE=", + "P+ZF9tiJbV0=", + "fA/xuIX4/S8=", + "GN52TROdg0E=", + "ErozaquR4uw=", + "epHXiw1JJR4=", + "JdrlRfdLjCg=", + "korvat428oI=", + "iszsCKyuNYE=", + "i7d7LbPn2wI=", + "5tZS+Vcc0ZA=", + "J8u/vRwlol4=", + "VZ4mgMu8P5k=", + "Rw9+1rpwc5g=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|selling native change both assets" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "MrsOAdZzYMw=", + "k+26FoNNUjQ=", + "CQPCPYR2adw=", + "J+ydHBB/X0U=", + "0j7SdD4wsgw=", + "9h3hLFfHqcE=", + "pMsHOWmTuFE=", + "uMrUGNV+nXg=", + "WAJTck9a6Jg=", + "EK3RDtfEobw=", + "q77j2qzf5uQ=", + "NM29mTs6zKE=", + "CGVDObDz4YI=", + "7BGrB6J8WtY=", + "jgBRHzYQBnY=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|selling native change buying asset" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "Q/D5GuNXYB0=", + "+o4UKxB8TwM=", + "Yuv4WEWRHf8=", + "3bQSLJCFnD0=", + "c3cHMS+ISnQ=", + "frVG1MU2keo=", + "06ifK6Eks8A=", + "SaIlMiDK500=", + "XXXiFbXKs6c=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|selling native change selling asset" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "MrsOAdZzYMw=", + "k+26FoNNUjQ=", + "CQPCPYR2adw=", + "OSjwSBl2PTw=", + "MGZL4WLtcek=", + "MY+a/M+wvW0=", + "XHKbRS0qRhE=", + "Ktuxj3ocd7U=", + "DjFy/x/1ciA=" + ], + "create offer|protocol version 26|modify offer assets with liabilities|selling native swap assets" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j+YPwQ+XaCM=", + "5b2ELKn+zps=", + "FNGYv/8RF18=", + "1L9YwyQoBws=", + "BslEPIPs5YU=", + "eVmJlwJSAho=", + "LHlQsIca8zo=", + "3zehzGnWFgY=", + "7+GV/BAHLGk=", + "4np7A+28tEw=", + "ISi07jZ/+wA=", + "R4w1cjwU2hQ=", + "VXgD6H1jz58=", + "6sM5mAhu1PM=", + "Q4HKoqEBK5U=", + "ZvM9XVrUeI8=", + "hla5hnHmE4w=" + ], + "create offer|protocol version 26|modify offer in sponsorship sandwich" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "DGjkFkZPtxo=" + ], + "create offer|protocol version 26|modify offer price with liabilities|buying native" : + [ + "t9wslB3jy3g=", + "4l17/q9lY1Q=", + "eSG2OghANjk=", + "1Mil8nzAFjw=", + "2fex/gJhIes=", + "nUquFdNas3Q=", + "t9wslB3jy3g=", + "4l17/q9lY1Q=", + "eSG2OghANjk=", + "1Mil8nzAFjw=", + "2fex/gJhIes=", + "nUquFdNas3Q=" + ], + "create offer|protocol version 26|modify offer price with liabilities|buying native|decrease price" : [ "7yYpsMrW4H0=", "1qx5bJBpuqI=", "7WnR359mcT8=" ], + "create offer|protocol version 26|modify offer price with liabilities|buying native|increase price" : + [ + "SmOJNZrNb14=", + "MANB7B0xoq8=", + "UyVGf+o0AqQ=", + "3UIALvgjYl8=", + "6MQb5zIgENo=", + "FVsULnESFn4=" + ], + "create offer|protocol version 26|modify offer price with liabilities|non-native" : + [ + "3GvVv4IuXeg=", + "58I3yfK8Gcs=", + "jy5ewRh7RfE=", + "1Mil8nzAFjw=", + "w7GUUyCARrM=", + "3GvVv4IuXeg=", + "58I3yfK8Gcs=", + "jy5ewRh7RfE=", + "1Mil8nzAFjw=", + "w7GUUyCARrM=" + ], + "create offer|protocol version 26|modify offer price with liabilities|non-native|decrease price" : [ "Kz1cVfRj4eo=" ], + "create offer|protocol version 26|modify offer price with liabilities|non-native|increase price" : [ "g0ZSWd3wkag=", "GzZ5YEWeYug=", "6JNidy0iMP8=", "b8yAbyXoJIM=" ], + "create offer|protocol version 26|modify offer price with liabilities|selling native" : + [ + "I+8qq0t8CQk=", + "K4k15lDDrJI=", + "f0F0TI3uuKM=", + "I+8qq0t8CQk=", + "K4k15lDDrJI=", + "f0F0TI3uuKM=" + ], + "create offer|protocol version 26|modify offer price with liabilities|selling native|decrease price" : [ "EUe2j3saCWg=" ], + "create offer|protocol version 26|modify offer price with liabilities|selling native|increase price" : [ "lTjk+VgqstM=", "L+kdFckap9Q=", "TKT/wJsDmgA=", "jum+FBgAVYw=" ], + "create offer|protocol version 26|negative offerID" : [ "kT6/Ph+MhsY=" ], + "create offer|protocol version 26|new offer is not created if it does not satisfy thresholds" : + [ + "lCrqNKY0rpc=", + "+1fqnir1hrc=", + "7UOAnFvzwao=", + "Jg4y9W5Xeps=", + "xGitDe7rjZQ=" + ], + "create offer|protocol version 26|offer with excess liabilities that does not meet thresholds|create fails" : + [ + "3GvVv4IuXeg=", + "l8GBi+52NHQ=", + "vDd8Rk82EsQ=", + "Fui0ppcpiUE=", + "rzyR3LFuv+U=" + ], + "create offer|protocol version 26|offer with excess liabilities that does not meet thresholds|modify fails" : + [ + "3GvVv4IuXeg=", + "041Ik7bCMNc=", + "QmBY3u7TM/0=", + "mavDS9aTsSA=", + "4cssGG2DQSg=", + "ldFfajLtJQU=" + ], + "create offer|protocol version 26|partially fill resting offer where owner is in a sponsorship sandwich" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "x13UziPsQIs=" + ], + "create offer|protocol version 26|passive offer" : + [ + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=", + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=", + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=" + ], + "create offer|protocol version 26|passive offer|create a passive offer with a better price" : [ "vC/bHIEHA/I=" ], + "create offer|protocol version 26|passive offer|modify existing passive offer with higher price" : [ "xG6hNkmN6+A=" ], + "create offer|protocol version 26|passive offer|modify existing passive offer with lower price" : [ "q8plCqUIdRQ=" ], + "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is issuer|allow trust" : + [ + "WpkugzwroZQ=", + "Xge+5pLaTYA=", + "4wmzhcPFeb8=", + "prBSA0tfqOk=", + "jzk8Uk94IF4=", + "NuR0j7eX2eE=", + "forTcGol0rQ=", + "mEo7fK0TRuo=", + "PnKS1C85mJw=" + ], + "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : + [ + "WpkugzwroZQ=", + "Xge+5pLaTYA=", + "4wmzhcPFeb8=", + "prBSA0tfqOk=", + "jzk8Uk94IF4=", + "NuR0j7eX2eE=", + "forTcGol0rQ=", + "mEo7fK0TRuo=", + "PnKS1C85mJw=" + ], + "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], + "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : + [ + "ub7/2Gn9rd8=", + "ihWbJRp3ryg=", + "XzTnWVv8mh8=", + "L9AHoWjoo0k=", + "A0v1tWjRwFY=", + "L0Diqa4i41c=", + "fEhXL/cAXX8=", + "9yZIZSpYTs0=", + "qRduamYzL9Q=" + ], + "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : + [ + "ub7/2Gn9rd8=", + "ihWbJRp3ryg=", + "XzTnWVv8mh8=", + "L9AHoWjoo0k=", + "A0v1tWjRwFY=", + "L0Diqa4i41c=", + "fEhXL/cAXX8=", + "9yZIZSpYTs0=", + "qRduamYzL9Q=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when creating an offer|buying native" : + [ + "xAvD0TZipvc=", + "f8kthORN37Y=", + "+S8QzEufkxI=", + "3KTGL7fDeU0=", + "2fex/gJhIes=", + "l8dTP9BrMYw=", + "mmLCfoBwzIQ=", + "7eYq36QVpJs=", + "8SLLuc218U4=", + "tD9RFiHlKnE=", + "Yjkd08oyFXo=", + "b9fugvKNmDw=", + "V6WnoGLfBWk=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when creating an offer|non-native" : + [ + "+Be0HDePjzQ=", + "3qE0cu2HoDE=", + "mjGLCwCKess=", + "k5jw6yM5hyg=", + "MBhxnDMK1GM=", + "gyON4ibQKUc=", + "/1kAM897eaU=", + "R3V5nFVf+VY=", + "OPogFL3AN5Y=", + "Jzbfm5w2elQ=", + "9EwM3KBrW2o=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when creating an offer|selling native" : + [ + "WicRwdM+fXM=", + "wbtiXZ17QgE=", + "r2HXW2exUfw=", + "ySinAHCOgBE=", + "VGzJovS7UIU=", + "/0ErblHrwc4=", + "MSDjMYok3AY=", + "jf7R6ATX45Y=", + "rQ2RjOzminU=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when modifying an offer|buying native" : + [ + "zEOe5WV2dEA=", + "qGiGvpKqVmo=", + "41XdmxjQVBM=", + "3KTGL7fDeU0=", + "2fex/gJhIes=", + "PK9wxLQkOYo=", + "UfYLCU/bctA=", + "gM18T0FBYAQ=", + "/TewJTWcWpM=", + "J6qtOIkUIbI=", + "WguGEzxoyL4=", + "QvB9fprkWqg=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when modifying an offer|non-native" : + [ + "xAvD0TZipvc=", + "ivRarEKAAJE=", + "ORCFmvDyO+k=", + "k5jw6yM5hyg=", + "dcKJ0xDLE84=", + "ngdeBwdqJR8=", + "xIKNsatkliU=", + "HCOedWosRTs=", + "prXubuIxG28=", + "eZ6e5DKllX4=" + ], + "create offer|protocol version 26|reserve and liabilities checks|when modifying an offer|selling native" : + [ + "bhXmI6BHKtI=", + "MynsoDPQwQA=", + "S4Gypz8b934=", + "zw30qMRllco=", + "WgCQRdwPIUw=", + "lQCQhCAzez8=", + "KWgxfApRXJI=", + "NF12aVlcelY=" + ], + "create offer|protocol version 26|sponsorship" : + [ + "+hujFcq0xXU=", + "SC2FCLsSAng=", + "j3qtdofcO3g=", + "XDE5A0UmY5o=", + "s8X4ficQr3M=", + "+PaEZ+b9wkQ=", + "+hujFcq0xXU=", + "SC2FCLsSAng=", + "j3qtdofcO3g=", + "XDE5A0UmY5o=", + "s8X4ficQr3M=", + "+PaEZ+b9wkQ=" + ], + "create offer|protocol version 26|sponsorship|create, modify, and remove sponsored entry" : [ "MZgdaTE6q6E=" ], + "create offer|protocol version 26|too many sponsoring" : + [ + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=", + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=", + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=" + ], + "create offer|protocol version 26|update offer" : + [ + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=" + ], + "create offer|protocol version 26|update offer|cancel offer" : [ "G7WyWa+4bx4=" ], + "create offer|protocol version 26|update offer|cancel offer with full buying trust line" : [ "FJEN+AfX60Y=", "asJi7UUxL30=", "tjnenxAikiU=" ], + "create offer|protocol version 26|update offer|delete non existent offer" : [ "UhbEV/tmcfQ=" ], + "create offer|protocol version 26|update offer|update amount" : [ "9Cu8GqanY6o=" ], + "create offer|protocol version 26|update offer|update non existent offer" : [ "UhbEV/tmcfQ=" ], + "create offer|protocol version 26|update offer|update price" : [ "WKqpWkqTI08=" ], + "create offer|protocol version 26|update offer|update selling/buying assets" : [ "ksz63AtplDw=", "UAkrvdrUUXE=" ], + "create offer|protocol version 26|updated offers respect reserve" : [ "iHeo277KA20=", "noNuzWVx7Kg=", "3MkaVSq8Gyk=", "67XE/LMBAXA=" ], + "create offer|protocol version 26|wheat stays or sheep stays" : + [ + "lCrqNKY0rpc=", + "jGjvznRvg6Q=", + "cUGfAAQ4upg=", + "cJvwxXqdous=", + "S6WrbjPLxfA=", + "M3ckMEt8H80=", + "amCYkb+7TR0=", + "uHdpXiLIXjI=", + "Knz78W5onZ8=", + "cu+hKpUAEKI=", + "n0yqovl5Nbs=", + "Chp/u1D619E=", + "sJ5ErHXvwIU=", + "AAOUu5xsjZI=", + "oE7fDgmAs6I=", + "RIHYkyU5AWs=", + "HcARNkT8PKo=", + "6DkbObnvEwM=", + "jfMqqSZrgDA=", + "0UokfQrwgLs=", + "jYtcxs7ONcM=", + "V2kXhxFexU4=", + "ZQJcY57VZWE=", + "nwuIX+iobU8=", + "0AQ2ZG0HvsQ=", + "D5QW474YsLw=", + "lrRkyQ1tgGA=", + "tezcxh1+SwU=", + "j3HXXb+kGyM=", + "8Me7PQhnmrE=", + "3DwikgIjuKo=", + "EHbT8imQhKQ=", + "NnVn87IoKHk=", + "+TI53G34BFk=", + "bfZz+inh33o=", + "EUtnBInQuHE=", + "SQvl0sSLm5M=", + "oakzj167XII=", + "XM7TfruhcA0=", + "3tbHJ3KNVXY=", + "0FEWdXaeWM8=", + "X2hS8B1eJq8=", + "wLj3TgLXarQ=", + "u98nT0ipqtY=", + "hiJ2B0okUrQ=", + "g/DPny6DRMs=" + ], "create offer|protocol version 2|cannot create unauthorized offer|allow trust" : [ "o9zmojucnjo=", @@ -78438,6 +82927,307 @@ "89WDwf97Dg4=", "3A5HTsAPOCY=" ], + "liabilities match created offer|protocol version 26" : [ "9r4mSEOjc5E=", "9r4mSEOjc5E=" ], + "liabilities match created offer|protocol version 26|maximum limits" : + [ + "VhPlKytne9U=", + "CwG7Gy8dyJA=", + "sYTvan8wXb4=", + "1SlsdMmX1w8=", + "M3B729CZSq8=", + "eC7bVofY1Ug=", + "CG5zG+F079I=", + "9RGRoiIlCKM=", + "UY+Br3Z1r+M=", + "xNbUWZAEOFw=", + "C0JDOVaEG6w=", + "awV7Ur/GL0k=", + "ZP+U7NQPSd0=", + "Q+YMjHhFIlU=", + "72IasQWWoHs=", + "QDndUuEdUiM=", + "lUoSeVORUSk=", + "OzNnfUBJwfk=", + "2QZX/oKbYl4=", + "WSBtntmXHNE=", + "Ij2y01jv16k=", + "x3JioHxwEHM=", + "vedY93kod64=", + "IOWHd63QmHo=", + "UhoRiAln8fc=", + "5oQC6tG55dw=", + "oVtrNHZFwLo=", + "fFO4AO6SSog=", + "8543gc0jR9Q=", + "eThs8Gbz+h4=", + "zUPXrL4Peeo=", + "5ZtFz7izCrQ=", + "STs09V2gWX0=", + "qfU42o/plq0=", + "DHv8YVi92Rc=", + "sTBAsMs4Wdk=", + "dCRxJ1HOqtQ=", + "S1SHFY63jcs=", + "Ilw+1Q7mY1Y=", + "D/AumoITyFg=", + "u9ZZThnfEdA=", + "zJN678HIWfk=", + "sShpIebUq8U=", + "R7GGf7rjugw=", + "ChicB1KWvZo=", + "eEzWAjqj0KE=", + "i8RddxC3dVw=", + "jit7OkQmWuo=", + "iDd9XRq7Eo0=", + "se0TtNy6PJw=", + "eiRrvGp7aK8=", + "i0y3PEJqkYQ=", + "d+f9xv3YaWs=", + "d/7CPl0b3pc=", + "5J7Ss7ZNASM=", + "LKLwW9zfQXs=", + "PFbZIF+bja4=", + "MWyQvS5yDok=", + "RwetNPBIKco=", + "6loloKbV1uM=", + "XHgc8vDslvk=", + "dhegrpbbNio=", + "NPYu/S8S2MQ=", + "AfOWWuTTYr8=", + "4w2T8J6olvs=", + "/+DePEqwF60=", + "BcxdfS1d2JQ=", + "jTX4BYs3xR0=", + "WypMpc8u0MU=", + "C5d3OQx9g+s=", + "wdAMDFgPqPU=", + "821lXfgaZjw=", + "o9KFQ8ZF4hY=", + "MgEIqEVkgFM=", + "n6OyvC3V7qg=", + "BgR5VbNX7OI=", + "hwQMCHwJOg4=", + "LGk8C/CZvWo=", + "4ZccHBp0aDw=", + "6QSdjDXOI/o=", + "s4il/UgMFBE=", + "g/0L/MWojiE=", + "/ly1WWwna44=", + "vQ2i3qRMMto=", + "T+obZrZz1kk=", + "r9kZ2gL/Uhw=", + "GJLbxcwAkZ8=", + "OmKARCfs9h4=", + "Q0RWDEuJWLc=", + "sMGTCRN7q0Q=", + "4NThx1tJojg=", + "3pGURkOM578=", + "YQ+kWi8Qdls=", + "K9ASCiqCmao=", + "bQ6pwwAQCl8=", + "GZhgN6s2r+E=", + "9jzmJV9V6CQ=", + "BMHDBuqnag0=", + "fkYBAcHxvp4=", + "tMU8XstWUfw=", + "4/hjrkieQLA=", + "eSG9XYmlrEo=", + "LKhRoTUg7HE=", + "UJUijp/10rw=", + "OzHxlz7MV0U=", + "RP+jE2WJRsU=", + "3ODXgqkcrf0=", + "5f53cvKJ8zI=", + "pnbLIKocalI=", + "4cAjPcEeBvg=", + "myxDz+JUlKw=", + "eMRzhtod4Nk=", + "qPup6hh/RcA=", + "99iYAHbil0s=", + "s//D3u/QF4Y=", + "ywpGBZxAwuA=", + "6Mo0d2hg5bI=", + "xBKSYQDLzcc=", + "FD9jaOXjI28=", + "k9E3o8kTuIY=", + "9Ul0sASqmBQ=", + "py6LeRwwb1Q=", + "DVIA0gG5cGU=", + "uMrEASH9LgE=", + "20KlKRAY3Ms=", + "FPSOw5L4RqE=", + "xCheTlSzzDM=", + "dL96iZveoiA=", + "MC/OZ3WDlZw=", + "2Rq0Mhtl+Oc=", + "muhAGIRBtgc=", + "BD+Zza1Cbjk=", + "w2pRD9YgUas=", + "lAK1raxilrc=", + "ZrPbkwhcmgo=", + "tofFdubNJZ8=", + "Hxdl/iW4jqA=", + "XpJFQBUtkeM=", + "3Thi15AuFpU=", + "TX1CZGdAdps=", + "KfxL74AI6Mw=", + "Z1s9Age6m0w=", + "TrVa0Otmw3c=", + "cm4Kk0u6j/w=", + "QPPSSSkmYis=", + "axu0dXwE0+o=", + "7yN9GxLoEb4=", + "8Hf0Y1SCtrM=", + "THaKFbcTPRk=", + "kwByhMBuvZ0=", + "h3nV+wNCapM=", + "pwkVTDG3eQg=", + "9xoy0w4C198=", + "urQ1oMUszwU=", + "tFbfOgFcWYs=", + "fuWqT1QvnQs=", + "Rrpz0YpZx0o=", + "kxHPGuPjAzA=", + "MjHoAMCZXos=", + "P1SFl4otHIY=" + ], + "liabilities match created offer|protocol version 26|minimum limits" : + [ + "VhPlKytne9U=", + "CwG7Gy8dyJA=", + "kkdWa5bsNMc=", + "hPZyNBUfkS4=", + "wSt3McAJjg4=", + "eC7bVofY1Ug=", + "CG5zG+F079I=", + "9RGRoiIlCKM=", + "UY+Br3Z1r+M=", + "V/6xuXKxcuo=", + "C0JDOVaEG6w=", + "+EGZekCCFfc=", + "FktI8+6fhdM=", + "d3yB9/gEWWQ=", + "rJAVVOg1lSc=", + "IUxKf3Pb4+I=", + "Vd5b6nDr6fQ=", + "Ct1h6kQMl0s=", + "eaiRlSAN0kI=", + "8PS7IpbnJ/U=", + "ccgj9uFKTxA=", + "U4EEd6zG1mo=", + "r9pcbK4qY/E=", + "B+sHmpjNGBk=", + "gn0DsVVgbao=", + "vgsHcZwkq5k=", + "hIc+oIe9dto=", + "KB2p2Mb5nSw=", + "7e19JIBJzcI=", + "+eBXaSD3710=", + "RnFpIH5lZi8=", + "DhXLC1f7FpU=", + "Lot5YL1rCME=", + "aSAXhKUbefs=", + "NLjhpZJ0CXA=", + "4i9AMkHay5s=", + "L/1684/Qnoc=", + "g9IbNxJZgiw=", + "aXxFeSygzK8=", + "88EPjuUdtxA=", + "GkIkCW+wVaA=", + "OUpWpBbSNEw=", + "DjDat+xjC5Y=", + "5wkEWgXyXoM=", + "Y+RWniKI4WM=", + "C7roX5lE3kU=", + "t9A1mAs5duQ=", + "2VALztyfJh4=", + "qZwg5UW8Yoo=", + "iUz9bYRtSD4=", + "0JvG6hkxGKY=", + "0KwdOGNdPsA=", + "M9NBQ5V2Jr8=", + "dFsDrUfepjI=", + "Ubsko4pzeKE=", + "X5GW5pApFPo=", + "UOqryy2ZhXY=", + "tOBXC2WCkGc=", + "KV2BvfmEYNo=", + "a68whrfDfNI=", + "Xf6X7RDkroM=", + "6erVQ8h1b/s=", + "OlL+qBqlQEw=", + "YfEra1PEBzU=", + "42VL8dQOQHA=", + "NKPtP6EHz1A=", + "oEts3Z4Pm10=", + "DsZPcrfvCts=", + "pfJp5gliSe4=", + "SHOBX1zXIco=", + "DFrpIAEpup8=", + "XetAt3Ci+j4=", + "SjMNMU1CuWM=", + "52ihrU5yfbg=", + "Mo64OJIbBBs=", + "SDKJu7eyBOs=", + "MsLrp6HbxP8=", + "/jVB/VUiJ9Y=", + "F8kRsILDWE8=", + "60uJv2pJXwA=", + "vZlxY05mEY8=", + "vewpRbpeZqE=", + "lwMmHyPNjn0=", + "TjUqUgf8n9s=", + "L1IcUQjBUcI=", + "HeLKOf27ywY=", + "xlJRXCnsMTw=", + "qffWSsQLcKY=", + "VfwldV2IPuk=", + "KDrRKw5ldxA=", + "S6PT14hbHpc=", + "Pnhynu45tmY=", + "4uW7blwjizU=", + "jy2dhFkIz5A=", + "a6ePFe9lCRY=", + "Kocd+8SaOFU=", + "3j6ohWk/9fE=", + "Nn6TiZWG7bg=", + "8CEIh2QlKMQ=", + "9bHTywoLTfY=", + "LnLPzhBQ+lA=", + "uYLyB7bPdrA=", + "qn62opwXDIY=", + "ppnDZkrq6to=", + "IxVop1JghDE=", + "ykdRVTYbIiM=", + "Pne7y5GvQHQ=", + "lVVbnKX9fwE=", + "ahn14eElYU4=", + "mWOjs2QpozA=", + "AZ5TR3Jo7Dk=", + "hJxSGs7dJyk=", + "sQC24mfQKeA=", + "FCg87nN/6UU=", + "MaYNMG+O8f8=", + "z4ch1UufI/U=", + "LFLJc0WXvgY=", + "N29fEePOtFI=", + "svR41U/S0/k=", + "/Tya0KwZyeE=", + "5sDeRMZfGn4=", + "LkcRDumo9Dw=", + "DRtF4VKL894=", + "OwAaYLyJ95Q=", + "MlXA/ZxoXWw=", + "WkdCxoSymJE=", + "/mw42vBi50w=", + "X3ldQvXMhxI=", + "iEA5p+uAEo4=", + "JNLhBkj3AGg=", + "O6g4p8BEQ3o=", + "+MpczFL4wcU=", + "89WDwf97Dg4=", + "3A5HTsAPOCY=" + ], "liabilities match created offer|protocol version 3" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], "liabilities match created offer|protocol version 4" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], "liabilities match created offer|protocol version 5" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], diff --git a/test-tx-meta-baseline-current/PathPaymentStrictSendTests.json b/test-tx-meta-baseline-current/PathPaymentStrictSendTests.json index d14668aabf..b359cd9b82 100644 --- a/test-tx-meta-baseline-current/PathPaymentStrictSendTests.json +++ b/test-tx-meta-baseline-current/PathPaymentStrictSendTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "pathpayment strict send uses all offers in a loop|protocol version 0" : [ @@ -1237,6 +1238,89 @@ "fwqbRGxHKf8=", "AOnjm6LdgWQ=" ], + "pathpayment strict send uses all offers in a loop|protocol version 26" : + [ + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 26|inside issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "xCfA3gN5lDs=", + "AOnjm6LdgWQ=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 26|no issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "QwWP3woUGO0=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 26|outside issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "fwqbRGxHKf8=", + "AOnjm6LdgWQ=" + ], "pathpayment strict send uses all offers in a loop|protocol version 3" : [ "jorMmKFYJ0c=", @@ -20196,6 +20280,1142 @@ "ie6GldQ1XEs=", "cCG+dBmDtIw=" ], + "pathpayment strict send|protocol version 26" : + [ + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=" + ], + "pathpayment strict send|protocol version 26|crosses destination offer for first exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "E612cIHjzxU=", + "RAO4SFKH9jg=", + "Qo0e9YSXFRA=", + "fU33vV2S2BU=", + "AacAIQaK9HI=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "4bdyIU9y16Y=", + "+2/q1Jibp0M=", + "6vhgBkZkSFc=", + "fBqHZFKah9Q=", + "DiehcE4qMos=", + "4H16U5KJG9Y=", + "c22BVl4k4cw=", + "FlNjYlj+i7w=", + "R+kPHfaexCs=", + "eM6EfdRtAxQ=", + "swpi2W7lkjk=" + ], + "pathpayment strict send|protocol version 26|crosses destination offer for last exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "Qo0e9YSXFRA=", + "GV7J00VLEvo=", + "lHlcHbPB5qo=", + "jqPAVWl1StE=", + "nhHP8Sfy3k8=", + "RytwHSzzBVQ=", + "/+7KoVvfZUU=", + "JwONZyXFHr4=", + "7fCCXeYLXhw=", + "xj7eCR2OF44=", + "ri84V5bLwwE=", + "6mm6DAcwMAg=", + "Zno1DANr358=", + "QF9yUfxuR1E=", + "x9LUYP3LgqA=" + ], + "pathpayment strict send|protocol version 26|crosses destination offer for middle exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "M1qaWHOx3k0=", + "RAO4SFKH9jg=", + "Qo0e9YSXFRA=", + "GV7J00VLEvo=", + "lHlcHbPB5qo=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "CTAH0FhhGa8=", + "KTR+g8pZqdw=", + "6vhgBkZkSFc=", + "fBqHZFKah9Q=", + "rI55F1HLWLI=", + "oUEG3Lt0uoo=", + "c22BVl4k4cw=", + "QzyP0in7dC8=", + "wouV0/qHFcw=", + "eM6EfdRtAxQ=", + "5ZBwXOXuct8=" + ], + "pathpayment strict send|protocol version 26|crosses own offer for first exchange" : + [ + "qmQxLyCpOBc=", + "6xDa6BT1WP8=", + "rUZEEtM0Hps=", + "1H8kxG7KwlM=", + "PW25R1rfCEs=", + "pDPfJxIFBzc=", + "1y41+fz472g=", + "RxQ+H+td5io=", + "o+32QNYuWMI=", + "/auR3DyJamA=", + "RsvlkFCdMfQ=", + "JwONZyXFHr4=", + "mgvn0Uo56pI=", + "Ng/MK0e60B8=", + "KZfPSW3MmyM=", + "IMv9KdI6t5Y=", + "UKa3/jcLNTo=", + "TZgoqjbP/mg=", + "zdv2cP5T1F8=" + ], + "pathpayment strict send|protocol version 26|crosses own offer for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "GJzqcuFrprY=", + "Qfc9DZh5K6k=", + "bJkCU3rOT4Q=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "Q3oUTrsmRfk=", + "SV89dl1JRmw=", + "M74si97PonU=", + "fBqHZFKah9Q=", + "aOKnz8s8bts=", + "HJzJG4gMqBM=", + "fRc9g9ZSd1I=", + "e4HkLKoGsJE=", + "iHqyeo9TLvs=", + "vPnvVFdjuzU=", + "4R+Ytq7eRYk=" + ], + "pathpayment strict send|protocol version 26|crosses own offer for middle exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "RAO4SFKH9jg=", + "GJzqcuFrprY=", + "nZlOiQ+LDW0=", + "HYBRSoWu/bo=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "d8wEGj9jWrg=", + "uZwQhV2v5ZA=", + "M74si97PonU=", + "fBqHZFKah9Q=", + "aOKnz8s8bts=", + "K59JpWTwv8U=", + "4rVKh6osn1o=", + "e4HkLKoGsJE=", + "tXXYBuf/ViI=", + "HpH1buzQvSA=", + "lAHs/LaSaT8=" + ], + "pathpayment strict send|protocol version 26|currency invalid" : + [ + "eLnko7bphqc=", + "Tg2dnTcND/8=", + "UeEUfbgy3DA=", + "FAGaMo6BMVM=", + "DtOPgoW8b0Y=" + ], + "pathpayment strict send|protocol version 26|destination does not exist" : [ "eLnko7bphqc=", "YzED6NxAqic=", "i2SPbWGHktM=", "Ndf9JTDMTJo=" ], + "pathpayment strict send|protocol version 26|destination does not have trustline" : + [ + "eLnko7bphqc=", + "p/qFinNNAu0=", + "RRyNinInfko=", + "TJjfqt7ryuA=", + "QSlMvh4aNkA=", + "PKQzd8AM3+w=" + ], + "pathpayment strict send|protocol version 26|destination is issuer and does not exist for complex paths" : + [ + "eLnko7bphqc=", + "YzED6NxAqic=", + "i2SPbWGHktM=", + "zKSTT8c5Uns=", + "d7qzlts02Go=" + ], + "pathpayment strict send|protocol version 26|destination is issuer and does not exist for simple paths" : + [ + "eLnko7bphqc=", + "YzED6NxAqic=", + "i2SPbWGHktM=", + "zKSTT8c5Uns=", + "4XZbjPN7MZU=" + ], + "pathpayment strict send|protocol version 26|destination is not authorized" : + [ + "eLnko7bphqc=", + "F+9wQXlthNc=", + "RRyNinInfko=", + "TJjfqt7ryuA=", + "i50UmARnzUg=", + "brfAb7Oy1oo=", + "BGsLI7G63f4=", + "EH085gzhZY0=", + "WoAheSPym9g=" + ], + "pathpayment strict send|protocol version 26|destination line full" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "BI9+z12v+Bo=", + "Ng992V09pYo=", + "3cS2XMJrv0A=", + "VVbeS3DLqAQ=", + "UQFJuq1KcUo=" + ], + "pathpayment strict send|protocol version 26|destination line overflow" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "VdwNLuBPT1k=", + "Ng992V09pYo=", + "o7q3qHn4ryw=", + "VVbeS3DLqAQ=", + "UQFJuq1KcUo=" + ], + "pathpayment strict send|protocol version 26|destination minimum constraints" : [ "eLnko7bphqc=", "Tg2dnTcND/8=", "UeEUfbgy3DA=", "FAGaMo6BMVM=" ], + "pathpayment strict send|protocol version 26|does not cross own offer if better is available for first exchange" : + [ + "qmQxLyCpOBc=", + "6xDa6BT1WP8=", + "fSiXqg+O9Wk=", + "2/jZYIPb6c4=", + "8U+IOY/evAM=", + "5VaSgWySpCU=", + "UXvAf9fHNBE=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "Q3oUTrsmRfk=", + "SV89dl1JRmw=", + "/sMNGHMkZuM=", + "KnY5gKGoj4c=", + "9uKerPLaCto=", + "WMIMEAzVDOE=", + "EE8SYOQTmgs=", + "aChp8DE0/e8=", + "Km3xhfJPlU8=", + "pgX90Gyrhns=", + "jkISldrCf3c=", + "iCGgrC8KPPM=", + "dd903rxWV/U=", + "K7kmfza4PoY=", + "O79HdH5snqY=" + ], + "pathpayment strict send|protocol version 26|does not cross own offer if better is available for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "+g1jt0F5h/I=", + "vCeYYMPmjnQ=", + "W2guZyWd17Q=", + "ZFd5vdC9kc8=", + "45JeMtb9m0o=", + "ieHxkQI4TnU=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "NNS+L87ttKs=", + "Alb3ZSagshE=", + "kH/nzpUYPc4=", + "O/JRri3GxjQ=", + "bBztDsGgH5A=", + "okESQT6i9JE=", + "Iyhz8Mok+ek=", + "7faMiG+eUjg=", + "+y+avhcnp2Q=", + "b6JpImbi4Ho=" + ], + "pathpayment strict send|protocol version 26|does not cross own offer if better is available for middle exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "+g1jt0F5h/I=", + "2cLeFcWlfwM=", + "bR5uoR59ZFo=", + "ZFd5vdC9kc8=", + "45JeMtb9m0o=", + "ieHxkQI4TnU=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "NNS+L87ttKs=", + "Alb3ZSagshE=", + "5STeAp2Ci/E=", + "SVvUPdN+98w=", + "bBztDsGgH5A=", + "okESQT6i9JE=", + "QsPBAUtjoEk=", + "UmiR7Lt8D/8=", + "w+wcVmI1duA=", + "tsJknRH/wUw=" + ], + "pathpayment strict send|protocol version 26|issuer missing" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=", + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=", + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=" + ], + "pathpayment strict send|protocol version 26|issuer missing|path payment last issuer missing" : [ "+e+59OOXpzo=", "tmSLmoNz1mw=" ], + "pathpayment strict send|protocol version 26|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment strict send|protocol version 26|issuer missing|path payment send issuer missing" : [ "N7nC2GbBfNg=", "tmSLmoNz1mw=" ], + "pathpayment strict send|protocol version 26|liabilities|cannot pay balance below selling liabilities" : + [ + "0Q71IdJSh6E=", + "chd7Nk1rvrs=", + "fSiXqg+O9Wk=", + "+lh4blqYbCo=", + "d21D8W/rFr4=", + "lZYWcEFy2II=", + "jLeh4MO0nzA=", + "+CQCZckrtCc=", + "es8Bx0Wzoys=", + "I1LS8giv3Kc=", + "LEipdkXRPBU=", + "9BleSWWLEbs=", + "YSuv9O/sjso=" + ], + "pathpayment strict send|protocol version 26|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + [ + "0Q71IdJSh6E=", + "chd7Nk1rvrs=", + "fSiXqg+O9Wk=", + "+lh4blqYbCo=", + "d21D8W/rFr4=", + "lZYWcEFy2II=", + "jLeh4MO0nzA=", + "+CQCZckrtCc=", + "es8Bx0Wzoys=", + "f2aKrcB8kbA=", + "MVygScVHgAI=", + "+3g0ewFJ9ic=", + "s+C4Hvq10zI=", + "Cwz3Z4ry+/o=" + ], + "pathpayment strict send|protocol version 26|not enough offers for first exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "e8gJL8zgCw8=", + "JmClDtbz6r0=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 26|not enough offers for last exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "QeeSV0NrlQ8=", + "JmClDtbz6r0=", + "t0W/GzdUKUU=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 26|not enough offers for middle exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "QeeSV0NrlQ8=", + "xZH6bFaTZds=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 26|rounding" : + [ + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=", + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=", + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=" + ], + "pathpayment strict send|protocol version 26|rounding|exchangeV10 recalculate sheepValue: 1 offer" : + [ + "Ni072QGUW4M=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "DwC3xzhMG08=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "RRgUN1cgbG0=" + ], + "pathpayment strict send|protocol version 26|rounding|exchangeV10 recalculate sheepValue: 2 offers" : + [ + "z71xApXGK3I=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "cSDTFS0jfT8=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "7+o+VIi9NpQ=", + "g6le2AYAA90=" + ], + "pathpayment strict send|protocol version 26|rounding|send some, receive nothing" : + [ + "z71xApXGK3I=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "cSDTFS0jfT8=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "7+o+VIi9NpQ=", + "tRkqHjwReeE=" + ], + "pathpayment strict send|protocol version 26|send amount constraints" : [ "eLnko7bphqc=", "Tg2dnTcND/8=", "UeEUfbgy3DA=", "FAGaMo6BMVM=" ], + "pathpayment strict send|protocol version 26|send amount too big" : + [ + "TSReZgxlUww=", + "v8lZeIsToOA=", + "Uugo9rWwEC8=", + "VdwNLuBPT1k=", + "p7Tt5FPaAvQ=", + "qtXyCPhJrGM=", + "1+IyZyv9p2o=" + ], + "pathpayment strict send|protocol version 26|source does not have trustline" : + [ + "B8eZLlA3QAI=", + "ktuzHMv/IqE=", + "UgUOTk3nN4Q=", + "OqDuU0KyT7o=", + "wGJirSRxKX8=" + ], + "pathpayment strict send|protocol version 26|source is not authorized" : + [ + "iL7u6PcSRVw=", + "v8lZeIsToOA=", + "1/2Ln+3WcAE=", + "7QbZUATnwz0=", + "mG1KuE9WmZA=", + "brfAb7Oy1oo=", + "YugIPkEfzdA=", + "wVY49x+3UuQ=", + "0ALYHmpB0zs=" + ], + "pathpayment strict send|protocol version 26|takes all offers, multiple offers per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "Cbtn3AwpknY=", + "pSJXiLYA2bs=", + "36ea2+rYDmg=", + "8hfOhPjUiFk=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "us9Zn+LajCU=", + "/NGCwysP624=", + "7dvjoLH3fNM=", + "n8473ts2oSg=", + "aRPSOqSfbV8=", + "RWMoABAXBMk=", + "JF2S26KCNY8=", + "SzLN4OAaEQY=", + "EIg0rJWZBUw=", + "fPXB/OassXg=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "sPGlsjsBh0g=" + ], + "pathpayment strict send|protocol version 26|takes all offers, one offer per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "Cbtn3AwpknY=", + "jYWaVEYTegE=", + "zqkasp3Mvbc=", + "xCQEWiZnR5o=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "feenXo1lw/k=", + "dy6y9VG5KRE=", + "ZUUU7LBxlVw=", + "c1ZT3I0Ii7Q=", + "ES1h8cBIQv8=", + "4egIznvcDQQ=", + "1ilChofvrNA=", + "ArKxSO7HgN0=" + ], + "pathpayment strict send|protocol version 26|takes best offers, multiple offers per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "Cbtn3AwpknY=", + "pSJXiLYA2bs=", + "36ea2+rYDmg=", + "8hfOhPjUiFk=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "aOFsvW9G8u8=", + "/NGCwysP624=", + "7dvjoLH3fNM=", + "n8473ts2oSg=", + "aRPSOqSfbV8=", + "RWMoABAXBMk=", + "JF2S26KCNY8=", + "SzLN4OAaEQY=", + "EIg0rJWZBUw=", + "fPXB/OassXg=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "L81alYqPfk4=" + ], + "pathpayment strict send|protocol version 26|takes best offers, multiple offers per exchange, last offer sends 0 but adjusts to be deleted" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "7Tfr2k3iRpw=", + "6BVtxmMlM/0=", + "aAqYy6EdIeI=", + "FeRqpqzZwoc=", + "6Hc2KKc8oQA=", + "wCh+A/APpTk=", + "4SVZF+Xg7o4=", + "w1GajO6JYoE=", + "X4dDun75Xos=", + "HtzboJFiw2I=", + "3yudarmBDhU=", + "KJocMEhnB30=", + "k8rndXh5OpE=", + "FWbwQR+fxmA=", + "XrIBZiSLajE=", + "p969QjwbG8U=", + "73wqULn0E2U=", + "tfG/wAzWQaM=", + "PGiVslQykeg=", + "4Fgjr9tVi2U=", + "imDJ+p4hSV8=", + "gxF4FFm0dHc=", + "msNdztj9TUQ=", + "NacizF9AvdM=", + "h3X9uTVIb5g=", + "dLAGtxhPr94=" + ], + "pathpayment strict send|protocol version 26|to self XLM" : [ "eUyY+GwKPe4=", "aJv4cTpj+pI=" ], + "pathpayment strict send|protocol version 26|to self asset" : [ "9iYB5CZvuZI=", "49V3t+zLBXE=", "/9wdKo2wkeU=", "0fxyFB5E7Ro=" ], + "pathpayment strict send|protocol version 26|to self asset over the limit" : [ "9iYB5CZvuZI=", "49V3t+zLBXE=", "GrX/eCNRfhs=", "b2DBB04e7Jo=" ], + "pathpayment strict send|protocol version 26|under destination minimum XLM" : [ "VO1L5Rt2MK8=", "/2haRV0n3to=", "jqDTZZ/yqZQ=" ], + "pathpayment strict send|protocol version 26|under destination minimum asset" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "fR3t7ar0bT0=", + "fs4CP0lni9s=", + "TBwb2Ll+iQg=", + "PKQzd8AM3+w=" + ], + "pathpayment strict send|protocol version 26|under destination minimum with real path" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "Cbtn3AwpknY=", + "jYWaVEYTegE=", + "zqkasp3Mvbc=", + "xCQEWiZnR5o=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "feenXo1lw/k=", + "dy6y9VG5KRE=", + "ZUUU7LBxlVw=", + "c1ZT3I0Ii7Q=", + "ES1h8cBIQv8=", + "4egIznvcDQQ=", + "1ilChofvrNA=", + "QqdQAouaiYQ=" + ], + "pathpayment strict send|protocol version 26|uses whole best offer for first exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "kZUlKzirNAc=", + "1xoPcCaGSmg=", + "EbXKKOlrEuw=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "Qpp4dZpx0Uw=", + "tkikUzbTBd4=", + "THUfBcrTApE=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "MC8qJX3U6pw=", + "UEFIyg/2+7w=", + "MjJx0q+8GVw=", + "pRywSg4lOZQ=", + "sHSmM/YKJho=", + "KlVUelwrCD4=", + "Na43vaX6XIY=", + "sJpCg7f3nEk=" + ], + "pathpayment strict send|protocol version 26|uses whole best offer for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "xUQIczSM+mY=", + "hEyTf1iDmRQ=", + "Hpjo9o3NiWs=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "nKQD3rlV59Q=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "d+ESnHG3Ohg=", + "tlam7OrKwrI=", + "U5fZg1SZhUo=", + "+SeRBDZK+o0=", + "gjELMm/rbhw=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "nB5yFvtyh0o=" + ], + "pathpayment strict send|protocol version 26|uses whole best offer for second exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "25iX2Aoax6Q=", + "Cnp6N3tmZeo=", + "EbXKKOlrEuw=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "PAx4objgdqw=", + "+l7d7ARQqfQ=", + "dzEV7USP3TU=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "IGW0VcEpTMc=", + "wx8DithpYh8=", + "RlPeiYZEEdc=", + "+SeRBDZK+o0=", + "rSHllhfRUa0=", + "l9rPFYGB2jk=", + "Na43vaX6XIY=", + "9HD9Vfu6GqU=" + ], + "pathpayment strict send|protocol version 26|with cycle" : + [ + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=" + ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage" : + [ + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=" + ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage with low destmin" : + [ + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=" + ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage with low destmin|send with path (IDR -> USD -> XLM -> IDR)" : [ "czvEgr+Q+WM=" ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage with low destmin|send with path (USD -> XLM -> IDR -> USD)" : [ "KTCkw3ugk9Q=" ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage with low destmin|send with path (XLM -> IDR -> USD -> XLM)" : [ "Kz3oaR7d3aE=" ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 26|with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 26|with cycle|arbitrage" : + [ + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=", + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=", + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=" + ], + "pathpayment strict send|protocol version 26|with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "lplcRTVGH1s=" ], + "pathpayment strict send|protocol version 26|with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "M3Xi0ZqKnAI=" ], + "pathpayment strict send|protocol version 26|with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "KdS6oneesgI=" ], + "pathpayment strict send|protocol version 26|with rounding errors" : + [ + "MeWjcmO9354=", + "XSwxdxt5i4U=", + "7zNelG1uQPI=", + "6/rSTJIzxrU=", + "cMkNLyLs4i8=", + "0d0d6KiblyQ=", + "tRzj2ksncFg=", + "ie6GldQ1XEs=", + "cCG+dBmDtIw=" + ], "pathpayment strict send|protocol version 2|crosses destination offer for first exchange" : [ "xC426YWBjUs=", diff --git a/test-tx-meta-baseline-current/PathPaymentTests.json b/test-tx-meta-baseline-current/PathPaymentTests.json index ba13a22cae..4c18f3a2d8 100644 --- a/test-tx-meta-baseline-current/PathPaymentTests.json +++ b/test-tx-meta-baseline-current/PathPaymentTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "path payment uses all offers in a loop|protocol version 0" : [ @@ -1453,6 +1454,89 @@ "K6bmaDg5KcQ=", "r88bD+Drst4=" ], + "path payment uses all offers in a loop|protocol version 26" : + [ + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=", + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=", + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=" + ], + "path payment uses all offers in a loop|protocol version 26|inside issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "WSo5mYbpzIE=", + "r88bD+Drst4=" + ], + "path payment uses all offers in a loop|protocol version 26|no issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "2nduu/0zlEs=" + ], + "path payment uses all offers in a loop|protocol version 26|outside issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "K6bmaDg5KcQ=", + "r88bD+Drst4=" + ], "path payment uses all offers in a loop|protocol version 2|inside issuers missing" : [ "znU103OdJm8=", @@ -12250,10 +12334,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -12396,12 +12480,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -12543,12 +12627,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -12690,12 +12774,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -12837,12 +12921,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -12984,12 +13068,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -13131,12 +13215,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -13278,12 +13362,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -13425,12 +13509,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -13572,12 +13656,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 14|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 14|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 14|issuer missing" : @@ -15693,10 +15777,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -15839,12 +15923,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -15986,12 +16070,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -16133,12 +16217,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -16280,12 +16364,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -16427,12 +16511,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -16574,12 +16658,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -16721,12 +16805,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -16868,12 +16952,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -17015,12 +17099,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 15|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 15|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 15|issuer missing" : @@ -19136,10 +19220,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -19282,12 +19366,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -19429,12 +19513,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -19576,12 +19660,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -19723,12 +19807,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -19870,12 +19954,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -20017,12 +20101,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -20164,12 +20248,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -20311,12 +20395,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -20458,12 +20542,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 16|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 16|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 16|issuer missing" : @@ -22579,10 +22663,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -22725,12 +22809,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -22872,12 +22956,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -23019,12 +23103,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -23166,12 +23250,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -23313,12 +23397,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -23460,12 +23544,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -23607,12 +23691,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -23754,12 +23838,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -23901,12 +23985,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 17|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 17|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 17|issuer missing" : @@ -26022,10 +26106,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -26168,12 +26252,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -26315,12 +26399,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -26462,12 +26546,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -26609,12 +26693,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -26756,12 +26840,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -26903,12 +26987,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -27050,12 +27134,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -27197,12 +27281,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -27344,12 +27428,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 18|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 18|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 18|issuer missing" : @@ -29465,10 +29549,10 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -29611,12 +29695,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", @@ -29758,12 +29842,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", @@ -29905,12 +29989,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", @@ -30052,12 +30136,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", @@ -30199,12 +30283,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -30346,12 +30430,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", @@ -30493,12 +30577,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", @@ -30640,12 +30724,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -30787,12 +30871,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], "pathpayment|protocol version 19|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], "pathpayment|protocol version 19|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], "pathpayment|protocol version 19|issuer missing" : @@ -34891,10 +34975,10 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -35037,12 +35121,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", @@ -35184,12 +35268,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", @@ -35331,12 +35415,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", @@ -35478,12 +35562,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", @@ -35625,12 +35709,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -35772,12 +35856,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", @@ -35919,12 +36003,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", @@ -36066,12 +36150,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -36213,12 +36297,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], "pathpayment|protocol version 20|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], "pathpayment|protocol version 20|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], "pathpayment|protocol version 20|issuer missing" : @@ -37738,7 +37822,3450 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage" : + [ + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=" + ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax" : + [ + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=" + ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage" : + [ + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=", + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=", + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=" + ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 20|path payment with rounding errors" : + [ + "pjSG6TKYsG8=", + "gFz8o0HBkqg=", + "iUtpyh6XtB8=", + "evKjP49/7BA=", + "cMkNLyLs4i8=", + "0d0d6KiblyQ=", + "LGcQnfOiS8I=", + "ie6GldQ1XEs=", + "7Hut65U4jf4=" + ], + "pathpayment|protocol version 20|path with bogus offer, bogus offer shows on offers trail" : + [ + "wcgpbmaVjBA=", + "yuIxOHPBaBQ=", + "ouMyZziMl+g=", + "bjXaXyNKPcI=", + "bSUTAXViYqw=", + "az5l08eNYQk=", + "v1B8VCiHaW4=", + "U+Qp6/NERxc=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment" : + [ + "GMFz9Wcm7H4=", + "EdmTGwx/oHw=", + "+vurEkbV2us=", + "FGzIAIxeofc=", + "cZ6cjjGSL4E=", + "QQvofI3avDM=", + "qSH7D3AVmZc=", + "kGyhvJYqEGQ=", + "GMFz9Wcm7H4=", + "EdmTGwx/oHw=", + "+vurEkbV2us=", + "FGzIAIxeofc=", + "cZ6cjjGSL4E=", + "QQvofI3avDM=", + "qSH7D3AVmZc=", + "kGyhvJYqEGQ=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + [ + "SDA54a1FCn8=", + "fx8/uj8pMZU=", + "OzvRDBvfSXc=", + "S5Z2fdVXXRk=", + "JQJDHlGGuKw=", + "LXrcsR8fhTA=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + [ + "sko66XB6VKM=", + "cGePF4sBpUc=", + "SjhpCyV17y4=", + "EIf85MlHri0=", + "0xu9qM5H9OE=", + "D49JXrZm99c=" + ], + "pathpayment|protocol version 21" : + [ + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "HJ0uCpmZfFY=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "mmDCjvx/7/g=", + "CZOj2X2cD9s=", + "k53WMYqD7Ws=", + "XU8W/j21sRg=", + "c8ws/vjWMV4=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "/GoNfkLutro=", + "Rkr/txmhP5o=", + "i1N4O/+6s7Y=", + "DwLmc41DrZ4=", + "7ihkpYi9Ht4=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "aPGKW/yEGD0=", + "9+gjVh2AOLk=", + "Na43vaX6XIY=", + "/GoNfkLutro=", + "z3eQpNa3XBw=", + "i1N4O/+6s7Y=", + "gRfBVI6+TYs=", + "G2N6OlTf81g=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "HJ0uCpmZfFY=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "pa2DQqS4bwU=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "j81qhaFS5ss=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "aPGKW/yEGD0=", + "9+gjVh2AOLk=", + "Na43vaX6XIY=", + "7RAttFPon9g=" + ], + "pathpayment|protocol version 21|crossed offers release sponsorships allowing payment to succeed for source" : + [ + "/zcorm87qHQ=", + "8dtY9HNqTlc=", + "mkA8dReKyjw=", + "olo/Vu1jSK0=", + "OStx/5DtX2A=", + "2XR9oqinR1k=", + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 21|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 21|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 21|issuer missing" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=", + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=", + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=" + ], + "pathpayment|protocol version 21|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 21|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 21|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 21|liabilities|cannot pay balance below selling liabilities" : + [ + "SDtbjftEI1s=", + "N69CP8LhY0g=", + "URxBC5KX89k=", + "Z2hE3ikMbn4=", + "fLp07s34sG0=", + "9Drp+/Sj+Fk=", + "j70sBkhgkTA=", + "mdVbgPUqqno=", + "NQMxf0Zhm6U=", + "Itq8GcPd5Ps=", + "H3qWFpwqtQ0=", + "9BleSWWLEbs=", + "JdItP/blvhE=" + ], + "pathpayment|protocol version 21|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + [ + "SDtbjftEI1s=", + "N69CP8LhY0g=", + "URxBC5KX89k=", + "Z2hE3ikMbn4=", + "fLp07s34sG0=", + "9Drp+/Sj+Fk=", + "j70sBkhgkTA=", + "mdVbgPUqqno=", + "NQMxf0Zhm6U=", + "bQN/5HdxBh4=", + "AqNWxxYVZMg=", + "QjOLIrqYux0=", + "s+C4Hvq10zI=", + "nRtt0mTyl68=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "QQ4h8tqZT9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ulHyT4b2SBU=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "0giVoX99Wmg=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 21|path payment asset with not enough funds" : + [ + "5nC6xsgmxLs=", + "Pazy8CJDr+A=", + "nLtG3yq8b9Y=", + "0oDctYWMTa8=", + "bEDektKfRZM=", + "kpKqsIKNDMM=", + "oHB6DhbBacU=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for first exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "J3mnwWP/C9A=", + "kACOdqjy7RI=", + "bSZpZEyPzqs=", + "+f1LARl9w9Y=", + "AacAIQaK9HI=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "iIQgcvlFuJY=", + "jAFCeDoPL+U=", + "6vhgBkZkSFc=", + "zmSU1Yo209s=", + "zUxBAfGjTjE=", + "0fQwPycepNs=", + "IlRspbbYCyo=", + "R9Z5XuIfOdw=", + "dXFqJZD8GQQ=", + "eM6EfdRtAxQ=", + "lXDT7LiGnEA=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for last exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "bSZpZEyPzqs=", + "MjywsTnTWCE=", + "oicfAtgu+do=", + "utu+aZ3+r/8=", + "nhHP8Sfy3k8=", + "RytwHSzzBVQ=", + "/+7KoVvfZUU=", + "vLhVwrtxaho=", + "tVQc46G3K4A=", + "8hy+NSvWQOs=", + "L+D1oLrg8VU=", + "Z3S0P+IzZgE=", + "HrgtrgyMVkw=", + "QF9yUfxuR1E=", + "j07bC7ehxMM=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for middle exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "lCSRAX4I974=", + "kACOdqjy7RI=", + "bSZpZEyPzqs=", + "MjywsTnTWCE=", + "oicfAtgu+do=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "kxtAqLUzWgg=", + "KTR+g8pZqdw=", + "6vhgBkZkSFc=", + "zmSU1Yo209s=", + "1M2jAGWqH0c=", + "PI771/Z0JR0=", + "IlRspbbYCyo=", + "RUQjv4d5AsU=", + "XpSg+d4cgxo=", + "eM6EfdRtAxQ=", + "qV2c+/ls7xQ=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for first exchange" : + [ + "5c6UBHiI+wk=", + "kaTyzoqxCVo=", + "qo74s1HZB5k=", + "jgx9R5zyZv8=", + "V8UufGgWimw=", + "dJWLYZfR6eU=", + "cJYQzeFYkOE=", + "RxQ+H+td5io=", + "o+32QNYuWMI=", + "/auR3DyJamA=", + "RsvlkFCdMfQ=", + "vLhVwrtxaho=", + "gAm6EgCGLFk=", + "SNySMZPdFWE=", + "jvxPwGJLhVI=", + "ZFJ0HsG7cLY=", + "Yr9FHebsDVw=", + "TZgoqjbP/mg=", + "zdv2cP5T1F8=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "SZ40vD1VBBE=", + "Qfc9DZh5K6k=", + "bJkCU3rOT4Q=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "XQrdw4Rz49I=", + "SV89dl1JRmw=", + "M74si97PonU=", + "zmSU1Yo209s=", + "c+b5Ye7Rtik=", + "0ESdc41k8cM=", + "CrAVA3FR8ww=", + "sXqFrezTNdc=", + "deuoQBlxE20=", + "vPnvVFdjuzU=", + "4R+Ytq7eRYk=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for middle exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "kACOdqjy7RI=", + "SZ40vD1VBBE=", + "86unpK6HXKY=", + "HYBRSoWu/bo=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "d8wEGj9jWrg=", + "uZwQhV2v5ZA=", + "M74si97PonU=", + "zmSU1Yo209s=", + "c+b5Ye7Rtik=", + "HTKsAcMyUuI=", + "iwDqLXKdQz8=", + "sXqFrezTNdc=", + "2KKdy+18V3s=", + "HpH1buzQvSA=", + "lAHs/LaSaT8=" + ], + "pathpayment|protocol version 21|path payment destination amount 0" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination amount negative" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 21|path payment destination does not have trustline" : + [ + "84dB2CkjYMM=", + "FG3IhmTARzU=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "eCrqSgEANyk=", + "PKQzd8AM3+w=" + ], + "pathpayment|protocol version 21|path payment destination is issuer and does not exists for complex paths" : + [ + "84dB2CkjYMM=", + "xJSnVFa38aM=", + "7bnR/v25q6s=", + "Wg+fgElw2FQ=", + "d7qzlts02Go=" + ], + "pathpayment|protocol version 21|path payment destination is issuer and does not exists for simple paths" : + [ + "84dB2CkjYMM=", + "xJSnVFa38aM=", + "7bnR/v25q6s=", + "Wg+fgElw2FQ=", + "Vyqf60paCOQ=" + ], + "pathpayment|protocol version 21|path payment destination is not authorized" : + [ + "84dB2CkjYMM=", + "seAkOSbJ9bg=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "0kY0b30fQuM=", + "QIzPbnwaNIk=", + "84dB2CkjYMM=", + "seAkOSbJ9bg=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "0kY0b30fQuM=", + "QIzPbnwaNIk=" + ], + "pathpayment|protocol version 21|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 21|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 21|path payment destination line full" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "0oDctYWMTa8=", + "Ytvp7CGAD7o=", + "tWsBDuGfYb8=", + "oUB9G6vyaKk=", + "UQFJuq1KcUo=" + ], + "pathpayment|protocol version 21|path payment destination line overflow" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "rBbWm25IsyI=", + "Ytvp7CGAD7o=", + "J5RF9+JTsKg=", + "oUB9G6vyaKk=", + "UQFJuq1KcUo=" + ], + "pathpayment|protocol version 21|path payment destination path currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for first exchange" : + [ + "5c6UBHiI+wk=", + "kaTyzoqxCVo=", + "URxBC5KX89k=", + "lgbAKRlAgn4=", + "7Sbjr+0M8s4=", + "IXQBdJFRAwU=", + "iG1Fr0YfhKg=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "XQrdw4Rz49I=", + "SV89dl1JRmw=", + "/sMNGHMkZuM=", + "KnY5gKGoj4c=", + "9uKerPLaCto=", + "5kk6NeOSQso=", + "9gV2104FoKI=", + "4Wp+RBpa0wo=", + "wbQlZ/Kz12w=", + "Z+Ux51YfSi0=", + "iVA1jGzq09o=", + "MtSPVHot0Zw=", + "4XI7ZXXsHfk=", + "K7kmfza4PoY=", + "vDQe3tVDJF0=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "TDwjyCnP9jg=", + "vCeYYMPmjnQ=", + "W2guZyWd17Q=", + "cE03bzbS8F4=", + "3+k3RCZgkVQ=", + "oRmqj3SvYAk=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "2R5jxMFk57U=", + "8Jbnznpoes0=", + "mBtoT5d8Vxo=", + "tEb923m0538=", + "G8ELlauZFuQ=", + "0VNnV1pndcY=", + "J0pA48YUiuA=", + "7faMiG+eUjg=", + "+y+avhcnp2Q=", + "WLCzeX9QUTs=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for middle exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "TDwjyCnP9jg=", + "B7F6+feQLpY=", + "bR5uoR59ZFo=", + "cE03bzbS8F4=", + "3+k3RCZgkVQ=", + "oRmqj3SvYAk=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "2R5jxMFk57U=", + "8Jbnznpoes0=", + "XD8CUYLPGrU=", + "pvNY87GOF94=", + "G8ELlauZFuQ=", + "0VNnV1pndcY=", + "23abQzcabPE=", + "sH9/Ma37y3U=", + "w+wcVmI1duA=", + "l3moHflzmvk=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "QdukIQmH1jY=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "JDiWIwO+zP4=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "wu+z/Bm5lK4=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "k8mDHsdDtFk=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "lwUoYf4lvKg=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "vidJs2P/+V4=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 21|path payment not enough offers for first exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "DrAZT3phwvs=", + "Ou2y26AkVUw=", + "t0W/GzdUKUU=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment not enough offers for last exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "svO9nEk0AVk=", + "Ou2y26AkVUw=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment not enough offers for middle exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "DrAZT3phwvs=", + "qnPjqedGbTM=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 21|path payment over send max asset" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "sYj+c9aFJbo=", + "yjeLdT4QJJw=", + "JajBi4B9QYo=", + "PKQzd8AM3+w=" + ], + "pathpayment|protocol version 21|path payment over send max with real path" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "QRFmz0cab/8=", + "4ZoPOW0YsX8=", + "3OB5Fz1NH7E=", + "i3+doKhg3yQ=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "x3HdUNvOpYE=", + "6izvAMPQXMw=", + "ecA6Ns1r+qs=", + "fDEHOy8/1A4=", + "m9y9Q17P010=", + "Tt4DLLMC+Tg=", + "1ilChofvrNA=", + "QqdQAouaiYQ=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "QdukIQmH1jY=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "JDiWIwO+zP4=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "wu+z/Bm5lK4=" + ], + "pathpayment|protocol version 21|path payment rounding" : + [ + "84dB2CkjYMM=", + "l/kHyURS/+M=", + "5ZlFxJBFyFA=", + "84dB2CkjYMM=", + "l/kHyURS/+M=", + "5ZlFxJBFyFA=" + ], + "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + [ + "+b87FRsGcjk=", + "B62pF6s6HKU=", + "vPwHMotDGCI=", + "EmcOgYB0lek=", + "fmXAq43skHE=", + "tsWDmFYJBJo=", + "XZYDIIGqDC4=", + "LT0l0KObt6I=" + ], + "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + [ + "73A0UNKWLKo=", + "7j9cSBVYs4U=", + "/X+4TW7bq/w=", + "ZGmkBVKAHG4=", + "tzuGa6BQ3ng=", + "8MWooxhr5DY=", + "3F2ZL+28hHg=", + "RP+CXGlIDMQ=", + "tpaGwWKft3Q=" + ], + "pathpayment|protocol version 21|path payment send currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment send max 0" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment send max negative" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment source does not have trustline" : + [ + "/EmyOnCtLmA=", + "c1gCoedj8uQ=", + "EJfgn0W2N3g=", + "OqDuU0KyT7o=", + "wGJirSRxKX8=" + ], + "pathpayment|protocol version 21|path payment source is not authorized" : + [ + "zPS+2W6schE=", + "Pazy8CJDr+A=", + "xH9z1nN2Eqc=", + "aknfXCAKshM=", + "bZ3gPtw91cM=", + "QIzPbnwaNIk=", + "zPS+2W6schE=", + "Pazy8CJDr+A=", + "xH9z1nN2Eqc=", + "aknfXCAKshM=", + "bZ3gPtw91cM=", + "QIzPbnwaNIk=" + ], + "pathpayment|protocol version 21|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 21|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "kpI9oAm3T6k=", + "zvcCyZ/1O6Y=", + "pVDK6uoLmbc=", + "fDEHOy8/1A4=" + ], + "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange V10" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "OstPSQr5pYg=", + "IkuW9noe4CQ=", + "hYAVjmIyBx4=", + "KBvD3Ho2FOY=", + "Que30dRKLks=", + "zDt//pqKMGE=", + "1DYvE3KMLHg=", + "E5FJovY32mE=", + "HQ94upzMa70=", + "5wmXiCqVv6A=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "YELQlc6wi88=" + ], + "pathpayment|protocol version 21|path payment takes all offers, one offer per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "QRFmz0cab/8=", + "4ZoPOW0YsX8=", + "3OB5Fz1NH7E=", + "i3+doKhg3yQ=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "x3HdUNvOpYE=", + "6izvAMPQXMw=", + "ecA6Ns1r+qs=", + "fDEHOy8/1A4=", + "m9y9Q17P010=", + "Tt4DLLMC+Tg=", + "1ilChofvrNA=", + "r/vKK+R+E9I=" + ], + "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "kpI9oAm3T6k=", + "zvcCyZ/1O6Y=", + "pVDK6uoLmbc=", + "fDEHOy8/1A4=" + ], + "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange V10" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "qkbz0C0TO6U=", + "IkuW9noe4CQ=", + "hYAVjmIyBx4=", + "KBvD3Ho2FOY=", + "Que30dRKLks=", + "zDt//pqKMGE=", + "1DYvE3KMLHg=", + "E5FJovY32mE=", + "HQ94upzMa70=", + "5wmXiCqVv6A=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "86cuf/GS4O0=" + ], + "pathpayment|protocol version 21|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 21|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 21|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 21|path payment with cycle" : + [ + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=" + ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -37750,7 +41277,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -37762,13 +41289,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage" : + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -37780,10 +41307,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 20|path payment with rounding errors" : + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 21|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -37795,7 +41322,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 20|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 21|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -37806,7 +41333,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -37825,7 +41352,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -37834,7 +41361,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -37843,7 +41370,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 21" : + "pathpayment|protocol version 22" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -38140,7 +41667,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38173,7 +41700,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38206,7 +41733,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38239,7 +41766,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38268,7 +41795,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38297,7 +41824,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38326,7 +41853,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 21|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 22|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -38334,12 +41861,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38480,13 +42007,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38627,13 +42154,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38774,13 +42301,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38921,13 +42448,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39068,13 +42595,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39215,13 +42742,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39362,13 +42889,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39509,13 +43036,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39656,15 +43183,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 21|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 21|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 21|issuer missing" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 22|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 22|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 22|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -39682,10 +43209,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 21|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 21|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 21|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 22|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 22|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 22|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 22|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -39701,7 +43228,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 21|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 22|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -39718,7 +43245,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39746,7 +43273,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39774,7 +43301,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39802,7 +43329,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39830,7 +43357,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39858,7 +43385,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39886,8 +43413,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 21|path payment asset with not enough funds" : + "pathpayment|protocol version 22|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 22|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -39897,7 +43424,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -39920,7 +43447,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -39942,7 +43469,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -39965,7 +43492,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 21|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -39987,7 +43514,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 21|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40010,7 +43537,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 21|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40033,7 +43560,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 21|path payment destination amount 0" : + "pathpayment|protocol version 22|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40041,7 +43568,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination amount negative" : + "pathpayment|protocol version 22|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40049,7 +43576,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination currency invalid" : + "pathpayment|protocol version 22|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40057,8 +43584,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 21|path payment destination does not have trustline" : + "pathpayment|protocol version 22|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 22|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -40067,7 +43594,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 22|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -40075,7 +43602,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 21|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 22|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -40083,7 +43610,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 21|path payment destination is not authorized" : + "pathpayment|protocol version 22|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -40098,9 +43625,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 21|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 21|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 21|path payment destination line full" : + "pathpayment|protocol version 22|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 22|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 22|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40111,7 +43638,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 21|path payment destination line overflow" : + "pathpayment|protocol version 22|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40122,7 +43649,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 21|path payment destination path currency invalid" : + "pathpayment|protocol version 22|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40130,7 +43657,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -40157,7 +43684,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40185,7 +43712,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40213,7 +43740,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40242,7 +43769,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40271,7 +43798,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40300,7 +43827,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40329,7 +43856,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40358,7 +43885,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40387,7 +43914,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40440,9 +43967,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40495,9 +44022,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40550,9 +44077,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment not enough offers for first exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 22|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40576,7 +44103,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment not enough offers for last exchange" : + "pathpayment|protocol version 22|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40600,7 +44127,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 22|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40624,8 +44151,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 21|path payment over send max asset" : + "pathpayment|protocol version 22|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 22|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40634,7 +44161,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|path payment over send max with real path" : + "pathpayment|protocol version 22|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40658,7 +44185,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40687,7 +44214,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40716,7 +44243,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40745,7 +44272,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment rounding" : + "pathpayment|protocol version 22|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -40754,7 +44281,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -40765,7 +44292,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -40777,7 +44304,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 21|path payment send currency invalid" : + "pathpayment|protocol version 22|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40785,7 +44312,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment send max 0" : + "pathpayment|protocol version 22|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40793,7 +44320,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment send max negative" : + "pathpayment|protocol version 22|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40801,7 +44328,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment source does not have trustline" : + "pathpayment|protocol version 22|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -40809,7 +44336,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 21|path payment source is not authorized" : + "pathpayment|protocol version 22|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -40824,9 +44351,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 21|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 21|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 22|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 22|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40846,7 +44373,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40876,7 +44403,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 21|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 22|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40900,7 +44427,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40920,7 +44447,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40950,10 +44477,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 21|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 21|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 21|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 21|path payment with cycle" : + "pathpayment|protocol version 22|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 22|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 22|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 22|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -41181,7 +44708,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -41193,7 +44720,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -41205,13 +44732,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -41223,10 +44750,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 21|path payment with rounding errors" : + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 22|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -41238,7 +44765,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 21|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 22|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -41249,7 +44776,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -41268,7 +44795,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -41277,7 +44804,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -41286,7 +44813,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 22" : + "pathpayment|protocol version 23" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -41583,7 +45110,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41616,7 +45143,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41649,7 +45176,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41682,7 +45209,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41711,7 +45238,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41740,7 +45267,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41769,7 +45296,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 22|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 23|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -41777,12 +45304,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -41923,13 +45450,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42070,13 +45597,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42217,13 +45744,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42364,13 +45891,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42511,13 +46038,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42658,13 +46185,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42805,13 +46332,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42952,13 +46479,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -43099,15 +46626,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 22|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 22|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 22|issuer missing" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 23|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 23|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 23|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43125,10 +46652,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 22|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 22|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 22|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 23|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 23|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 23|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 23|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -43144,7 +46671,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 22|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 23|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -43161,7 +46688,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43189,7 +46716,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43217,7 +46744,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43245,7 +46772,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43273,7 +46800,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43301,7 +46828,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43329,8 +46856,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 22|path payment asset with not enough funds" : + "pathpayment|protocol version 23|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 23|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -43340,7 +46867,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43363,7 +46890,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43385,7 +46912,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43408,7 +46935,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 22|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -43430,7 +46957,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 22|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43453,7 +46980,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 22|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43476,7 +47003,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 22|path payment destination amount 0" : + "pathpayment|protocol version 23|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43484,7 +47011,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination amount negative" : + "pathpayment|protocol version 23|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43492,7 +47019,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination currency invalid" : + "pathpayment|protocol version 23|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43500,8 +47027,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 22|path payment destination does not have trustline" : + "pathpayment|protocol version 23|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 23|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -43510,7 +47037,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 23|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -43518,7 +47045,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 22|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 23|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -43526,7 +47053,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 22|path payment destination is not authorized" : + "pathpayment|protocol version 23|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -43541,9 +47068,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 22|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 22|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 22|path payment destination line full" : + "pathpayment|protocol version 23|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 23|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 23|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43554,7 +47081,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 22|path payment destination line overflow" : + "pathpayment|protocol version 23|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43565,7 +47092,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 22|path payment destination path currency invalid" : + "pathpayment|protocol version 23|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43573,7 +47100,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -43600,7 +47127,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43628,7 +47155,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43656,7 +47183,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43685,7 +47212,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43714,7 +47241,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43743,7 +47270,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43772,7 +47299,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43801,7 +47328,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43830,7 +47357,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43883,9 +47410,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43938,9 +47465,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43993,9 +47520,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment not enough offers for first exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 23|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44019,7 +47546,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment not enough offers for last exchange" : + "pathpayment|protocol version 23|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44043,7 +47570,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 23|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44067,8 +47594,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 22|path payment over send max asset" : + "pathpayment|protocol version 23|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 23|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44077,7 +47604,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|path payment over send max with real path" : + "pathpayment|protocol version 23|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44101,7 +47628,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44130,7 +47657,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44159,7 +47686,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44188,7 +47715,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment rounding" : + "pathpayment|protocol version 23|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -44197,7 +47724,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -44208,7 +47735,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -44220,7 +47747,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 22|path payment send currency invalid" : + "pathpayment|protocol version 23|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44228,7 +47755,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment send max 0" : + "pathpayment|protocol version 23|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44236,7 +47763,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment send max negative" : + "pathpayment|protocol version 23|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44244,7 +47771,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment source does not have trustline" : + "pathpayment|protocol version 23|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -44252,7 +47779,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 22|path payment source is not authorized" : + "pathpayment|protocol version 23|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -44267,9 +47794,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 22|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 22|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 23|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 23|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44289,7 +47816,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44319,7 +47846,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 22|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 23|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44343,7 +47870,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44363,7 +47890,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44393,10 +47920,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 22|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 22|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 22|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 22|path payment with cycle" : + "pathpayment|protocol version 23|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 23|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 23|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 23|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -44624,7 +48151,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -44636,7 +48163,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -44648,13 +48175,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -44666,10 +48193,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 22|path payment with rounding errors" : + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 23|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -44681,7 +48208,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 22|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 23|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -44692,7 +48219,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -44711,7 +48238,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -44720,7 +48247,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -44729,7 +48256,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 23" : + "pathpayment|protocol version 24" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -45026,7 +48553,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45059,7 +48586,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45092,7 +48619,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45125,7 +48652,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45154,7 +48681,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45183,7 +48710,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45212,7 +48739,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 23|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 24|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -45220,12 +48747,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45366,13 +48893,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45513,13 +49040,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45660,13 +49187,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45807,13 +49334,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45954,13 +49481,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46101,13 +49628,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46248,13 +49775,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46395,13 +49922,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46542,15 +50069,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 23|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 23|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 23|issuer missing" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 24|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 24|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 24|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -46568,10 +50095,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 23|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 23|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 23|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 24|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 24|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 24|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 24|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -46587,7 +50114,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 23|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 24|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -46604,7 +50131,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46632,7 +50159,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46660,7 +50187,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46688,7 +50215,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46716,7 +50243,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46744,7 +50271,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46772,8 +50299,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 23|path payment asset with not enough funds" : + "pathpayment|protocol version 24|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 24|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -46783,7 +50310,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46806,7 +50333,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46828,7 +50355,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46851,7 +50378,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 23|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -46873,7 +50400,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 23|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46896,7 +50423,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 23|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46919,7 +50446,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 23|path payment destination amount 0" : + "pathpayment|protocol version 24|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -46927,7 +50454,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination amount negative" : + "pathpayment|protocol version 24|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -46935,7 +50462,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination currency invalid" : + "pathpayment|protocol version 24|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -46943,8 +50470,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 23|path payment destination does not have trustline" : + "pathpayment|protocol version 24|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 24|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -46953,7 +50480,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 24|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -46961,7 +50488,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 23|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 24|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -46969,7 +50496,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 23|path payment destination is not authorized" : + "pathpayment|protocol version 24|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -46984,9 +50511,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 23|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 23|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 23|path payment destination line full" : + "pathpayment|protocol version 24|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 24|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 24|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -46997,7 +50524,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 23|path payment destination line overflow" : + "pathpayment|protocol version 24|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47008,7 +50535,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 23|path payment destination path currency invalid" : + "pathpayment|protocol version 24|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47016,7 +50543,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -47043,7 +50570,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47071,7 +50598,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47099,7 +50626,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47128,7 +50655,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47157,7 +50684,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47186,7 +50713,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47215,7 +50742,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47244,7 +50771,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47273,7 +50800,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47326,9 +50853,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47381,9 +50908,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47436,9 +50963,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment not enough offers for first exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 24|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47462,7 +50989,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment not enough offers for last exchange" : + "pathpayment|protocol version 24|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47486,7 +51013,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 24|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47510,8 +51037,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 23|path payment over send max asset" : + "pathpayment|protocol version 24|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 24|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47520,7 +51047,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|path payment over send max with real path" : + "pathpayment|protocol version 24|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47544,7 +51071,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47573,7 +51100,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47602,7 +51129,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47631,7 +51158,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment rounding" : + "pathpayment|protocol version 24|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -47640,7 +51167,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -47651,7 +51178,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -47663,7 +51190,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 23|path payment send currency invalid" : + "pathpayment|protocol version 24|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47671,7 +51198,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment send max 0" : + "pathpayment|protocol version 24|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47679,7 +51206,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment send max negative" : + "pathpayment|protocol version 24|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47687,7 +51214,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment source does not have trustline" : + "pathpayment|protocol version 24|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -47695,7 +51222,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 23|path payment source is not authorized" : + "pathpayment|protocol version 24|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -47710,9 +51237,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 23|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 23|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 24|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 24|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47732,7 +51259,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47762,7 +51289,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 23|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 24|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47786,7 +51313,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47806,7 +51333,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47836,10 +51363,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 23|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 23|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 23|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 23|path payment with cycle" : + "pathpayment|protocol version 24|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 24|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 24|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 24|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -48067,7 +51594,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -48079,7 +51606,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -48091,13 +51618,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -48109,10 +51636,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 23|path payment with rounding errors" : + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 24|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -48124,7 +51651,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 23|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 24|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -48135,7 +51662,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -48154,7 +51681,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -48163,7 +51690,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -48172,7 +51699,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 24" : + "pathpayment|protocol version 25" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -48469,7 +51996,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48502,7 +52029,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48535,7 +52062,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48568,7 +52095,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48597,7 +52124,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48626,7 +52153,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48655,7 +52182,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 24|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 25|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -48663,12 +52190,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -48809,13 +52336,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -48956,13 +52483,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49103,13 +52630,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49250,13 +52777,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49397,13 +52924,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49544,13 +53071,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49691,13 +53218,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49838,13 +53365,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49985,15 +53512,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 24|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 24|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 24|issuer missing" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 25|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 25|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 25|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50011,10 +53538,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 24|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 24|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 24|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 25|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 25|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 25|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 25|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -50030,7 +53557,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 24|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 25|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -50047,7 +53574,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50075,7 +53602,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50103,7 +53630,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50131,7 +53658,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50159,7 +53686,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50187,7 +53714,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50215,8 +53742,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 24|path payment asset with not enough funds" : + "pathpayment|protocol version 25|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 25|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -50226,7 +53753,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50249,7 +53776,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50271,7 +53798,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50294,7 +53821,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 24|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -50316,7 +53843,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 24|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50339,7 +53866,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 24|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50362,7 +53889,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 24|path payment destination amount 0" : + "pathpayment|protocol version 25|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50370,7 +53897,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination amount negative" : + "pathpayment|protocol version 25|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50378,7 +53905,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination currency invalid" : + "pathpayment|protocol version 25|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50386,8 +53913,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 24|path payment destination does not have trustline" : + "pathpayment|protocol version 25|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 25|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -50396,7 +53923,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 25|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -50404,7 +53931,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 24|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 25|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -50412,7 +53939,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 24|path payment destination is not authorized" : + "pathpayment|protocol version 25|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -50427,9 +53954,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 24|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 24|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 24|path payment destination line full" : + "pathpayment|protocol version 25|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 25|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 25|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50440,7 +53967,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 24|path payment destination line overflow" : + "pathpayment|protocol version 25|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50451,7 +53978,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 24|path payment destination path currency invalid" : + "pathpayment|protocol version 25|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50459,7 +53986,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -50486,7 +54013,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50514,7 +54041,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50542,7 +54069,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50571,7 +54098,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50600,7 +54127,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50629,7 +54156,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50658,7 +54185,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50687,7 +54214,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50716,7 +54243,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50769,9 +54296,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50824,9 +54351,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50879,9 +54406,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment not enough offers for first exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 25|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50905,7 +54432,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment not enough offers for last exchange" : + "pathpayment|protocol version 25|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50929,7 +54456,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 25|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50953,8 +54480,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 24|path payment over send max asset" : + "pathpayment|protocol version 25|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 25|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50963,7 +54490,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|path payment over send max with real path" : + "pathpayment|protocol version 25|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50987,7 +54514,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51016,7 +54543,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51045,7 +54572,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51074,7 +54601,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment rounding" : + "pathpayment|protocol version 25|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -51083,7 +54610,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -51094,7 +54621,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -51106,7 +54633,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 24|path payment send currency invalid" : + "pathpayment|protocol version 25|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51114,7 +54641,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment send max 0" : + "pathpayment|protocol version 25|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51122,7 +54649,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment send max negative" : + "pathpayment|protocol version 25|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51130,7 +54657,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment source does not have trustline" : + "pathpayment|protocol version 25|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -51138,7 +54665,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 24|path payment source is not authorized" : + "pathpayment|protocol version 25|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -51153,9 +54680,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 24|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 24|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 25|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 25|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51175,7 +54702,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51205,7 +54732,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 24|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 25|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51229,7 +54756,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51249,7 +54776,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51279,10 +54806,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 24|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 24|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 24|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 24|path payment with cycle" : + "pathpayment|protocol version 25|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 25|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 25|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 25|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -51510,7 +55037,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -51522,7 +55049,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -51534,13 +55061,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -51552,10 +55079,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 24|path payment with rounding errors" : + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 25|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -51567,7 +55094,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 24|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 25|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -51578,7 +55105,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -51597,7 +55124,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -51606,7 +55133,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -51615,7 +55142,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 25" : + "pathpayment|protocol version 26" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -51912,7 +55439,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51945,7 +55472,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51978,7 +55505,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52011,7 +55538,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52040,7 +55567,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52069,7 +55596,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52098,7 +55625,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 25|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 26|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -52106,12 +55633,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52252,13 +55779,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52399,13 +55926,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52546,13 +56073,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52693,13 +56220,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52840,13 +56367,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52987,13 +56514,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53134,13 +56661,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53281,13 +56808,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53428,15 +56955,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 25|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 25|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 25|issuer missing" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 26|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 26|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 26|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53454,10 +56981,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 25|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 25|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 25|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 26|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 26|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 26|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 26|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -53473,7 +57000,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 25|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 26|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -53490,7 +57017,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53518,7 +57045,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53546,7 +57073,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53574,7 +57101,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53602,7 +57129,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53630,7 +57157,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53658,8 +57185,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 25|path payment asset with not enough funds" : + "pathpayment|protocol version 26|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 26|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -53669,7 +57196,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53692,7 +57219,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53714,7 +57241,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53737,7 +57264,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 25|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -53759,7 +57286,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 25|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53782,7 +57309,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 25|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53805,7 +57332,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 25|path payment destination amount 0" : + "pathpayment|protocol version 26|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53813,7 +57340,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination amount negative" : + "pathpayment|protocol version 26|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53821,7 +57348,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination currency invalid" : + "pathpayment|protocol version 26|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53829,8 +57356,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 25|path payment destination does not have trustline" : + "pathpayment|protocol version 26|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 26|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -53839,7 +57366,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 26|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -53847,7 +57374,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 25|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 26|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -53855,7 +57382,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 25|path payment destination is not authorized" : + "pathpayment|protocol version 26|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -53870,9 +57397,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 25|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 25|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 25|path payment destination line full" : + "pathpayment|protocol version 26|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 26|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 26|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53883,7 +57410,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 25|path payment destination line overflow" : + "pathpayment|protocol version 26|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53894,7 +57421,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 25|path payment destination path currency invalid" : + "pathpayment|protocol version 26|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53902,7 +57429,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -53929,7 +57456,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53957,7 +57484,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53985,7 +57512,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54014,7 +57541,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54043,7 +57570,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54072,7 +57599,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54101,7 +57628,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54130,7 +57657,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54159,7 +57686,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54212,9 +57739,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54267,9 +57794,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54322,9 +57849,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment not enough offers for first exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 26|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54348,7 +57875,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment not enough offers for last exchange" : + "pathpayment|protocol version 26|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54372,7 +57899,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 26|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54396,8 +57923,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 25|path payment over send max asset" : + "pathpayment|protocol version 26|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 26|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54406,7 +57933,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|path payment over send max with real path" : + "pathpayment|protocol version 26|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54430,7 +57957,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54459,7 +57986,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54488,7 +58015,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54517,7 +58044,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment rounding" : + "pathpayment|protocol version 26|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -54526,7 +58053,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -54537,7 +58064,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -54549,7 +58076,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 25|path payment send currency invalid" : + "pathpayment|protocol version 26|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54557,7 +58084,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment send max 0" : + "pathpayment|protocol version 26|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54565,7 +58092,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment send max negative" : + "pathpayment|protocol version 26|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54573,7 +58100,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment source does not have trustline" : + "pathpayment|protocol version 26|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -54581,7 +58108,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 25|path payment source is not authorized" : + "pathpayment|protocol version 26|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -54596,9 +58123,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 25|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 25|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 26|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 26|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54618,7 +58145,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54648,7 +58175,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 25|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 26|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54672,7 +58199,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54692,7 +58219,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54722,10 +58249,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 25|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 25|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 25|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 25|path payment with cycle" : + "pathpayment|protocol version 26|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 26|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 26|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 26|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -54953,7 +58480,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -54965,7 +58492,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -54977,13 +58504,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -54995,10 +58522,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 25|path payment with rounding errors" : + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 26|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -55010,7 +58537,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 25|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 26|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -55021,7 +58548,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -55040,7 +58567,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -55049,7 +58576,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", diff --git a/test-tx-meta-baseline-current/PaymentTests.json b/test-tx-meta-baseline-current/PaymentTests.json index ae33b24c1b..456c1fed7a 100644 --- a/test-tx-meta-baseline-current/PaymentTests.json +++ b/test-tx-meta-baseline-current/PaymentTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "payment fees|protocol version 0|fee bigger than base reserve|account has only base reserve + amount" : [ "Jpus0ofxyBI=" ], "payment fees|protocol version 0|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "EacgVbI3SOw=" ], @@ -320,6 +321,22 @@ "payment fees|protocol version 25|fee equal to base reserve|account has only base reserve + amount + two operation fees" : [ "JGz2t/DxcLU=", "zRL7G+5gJYk=" ], "payment fees|protocol version 25|fee equal to base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "Jw3Z92xHgg8=", "+WLExRDUCmI=" ], "payment fees|protocol version 25|fee equal to base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "IS0cY9nIFtY=", "wvRy8bfw32g=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount" : [ "q3/zp/7aAb4=", "ZfAoGox8KS8=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "B0rm1LiLOSE=", "oc5Rv5tx4wE=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "p0vDXXn59Z4=", "G5BNtHvQtJg=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "K3swMJqN/uY=", "KoWaqgQHvg8=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + one stroop" : [ "2imvjmW0wCo=", "faNUUcq+/EM=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + two operation fees" : [ "wf9j9yELBTE=", "p62oXeEtjOM=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "oxRlr8uSNE0=", "omoZrk93TvE=" ], + "payment fees|protocol version 26|fee bigger than base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "cuNEnYB0oc4=", "3al9Ctm1pRk=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount" : [ "gzMr0OZxB74=", "BFAFdoRRNIc=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + one operation fee" : [ "OfxKShDWHwE=", "0bKr2ssTJX4=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "57uffV9VFUY=", "iX/T1K4X36s=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "/Nwk+JsAnTw=", "KoWaqgQHvg8=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + one stroop" : [ "eMoL8WNsrJg=", "7kc23Ry2bNI=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees" : [ "JGz2t/DxcLU=", "zRL7G+5gJYk=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "Jw3Z92xHgg8=", "+WLExRDUCmI=" ], + "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "IS0cY9nIFtY=", "wvRy8bfw32g=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount" : [ "Jpus0ofxyBI=", "/lfj8xIFS8I=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "EacgVbI3SOw=", "/lfj8xIFS8I=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "bqpp59+loaQ=", "/lfj8xIFS8I=" ], @@ -7147,6 +7164,388 @@ ], "payment|protocol version 25|simple credit|with trust|positive" : [ "bKUZmcBO1tg=", "gtCbVkV9exo=" ], "payment|protocol version 25|two payments, first breaking second" : [ "Ju+ZDykdCWQ=", "epcXI1yMtYk=" ], + "payment|protocol version 26" : + [ + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=" + ], + "payment|protocol version 26|a pays b, then a merge into b" : [ "m1+68QRC2Tg=", "rx5wTRKMRs4=" ], + "payment|protocol version 26|a pays b, then b merge into a" : [ "m1+68QRC2Tg=", "oOnZBnE+60I=" ], + "payment|protocol version 26|authorize flag|allow trust" : + [ + "c9mvhBOUNvE=", + "WLjKq0CmxbU=", + "n2GJOUS40Vo=", + "B6S4xT9Nlvs=", + "vRXPUeXYwvc=", + "sBe9V81VQmw=", + "l1Ablm4+l6o=", + "Ox5hBpc9UJ8=", + "F4T5iMC/6oo=" + ], + "payment|protocol version 26|authorize flag|set trustline flags" : + [ + "c9mvhBOUNvE=", + "WLjKq0CmxbU=", + "n2GJOUS40Vo=", + "B6S4xT9Nlvs=", + "vRXPUeXYwvc=", + "sBe9V81VQmw=", + "l1Ablm4+l6o=", + "Ox5hBpc9UJ8=", + "F4T5iMC/6oo=" + ], + "payment|protocol version 26|create, merge, pay, 2 accounts" : [ "naV4nl/MgIc=", "DWIqWV2n2xY=" ], + "payment|protocol version 26|create, merge, pay, 3 accounts" : [ "naV4nl/MgIc=", "1PPnexnF9sE=" ], + "payment|protocol version 26|create, path payment, merge, create" : [ "naV4nl/MgIc=", "/oQD4VU6Ohk=", "deC1xmX9MLY=", "LbAOafWeECE=" ], + "payment|protocol version 26|dest amount too big for native asset" : [ "95EFmz1GWuM=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount" : [ "raRiau4GtC8=", "dt73AIBswNY=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + one operation fee" : [ "n8tkNypnaMg=", "iUH3ksLBVmo=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "t1eeSmveoRg=", "sC9CkUiuy8Y=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "FNViLerTe3g=", "OKyxJn9aXzA=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + one stroop" : [ "40feS1pePg4=", "PSpURk5ot0w=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + two operation fees" : [ "NeCSUQw6zNc=", "NhBodSWwcBw=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "cDTfAe8jeFc=", "pXkjHv7ikZU=" ], + "payment|protocol version 26|fee less than base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "v3B4nYITC8o=", "HvQKxTSh6/k=" ], + "payment|protocol version 26|issuer large amounts" : [ "qt90FYP+Ga4=", "0D6Ykz8nEjE=", "qoU8AcAeK88=" ], + "payment|protocol version 26|liabilities|cannot pay balance below selling liabilities" : + [ + "JstZFvMduYU=", + "qceRple+m8c=", + "fSh0o2YIofo=", + "WLMAn11AhMI=", + "T2t/Mu59EHw=" + ], + "payment|protocol version 26|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "ou8rkQWJVnc=", "oF3yDi4fV8o=", "WmglBV4ZVCk=", "5gE6LJnF0h8=" ], + "payment|protocol version 26|merge then send" : [ "Z4buC823qiw=", "VmO2z+TEXAA=" ], + "payment|protocol version 26|pay self multiple, merge, pay self multiple, merge" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "5RNsiKELy84=" ], + "payment|protocol version 26|pay self, merge, pay self, merge" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "8bwhpO8KSVM=" ], + "payment|protocol version 26|pay, merge, create, pay, 2 accounts" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "+ZYG+GYTQDY=" ], + "payment|protocol version 26|pay, merge, create, pay, 3 accounts" : [ "naV4nl/MgIc=", "WLFQpNHVL+E=", "0J0xIMgdNxQ=", "m19BeodhWIA=" ], + "payment|protocol version 26|pay, merge, create, pay, self" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "r6Q2hqplZ+g=" ], + "payment|protocol version 26|rescue account (was below reserve)" : [ "aWxrB7B6fkY=", "mGNtvLIASQM=", "/fEYrEFMlTM=", "+q7qLxOucFQ=" ], + "payment|protocol version 26|send XLM to a new account (no destination)" : [ "95EFmz1GWuM=" ], + "payment|protocol version 26|send XLM to an existing account" : [ "LGfPJYRTA1Y=" ], + "payment|protocol version 26|send to self" : + [ + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=" + ], + "payment|protocol version 26|send to self|existing asset|with trustline and 0 balance|all" : [ "2T73pqf9GWA=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and 0 balance|few" : [ "2T73pqf9GWA=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and 0 balance|more than have" : [ "isaFxIN1Xgs=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and full balance" : [ "l275dHlYCCE=", "l275dHlYCCE=", "l275dHlYCCE=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and full balance|all" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and full balance|few" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and full balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and half balance" : [ "H//xSF3xQFA=", "H//xSF3xQFA=", "H//xSF3xQFA=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and half balance|few" : [ "R9nGr2KiyiY=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and half balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|existing asset|with trustline and half balance|to full" : [ "R9nGr2KiyiY=" ], + "payment|protocol version 26|send to self|existing asset|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 26|send to self|native|all" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 26|send to self|native|few" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 26|send to self|native|more than have" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and 0 balance|all" : [ "VpNOmJNnQT8=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and 0 balance|few" : [ "VpNOmJNnQT8=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and 0 balance|more than have" : [ "isaFxIN1Xgs=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and full balance" : [ "YKWKdH0Wdk4=", "YKWKdH0Wdk4=", "YKWKdH0Wdk4=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and full balance|all" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and full balance|few" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and full balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and half balance" : [ "Ou5LEV8yKfE=", "Ou5LEV8yKfE=", "Ou5LEV8yKfE=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and half balance|few" : [ "ZIsSzUSVUsc=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and half balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|with trustline and half balance|to full" : [ "ZIsSzUSVUsc=" ], + "payment|protocol version 26|send to self|non existing asset with existing issuer|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 26|send to self|non existing asset with non existing issuer|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 26|simple credit|credit payment with no trust" : [ "NT543EOisA0=" ], + "payment|protocol version 26|simple credit|credit sent to new account (no account error)" : [ "NT543EOisA0=" ], + "payment|protocol version 26|simple credit|with trust" : + [ + "/OuFsOyH6MY=", + "aNN2SDyyEtA=", + "2vKWR6o1LZQ=", + "qTJMaYAHDWQ=", + "/OuFsOyH6MY=", + "aNN2SDyyEtA=", + "2vKWR6o1LZQ=", + "qTJMaYAHDWQ=" + ], + "payment|protocol version 26|simple credit|with trust|missing issuer" : + [ + "iEy5GXPp3yc=", + "wHUDt9yaOdg=", + "/A1Xm+ny/XE=", + "73FOjzOqDVY=", + "Ddfys59hUjs=", + "Emow+z2V6bA=" + ], + "payment|protocol version 26|simple credit|with trust|positive" : [ "bKUZmcBO1tg=", "gtCbVkV9exo=" ], + "payment|protocol version 26|two payments, first breaking second" : [ "Ju+ZDykdCWQ=", "epcXI1yMtYk=" ], "payment|protocol version 2|a pays b, then a merge into b" : [ "tC1VsNNRT18=", "6Cm6IY7Goqo=" ], "payment|protocol version 2|a pays b, then b merge into a" : [ "tC1VsNNRT18=", "L64XLnXWjLE=" ], "payment|protocol version 2|authorize flag|allow trust" : diff --git a/test-tx-meta-baseline-current/RevokeSponsorshipTests.json b/test-tx-meta-baseline-current/RevokeSponsorshipTests.json index 18d4eda6c2..7e9b3cd2fc 100644 --- a/test-tx-meta-baseline-current/RevokeSponsorshipTests.json +++ b/test-tx-meta-baseline-current/RevokeSponsorshipTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "update sponsorship|protocol version 0|invalid input" : [ "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=" ], "update sponsorship|protocol version 0|invalid input|invalid trustline keys" : [ "dhe5iAdbDEg=" ], @@ -1918,6 +1919,152 @@ "VoNeHRgk3eM=", "nIhC52Lbz8o=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is not sponsored|account" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is not sponsored|claimable balances" : [ "ZHO0Ty522ik=", "9jD/76gvgHA=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is not sponsored|signer" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is not sponsored|trust line" : [ "ZHO0Ty522ik=", "tp9bf87W3+E=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is sponsored|account" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is sponsored|claimable balances" : [ "ZHO0Ty522ik=", "9jD/76gvgHA=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is sponsored|signer|Account has sponsored entry" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is sponsored|signer|Signer is the only sponsorship" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 26|entry is not sponsored|account is sponsored|trust line" : [ "ZHO0Ty522ik=", "tp9bf87W3+E=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is not sponsored|claimable balance" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is not sponsored|signer" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is not sponsored|trust line" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored by owner|data" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored by owner|offer" : [ "iiBSGUxILOM=", "reBx4fl00xc=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored by owner|signer" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored by owner|trustline" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|account" : [ "Dzl6tPYEaWw=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|claimable balances" : [ "Xf8jX4ueNlI=", "t/RCwcdWVC0=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|data" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|offer" : [ "iiBSGUxILOM=", "jxJYa1+40zo=", "lXTeqFSzUZ8=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|signer" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 26|entry is sponsored|sponsor is sponsored|trust line" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 26|failure tests|does not exist" : [ "gZL35fBE+jQ=", "gZL35fBE+jQ=", "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 26|failure tests|does not exist|use wrong account in offer key" : [ "GtcpZSUR8oA=", "LC36lyiP88E=", "nYKfP0C0oLo=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|entry|establish sponsorship" : [ "ZHO0Ty522ik=", "jmMblF7JHy0=", "cHRf3uEyjdw=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|entry|remove sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|entry|transfer sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|signer|establish sponsorship" : [ "ZHO0Ty522ik=", "jmMblF7JHy0=", "ARnfUOdVgag=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|signer|remove sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 26|failure tests|low reserve|signer|transfer sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 26|failure tests|not sponsor" : + [ + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=" + ], + "update sponsorship|protocol version 26|failure tests|not sponsor|entry is not sponsored. transfer from wrong source account" : [ "cHRf3uEyjdw=" ], + "update sponsorship|protocol version 26|failure tests|not sponsor|signer is not sponsored. transfer from wrong source account" : [ "ARnfUOdVgag=" ], + "update sponsorship|protocol version 26|invalid input" : + [ + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=" + ], + "update sponsorship|protocol version 26|invalid input|invalid trustline keys" : [ "hqZi03haQ3Q=" ], + "update sponsorship|protocol version 26|too many sponsoring" : + [ + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=" + ], + "update sponsorship|protocol version 26|too many sponsoring|account" : + [ + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=" + ], + "update sponsorship|protocol version 26|too many sponsoring|claimable balance" : + [ + "6L27Lp20ZYw=", + "C4THWNZavJg=", + "6L27Lp20ZYw=", + "C4THWNZavJg=", + "6L27Lp20ZYw=", + "C4THWNZavJg=" + ], + "update sponsorship|protocol version 26|too many sponsoring|pool share trustline" : + [ + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=" + ], + "update sponsorship|protocol version 26|too many sponsoring|signer" : + [ + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=", + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=", + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=" + ], + "update sponsorship|protocol version 26|too many sponsoring|trustline" : + [ + "VoNeHRgk3eM=", + "nIhC52Lbz8o=", + "VoNeHRgk3eM=", + "nIhC52Lbz8o=", + "VoNeHRgk3eM=", + "nIhC52Lbz8o=" + ], "update sponsorship|protocol version 2|invalid input" : [ "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=" ], "update sponsorship|protocol version 2|invalid input|invalid trustline keys" : [ "dhe5iAdbDEg=" ], "update sponsorship|protocol version 2|too many sponsoring" : diff --git a/test-tx-meta-baseline-current/SetOptionsTests.json b/test-tx-meta-baseline-current/SetOptionsTests.json index cb167bfe1f..56f6389f70 100644 --- a/test-tx-meta-baseline-current/SetOptionsTests.json +++ b/test-tx-meta-baseline-current/SetOptionsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "set options|protocol version 0" : [ @@ -475,93 +476,93 @@ "set options|protocol version 14|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 14|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 14|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 14|Signers|add signer with native selling liabilities" : @@ -657,93 +658,93 @@ "set options|protocol version 15|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 15|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 15|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 15|Signers|add signer with native selling liabilities" : @@ -839,93 +840,93 @@ "set options|protocol version 16|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 16|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 16|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 16|Signers|add signer with native selling liabilities" : @@ -1021,93 +1022,93 @@ "set options|protocol version 17|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 17|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 17|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 17|Signers|add signer with native selling liabilities" : @@ -1203,93 +1204,93 @@ "set options|protocol version 18|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 18|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 18|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 18|Signers|add signer with native selling liabilities" : @@ -1385,93 +1386,93 @@ "set options|protocol version 19|Home domain|invalid home domain" : [ "Shl7NaoFTc0=", "fvNf/7V36Fs=", "yFo0SoiYtpk=" ], "set options|protocol version 19|Signers|add and remove many signers, some with sponsorships" : [ - "cBgcUxh3yQg=", - "a3zVSwp0Iz4=", - "Nljph82RHMs=", - "CMmVvy7j7YM=", - "05a+/VRN6jE=", - "gKk9KQtzXKk=", - "H8GDYiRe9y4=", - "1I6BF+w5zig=", - "rPTOUeB9k6M=", - "xaoNdJ0eZkc=", - "6YruXF+6f+A=", - "xqe03Fxstec=", - "Bcoh7HOw3ic=", - "eOQktpM+m4k=", - "DY1dCPtICOc=", - "PDuOOH7pOw4=", - "TloO7UoSApQ=", - "xCFRbCVUQAQ=", - "wkmz9HEW2tA=", - "m55EhMN3k28=", - "kdrU/cS52nI=", - "EibPux1X84M=", - "rOJcf/ZS9WQ=", - "0hl4BmRH7Lw=", - "5oYX7QXeZAc=", - "zXph6yj8mfM=", - "H9GlqmUFsMU=", - "/igrKKjYN8E=", - "CqyF1TBpAkE=", - "g5yuPQaT+h8=", - "A6ozifowfCQ=", - "7+bmEtTgKko=", - "J9Ybh2MfcTI=", - "CyiYD0u/8BY=", - "I+FxrTpq/bI=", - "Jv/guCSD6eA=", - "9DhXHK0pBWQ=", - "WVbegPNoARQ=", - "XV4WnP3coGc=", - "88AIwm2jfL8=", - "kP0ka488L3o=", - "/W6FvWbWrUU=", - "dpT24aQdAmA=", - "dWypu2mD40I=", - "CVBEQ6iQu8Q=", - "o2qLJVZuvAo=", - "PCisexo0n8s=", - "mGJ9roVItLE=", - "CMsmL0yFJ9E=", - "vOWaRIYokZc=", - "7zLTAjH8pCg=", - "wY/z6AjoCT8=", - "4cV922wKuW0=", - "EpIiY8Sd6Yo=", - "YJsMcjisVFc=", - "8S6uyuvRj7g=", - "D4fxY1d1PvE=", - "wVFh8bt4M9M=", - "/xeH7SX2o7Y=", - "Ut1BH509+pQ=", - "6u7AWfAiMqY=", - "EEihYpVJFes=", - "ZQI6yAOP3dg=", - "HCV4YSDv/Tw=", - "gSAxy3BtUfw=", - "bQgwpFCzYAQ=", - "QryjX4XFonQ=", - "wWlzl6p4J8A=", - "howuUyzg9SY=", - "8dbgCa+K/Fs=", - "ViHG5BnWhhg=", - "KXp514sHKRc=", - "TNIxg9FMREs=", - "pQxMIbhVqBM=", - "a4Uq855Lgas=", - "0TP6Pdgv8BU=", - "MIUOJcHqo9s=", - "CHpw+OIKBNc=", - "/oNxztEXdiM=", - "qCSP/hxx6ls=", - "texUvlpaenM=", - "YjUkM5LeesM=", - "V074XhBNxaY=", - "HGnzzLd+Gmg=", - "AM9z3ThGft4=", - "DP5XYukcg+A=", - "Q87zELhjtdQ=" + "wkZI0XRR/5U=", + "m9cDn14Yw4c=", + "ZT98KZxsthY=", + "l+NHz1Eq7ts=", + "LAE+YjLNIgg=", + "W4yNDXmEdAg=", + "bUc2LMBI2Gw=", + "TUwUBNic3Y8=", + "Zrj0Z47JdpU=", + "wGeb1bcqUd4=", + "0VIWGYPg6Qk=", + "3MX8lB+YPCA=", + "ihDrH2oTJZ8=", + "CQm3izCHndo=", + "rUK+scISbu4=", + "geoKkqElwuY=", + "+s9uOctc7Ls=", + "RJRFcN7rJN8=", + "zfNHFLJ0YWY=", + "/ULHyM9hCD8=", + "7Rx4TCe6Y/4=", + "BqtBFaYHFCU=", + "ICNf+6WTsAw=", + "c+4vRmC+Y34=", + "t0j3n2jvIuY=", + "+JxVibZSKLs=", + "a5tuTpUIGkI=", + "OuWbhWRGWIo=", + "5jIeOSNWqTs=", + "r0rUzMbLka0=", + "37rkqcpKpPY=", + "c37+vxARTAA=", + "k3VoECE4/wY=", + "2dPIME2q6dg=", + "N5aRkvRbFzI=", + "/hvbVSIKlSw=", + "AXes7jA7u8A=", + "oUCaMGD7b30=", + "dKH2xTQHZpw=", + "/kPZYmNxcpo=", + "FbubjZVVF3Q=", + "UH363xUWcXo=", + "vQHYTvFp+kw=", + "xTK5sbisx8o=", + "fczWYFK9mm0=", + "ueo6aOAJF7k=", + "gXxdKdCX+WU=", + "dIWEwI65v2k=", + "DNLQD2EJp7Q=", + "ZBadD+YgUX8=", + "d3ACLKtNM/U=", + "mhHcndvYVxY=", + "sm6MqAc7QLQ=", + "4i7wWOw8npk=", + "NEG5R4KSyKs=", + "ljuuKnyG808=", + "9qXUpT4sHNE=", + "nWCf+gyOGHg=", + "HKvP+3wDHdE=", + "BSESc4i9vrc=", + "KHsI8OWVUnM=", + "JyWExLsTpCo=", + "UFaxNwy+VrE=", + "eTU1zz02hSo=", + "81TE2yM7+Nw=", + "6NbGokLYzaI=", + "Q1hXgAmr/eo=", + "Q1aPEaLTDSg=", + "QS1sCGWvD00=", + "FOpEondlLjM=", + "G78goIpdxBo=", + "XICuJ/4utlE=", + "k3cM8X5iO9A=", + "JpR51lydFo0=", + "2EdjBgYw12A=", + "ONqybRLDRhI=", + "Kf4xvMleIqI=", + "BXvkmqaEUi4=", + "Nc6KwU0VXy0=", + "sUCjOoCwdH4=", + "/dwguJtBmqY=", + "4E27hjouWPo=", + "CeVKWfhprDI=", + "kumWPNI5f9Y=", + "KfvtpURk+SU=", + "OQnJGrrGw2U=", + "YNTJ1xAoNkE=" ], "set options|protocol version 19|Signers|add signer with native buying liabilities" : [ "xKIlhkQFJi8=", "0RuDDzFLEjk=", "x97I1IDbHmc=" ], "set options|protocol version 19|Signers|add signer with native selling liabilities" : @@ -1650,93 +1651,93 @@ "set options|protocol version 20|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 20|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 20|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 20|Signers|add signer with native selling liabilities" : @@ -1832,93 +1833,93 @@ "set options|protocol version 21|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 21|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 21|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 21|Signers|add signer with native selling liabilities" : @@ -2014,93 +2015,93 @@ "set options|protocol version 22|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 22|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 22|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 22|Signers|add signer with native selling liabilities" : @@ -2196,93 +2197,93 @@ "set options|protocol version 23|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 23|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 23|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 23|Signers|add signer with native selling liabilities" : @@ -2378,93 +2379,93 @@ "set options|protocol version 24|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 24|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 24|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 24|Signers|add signer with native selling liabilities" : @@ -2560,93 +2561,93 @@ "set options|protocol version 25|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 25|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 25|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 25|Signers|add signer with native selling liabilities" : @@ -2714,6 +2715,188 @@ "sZB1gOsKLU8=", "BC5Hqoi5njs=" ], + "set options|protocol version 26" : + [ + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=" + ], + "set options|protocol version 26|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], + "set options|protocol version 26|Signers|add and remove many signers, some with sponsorships" : + [ + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" + ], + "set options|protocol version 26|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], + "set options|protocol version 26|Signers|add signer with native selling liabilities" : + [ + "JrVdj6y1nKM=", + "g+/6K99/PJs=", + "iCYVXgg/1Pg=", + "5WROxK1ahyw=", + "BmZ01/HiAyc=" + ], + "set options|protocol version 26|Signers|bad thresholds" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], + "set options|protocol version 26|Signers|bad weight for master key" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 26|Signers|can't use master key as alternate signer" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 26|Signers|delete signer that does not exist with sponsorships" : [ "W208TQVIdRo=" ], + "set options|protocol version 26|Signers|ed25519 payload signer" : [ "VxTAsnbLZbs=", "T9mx9lDloRM=", "x+fNMotRL48=" ], + "set options|protocol version 26|Signers|insufficient balance" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 26|Signers|invalid signer weight" : [ "IlJmI6NdhFY=", "g0ZY1hAp5wM=" ], + "set options|protocol version 26|Signers|non-account signers" : + [ + "IlJmI6NdhFY=", + "PPbzSmsUMmQ=", + "thVIFDxxwaQ=", + "O7fGV7QGyZE=", + "Vngbfq7F1Ok=", + "jTlH7XcNal4=", + "cHSIcNgKNbs=", + "4l9+EcIePiw=", + "EcoqKtoLRP8=" + ], + "set options|protocol version 26|Signers|sponsorship" : [ "/SbCXgTKxGc=", "1Br7yhIxvB8=", "/SbCXgTKxGc=", "1Br7yhIxvB8=" ], + "set options|protocol version 26|Signers|sponsorship|create, modify, and remove sponsored entry" : [ "4qp9yUQYmhA=" ], + "set options|protocol version 26|Signers|too many signers" : + [ + "noY2hJhjCAo=", + "o0VtuySuv24=", + "Ebyzq3Wkcxs=", + "zSKipHBBdlo=", + "70sYuEqKweA=", + "7ultcFvqowE=", + "sF1B736civc=", + "tiBvcVBRXK8=", + "ALDy6cGfURc=", + "UoFwJ+oAnIg=", + "/DcsUU9YCfw=", + "h14R+sNsbks=", + "SIRrRM1UkRY=", + "3YmVLqxgj7M=", + "mF+urbDuKX0=", + "mfAeJEb/7cw=", + "fSXCUZoM7OA=", + "XPq2MnMjnoA=", + "+CZqxHeT7jk=", + "eF3tCVSNM2Y=", + "m+HUczXhuxc=" + ], + "set options|protocol version 26|Signers|too many subentries" : [ "mBYpf3mLbj4=", "mBYpf3mLbj4=" ], + "set options|protocol version 26|flags|Can't set and clear same flag" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 26|flags|auth flags" : + [ + "tfheUCYuwek=", + "cefLKvIy7N0=", + "jBdHV6Yb6sI=", + "25XqA1RSriI=", + "ekQxvYmNXZE=", + "sZB1gOsKLU8=", + "BC5Hqoi5njs=" + ], "set options|protocol version 2|Home domain|invalid home domain" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "set options|protocol version 2|Signers|add signer with native buying liabilities" : [ "7mDTyBusMEE=", "F4XfmmSvUyo=", "LjJWBJ6wR7U=" ], "set options|protocol version 2|Signers|add signer with native selling liabilities" : [ "7mDTyBusMEE=", "44U+GUCwrJk=", "LjJWBJ6wR7U=" ], diff --git a/test-tx-meta-baseline-current/SetTrustLineFlagsTests.json b/test-tx-meta-baseline-current/SetTrustLineFlagsTests.json index 365733784c..48cf8c5f99 100644 --- a/test-tx-meta-baseline-current/SetTrustLineFlagsTests.json +++ b/test-tx-meta-baseline-current/SetTrustLineFlagsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,40 @@ 22, 23, 24, - 25 + 25, + 26 + ], + "pool share revocation order test" : + [ + "ITpXqgpFF30=", + "P/rIn0NE8KY=", + "Tojg9R7gBpM=", + "YgrarXvtOc0=", + "Oj9LBplreFw=", + "jdV8bqSB+kA=", + "1lANyk2+auQ=", + "G+odnbpOIBo=", + "/+f4FqaRf+w=", + "QX/0q46LfOs=", + "PkFEyR91lwo=" + ], + "revocation result test across validators" : + [ + "ITpXqgpFF30=", + "VFR450IniRs=", + "okqR49cN7bM=", + "F30nsE+N5Nw=", + "nv+Wtmu81bY=", + "xXsiKwwgZSo=", + "mtSookiDIPU=", + "SEbZg3F2KoY=", + "3JuuCrkQesY=", + "yZrAMi3U7SI=", + "a6XJOk4UdxE=", + "rfqX5FTFGEs=", + "qf1MdsvxjP8=", + "hPrRx7g/dzY=", + "e3wU9pYJIso=" ], "revoke from pool|protocol version 0" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 1" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], @@ -19283,6 +19316,2411 @@ "QWIGOaGw8v0=", "Qb7/3qR5hoo=" ], + "revoke from pool|protocol version 26" : + [ + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - both non-native|pool is deleted" : + [ + "3BNOJlzsung=", + "qnW43+iAjUc=", + "L7yAI/+I8U4=", + "sZ4Auj/tiBE=", + "Xh6mxPLJw1U=", + "7ZFgf+AIkns=", + "c9iaWJd2uI0=", + "qjrDI0KFknA=", + "zCvjFvGl73w=", + "rHcNANiCuPE=", + "mwi+gGFGQ08=", + "gy/qpbX/PeE=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - both non-native|pool still exists" : + [ + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "ea/g8lcJPAs=", + "ujC00Pr/5yo=", + "3nQM4ZJgqWk=", + "C/p1gpvQBYI=", + "5XszkOyxn3A=", + "S7LPyZ5CEXs=", + "UNlpWLs8m9Y=", + "qmjLhizAjTc=", + "exQ7xKEnaW0=", + "t8tNIRPirOc=", + "ZTp7H67E5hQ=", + "G5rVvX1mI88=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - one non-native" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - one non-native|pool is deleted" : + [ + "x/MgwJ+FwD8=", + "GkRkl1HHX8A=", + "DALmy1BuYqw=", + "cR3FuNXBgJk=", + "/n9cCQ8ebY4=", + "MlI0a3ixUxs=", + "NtVrNYQWVSk=", + "ff/JtZQNcpc=", + "2W7mD2l2qf0=", + "cZTxmjbj2dI=", + "svta6YdqdOQ=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claim - one non-native|pool still exists" : + [ + "xygGFb0+baM=", + "P9kM3O+K94Y=", + "ZuUGd+7kcaQ=", + "dfKq7c3dWfg=", + "bvZnC2+ePHk=", + "SGu/Mnwk/YM=", + "Yt1fnvDoDY8=", + "+w+nKs4P4CA=", + "HG1f3RqEvns=", + "kXGvUIy/fx0=", + "w/RmOUlRw1M=", + "C0Z9eKG6JQs=", + "Iit2+K+wvVw=", + "SjuWIN5aIzs=", + "ipTKhVpqQbA=", + "ike8886Uhpk=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claimable balance created for issuer|assetA issuer" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "xeV5F90ykR8=", + "+gwXWxx6a8E=", + "Q3VaJoeQgrM=", + "GkRkl1HHX8A=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "xbomjYJ6A2U=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|claimable balance created for issuer|assetB issuer" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "9XqiTtI/0YI=", + "nzW1CVCl0B8=", + "kAerL8wvs90=", + "++SukBbWVBA=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "fwh19zAt3n8=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - both non-native" : + [ + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=", + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - both non-native|pool is deleted" : + [ + "eqURmTshdoU=", + "ESZkLAlpgGE=", + "+Bo0oXoOnMU=", + "uKuNz7HZgjQ=", + "btR9vAI/zsc=", + "r2igwYQDMHM=", + "tM3vXW40Q8E=", + "BXCQCqkzdF0=", + "Fnm5vNgFyGs=", + "2fux4pfF0FE=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - both non-native|pool still exists" : + [ + "kqY4X4f3i0E=", + "1QFpACchEy8=", + "4gEAox7FUtY=", + "mebbBvaYLCA=", + "FBTDoyYT8u8=", + "h/a3yw489GA=", + "OIusLgy02ac=", + "fNCQD9diZeg=", + "UXTsQO+GrEw=", + "DR1sbtRrrcM=", + "A2M5W4+l7UM=", + "ZegnzK0j+NI=", + "1xAXCqHiJUw=", + "S0xJyU6ViCQ=", + "2LDC4yG1/gg=", + "xjtLQ3CObTQ=", + "q7n/2scovxw=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - one non-native" : + [ + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=", + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - one non-native|pool is deleted" : + [ + "hM7lug967E0=", + "YhZSf19ZWzQ=", + "bhm+jxhljCY=", + "iWid/HPeM7w=", + "Tbd3yPekrgA=", + "S1zE4ydM1ao=", + "bWkGVFtqrAY=", + "vA2H+q7Kots=", + "kxBE01p1e38=", + "jyZhoxv1E6I=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|clawback - one non-native|pool still exists" : + [ + "AsniooyAj+k=", + "1dWjW5Jt2HA=", + "JqEiAta7RkI=", + "cQgdvFIOsEk=", + "yS9EyeunPig=", + "KSVoJgepZtA=", + "qy/K06HJxVU=", + "4x8VKaJth7w=", + "A7exKodqy2U=", + "/A+InlbfNp4=", + "XzyRgKH48lw=", + "tfDkX4p6dcw=", + "esNzPAUBlGI=", + "iHASW18z/04=", + "OIu0vnRDR8s=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke from 0 balance pool share trustline" : + [ + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "WA9JJNEjQMU=", + "odq2qvS+iIA=", + "ttzUOsaIBoY=", + "T1l2IU6VtHs=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke from multiple pools" : + [ + "Ej15sgZwk/8=", + "KtpHKUDsWbI=", + "l184XIgBAeE=", + "aTJgLxdwiYQ=", + "EPrCWsfgUqQ=", + "PN4+M90+aQM=", + "85qdD7cFGhQ=", + "BiRdX2k8dEM=", + "Sk0EDDMZXw8=", + "ZD/jdFRjVDg=", + "U8CwBSWmPZk=", + "W+d8+NS8Jfc=", + "5fJsNj+wspk=", + "xIYUXCsPK1A=", + "MFLO5qYoyBY=", + "+Q7AS5LR51g=", + "ZmmFXqrv0bY=", + "uB+5xHHbH2w=", + "aX12TR4j4Do=", + "lMyQHwrJTME=", + "8C52RDeJj/8=", + "qbPZ3uodwe8=", + "Ptul7KLdH+0=", + "CSeIxSRpl9o=", + "vFlZEj0C850=", + "m5jFVGrb8cQ=", + "g1PXQB9Zx/Y=", + "9rrsJjz/Q/g=", + "pf13WPD7hJ8=", + "ZHH+blVwuqM=", + "O2lIZBnDEs4=", + "qOcYlhFOt+A=", + "uetGYsCSoqw=", + "+q9gVrbbK9s=", + "3oBkrVAW6JE=", + "bUaD8AiapZI=", + "oKxx1HmCAXs=", + "SSGQDGKjooU=", + "IMeeZpumd8o=", + "UTxbpWCYsII=", + "RiiZy7X+/uk=", + "h7sutwR1TZY=", + "cR7uve/Pf7M=", + "ToKeBOH1z8U=", + "pHLCgtrtv3A=", + "5ylJKrYNfCw=", + "U8UZDNdrMxE=", + "NNQ7z36o5/0=", + "T/CYSuGEyus=", + "oKAS0SQVrg0=", + "lLvUEgo6tUo=", + "eTVipZ/xyuQ=", + "40A1PdpTnVo=", + "IKWEFkebeIE=", + "+n1HcViSGsw=", + "Q+YBbcY/Aac=", + "X15b10a2f3I=", + "KPPVnmRMk8Q=", + "0dKi+WsNoVc=", + "1GYJFcKvENQ=", + "nmeJQccgYQ4=", + "65v6wdoXexU=", + "MF9XJBBANIQ=", + "S9RevQNqoaQ=", + "SdA/GSOdOrw=", + "gsfsaXClo5U=", + "+2z83VJwktk=", + "8rOo2BIewg4=", + "sT3sHJ3+Lko=", + "0+sTbu+Dv2s=", + "uXZYrB/+zQY=", + "51QnpTZc2R4=", + "/9eNWvcM36o=", + "CRWKXHjMuhw=", + "+ysW91msOdg=", + "MEwUvQR96M0=", + "OsQ2P4F8GBE=", + "GRrYXNGRsWQ=", + "fVHextyz4+g=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetA" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "1U8pMfUIgTw=", + "cu6yCQSH2Qk=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "Fp0/G4TdTb0=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "wVupFjRjvsU=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetB" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "JXJZG8Yos7U=", + "Sp3J20yyJkQ=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "ZrrEiEZr8JU=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "NWvh+/5OvyI=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|one non-native - revoke assetB" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "ASwh0YJ3ty0=", + "J2v8GZ8XIV4=", + "fofvQf14MqQ=", + "FcFgNF79nwM=", + "r7CX3cwTZgI=", + "VjF8n3KSevI=", + "bXkN4v07Rwk=", + "ebZgGYgrQ/0=", + "XNrDtfNgwnc=", + "ygRGrcjJM7g=", + "4KonIE5uxog=", + "cfJEY2CYzDs=", + "kRNrjY6VaVI=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetA" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "9sRqqiKFjeg=", + "B7xUZpLBWDA=", + "xygGFb0+baM=", + "24B7JaVOxbY=", + "SKbMVA6we1g=", + "V0k3rbgNntU=", + "pFNB3NuLX+Q=", + "PMtSlH6DtTA=", + "jx2RoC3YtGE=", + "4Rul+L0t+WE=", + "pxddiin/7b4=", + "N6nk3weoJZA=", + "/hzINuVMx3g=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetB" : + [ + "tywh5+xR0v4=", + "CMvxm6vFvHA=", + "u+Yx++9iq2M=", + "Ad8vXXB9jT0=", + "xygGFb0+baM=", + "e6lcyfaPHIk=", + "JvSvLLTxhJU=", + "LKG0yNbBLeA=", + "/E7bu7ZOnLs=", + "1urk252ChO8=", + "IKVWLXL0+aQ=", + "0S2DV4bLyxo=", + "dcoNQcL6NQw=", + "r/aZey5P0qY=", + "j//DKCUkd54=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "jYF0uW2lDQg=", + "fLcqUde/eO4=", + "yZ3vVlhJE2M=", + "G4tPSEpVnmY=", + "+3Pff4UHyXQ=", + "4KSZaOMrK/s=", + "esb/9o1Ith8=", + "xrQrY/JYbcM=", + "MbOykBvt7FI=", + "YO3GW0Sz64E=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "nch4XDckfm8=", + "BiilzEGKpP4=", + "Y4fg/mICYmA=", + "8MK/LTYK9Dg=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "oj+ok3E7epw=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "KtBN8wbHttk=", + "XPU0Mu8Oo5Q=", + "9+oSpEq6C74=", + "Ut1PP2aMiY4=", + "erukIeNz9h8=", + "XlBeTbG00jk=", + "Y/vlzR2ox5I=", + "n4X/+8hl0Vc=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "6oXlTNs8wn4=", + "ooSzGlVyZOw=", + "jobDkOlDdOk=", + "XFPIMsO2cFU=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "TYABVzPOqvI=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships" : + [ + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Qxb1bSRHPSs=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "87KmiTyC60g=", + "ueaGBgDmnoM=", + "RpUgNVMFrpU=", + "t2JqvrD0xm4=", + "q9ueNpUSruY=", + "Out6Rxu9isY=", + "Hf0BAdxLncQ=", + "77f5MjdHBWg=", + "/fz8AKyNiRM=", + "jD2s+hxb8ME=", + "K0IcWpTufj8=", + "WAiS4mMoTmk=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - no sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "vVrAhaWRbPw=", + "RC0QjlyzzBI=", + "6k47iVDdHhQ=", + "8TEkMta+Ugs=", + "mOqcAnU8Yto=", + "8Riq56qqxMY=", + "/yMbdlqdqdQ=", + "1QopmuAd0uo=", + "g+hYkj6vFk8=", + "+cRUnRTLolI=", + "eKUqK+Y4+DE=", + "yUcwcWD75qU=", + "PdBWklVCL2o=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "XyErsWQCxUA=", + "PEx2d9OURMc=", + "GXvhRrhlqTM=", + "Iky+IrHSmKI=", + "7Rkiq2YBb0Q=", + "rkN82xsGLZc=", + "+Qd0reR74yM=", + "l+ils0txONY=", + "HEBIP2v+wrM=", + "eG7fdBb0nuQ=", + "BKZFtrOPIz0=", + "zT2Gam6mBZY=", + "0kkzMk1k7cc=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - sponsored account is the sponsor of the pool share trustline - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|increase reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "/hOeJJJ5mMQ=", + "iXMx+HQLzFM=", + "ykQzkoL7rN4=", + "W61imUX5t/Y=", + "FnKSUS49NW4=", + "3qPnbcvE+3o=", + "SrTSPxmNdJI=", + "vE5LM9dAjOA=", + "U+QMFpfBZNU=", + "bPn7JE201Fc=", + "uWrwfpHp/mY=", + "aCy7YHn5MMc=", + "CAtZ31dhFTQ=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Y0KQiXCoayk=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "R+AVlIeR8sA=", + "0JhxKLQ9G5I=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "6jb1LeVj00w=", + "c945pKdzmm4=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "NCT2rtqQDVQ=", + "1i3C/LQKcog=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - multiple pool share trustlines - one sponsored pool share trustline - sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "N1hWy+10hjA=", + "oHmwfFW2co8=", + "W/YPEAUchUU=", + "Xc2Ar0bpBaA=", + "sXg/lV8PdO4=", + "tPqGVjY1a5M=", + "Tx67I3JtA9c=", + "KnjXCxlajJc=", + "3mU6EhzQjMA=", + "2amfXdgoxbU=", + "kzurgO+oS7Y=", + "GkiHLPQBgz4=", + "G6pfiTh2kFg=", + "2KHf53MoBec=", + "jimhpvl7g9w=", + "V7GLPLHckhw=", + "ZlDxaYwheIE=", + "UrB9byyhI7s=", + "OWBOfEOdCPc=", + "h9Dbnoiuqeo=", + "5Qu2iohtyXk=", + "j947DTc00fU=", + "Jg4T+xiZhdk=", + "Us9URSoIjKQ=", + "f77qiIiGacQ=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "/6Mrw9MPXz8=", + "+QlpSoKA0aA=", + "/qADlAG9hz0=", + "22zFaPfJo5M=", + "SflnKBqrHFg=", + "qP7ZVB4jbaI=", + "w8A04wiexCs=", + "+3HupLDd924=", + "UCE+MdumGLk=", + "TVcscJ11kZY=", + "5mwqwFgPQFI=", + "1WnWTidOrVM=", + "1rzy6kL9Pnw=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "pvDp7Puvuqk=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "7t6gKBTfYrQ=", + "/edzsxdxWPE=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "T5pcyAswmpY=", + "Ilm4rG46Lnk=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "sfi3O4cRf1c=", + "yO58wjkST+0=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - sponsored account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "g4sVyUnPpfw=", + "GyTzzmvLfQU=", + "s1gxJk+3IFU=", + "+mvI6qfax6s=", + "Lp23JQaBGN4=", + "Y4BQKY/9Vmw=", + "kwqbbIRhx2s=", + "GzjUoNp1QMg=", + "HdUWOhDpq3A=", + "Zm3LB3CKqZE=", + "I196VtsCgC8=", + "sMOM6D4e2Lg=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - sponsored pool share trustline - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "tuiwUYU/EXw=", + "6J9PHOd8BXY=", + "bMUgxBOUFzA=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "OhzesPa0S+c=", + "fsj/kSFV2G4=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "hRNlPz09FOo=", + "nN06QtnRMLE=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|same reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "+zVp3B8qtNc=", + "VFfVREX63hw=", + "/qADlAG9hz0=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "w8A04wiexCs=", + "pVT7vfyvW/U=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "1WnWTidOrVM=", + "3ib6aHpo68Q=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|sponsorships|trustline is owned by one issuer and sponsored by the other" : + [ + "GjbSkanf1hU=", + "s7MjdOBLANk=", + "YPx9015AQko=", + "HgQoNLPFZe8=", + "O/wmtzZ58CU=", + "KpShWnhWRzk=", + "nDp6WE1k7JM=", + "KboarMVOWrs=", + "hJeyTwPxLok=", + "xDI7r/SfmOU=", + "WgGeGR43D2Y=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|trade with pool, revoke, then trade again|both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "MQLOhfdOUcQ=", + "PQ+a0coy0oI=", + "Y4fg/mICYmA=", + "QoCNi8c8tDU=", + "LdwEizxVY2Y=", + "hXuSS9pEyf4=", + "zSJ2bz3eaxw=", + "SsbpJgliMLw=", + "nqgad2MARzg=", + "5H3mf3lKEGM=", + "uMaHM5s1FQE=", + "vgbYU7ndwhc=", + "QThD9qtuu4k=", + "pN/aKDSme6o=", + "c12Sw2o8bDE=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|trade with pool, revoke, then trade again|one non-native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "DDpRsT17okA=", + "x2hg1xGgZMc=", + "MjEBL9rAEbs=", + "o+ttYhvYOQk=", + "NnRpnTLMIYw=", + "lYqJB/6JNrg=", + "cB1eeYocsws=", + "N6oC7nFdTMM=", + "ecdAgS28/Ak=", + "ykVWGqrHUm8=", + "Wiz2rqWiGxg=", + "cn9NlhoC5Fo=", + "8irUQ7VTyas=", + "4G3edp3Lq7o=" + ], + "revoke from pool|protocol version 26|revoke with allow trust|validate op num and tx account is used in hash" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "8/L0r2VGyTo=", + "Re1szw+hSQc=", + "R+i1RvPUkS8=", + "ouqhP9P6AxE=", + "Gp/dvueQUpY=", + "e3WWjr3RCYo=", + "eqzP0fBHBLY=", + "R5QVthwgOco=", + "ORYWlyD+vqc=", + "Oxd0d4+rVJw=", + "qQu/HqkkcZk=", + "SB/i/WaCXKE=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - both non-native|pool is deleted" : + [ + "3BNOJlzsung=", + "qnW43+iAjUc=", + "L7yAI/+I8U4=", + "sZ4Auj/tiBE=", + "Xh6mxPLJw1U=", + "7ZFgf+AIkns=", + "c9iaWJd2uI0=", + "qjrDI0KFknA=", + "zCvjFvGl73w=", + "rHcNANiCuPE=", + "mwi+gGFGQ08=", + "gy/qpbX/PeE=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - both non-native|pool still exists" : + [ + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "ea/g8lcJPAs=", + "ujC00Pr/5yo=", + "3nQM4ZJgqWk=", + "C/p1gpvQBYI=", + "5XszkOyxn3A=", + "S7LPyZ5CEXs=", + "UNlpWLs8m9Y=", + "qmjLhizAjTc=", + "exQ7xKEnaW0=", + "t8tNIRPirOc=", + "ZTp7H67E5hQ=", + "G5rVvX1mI88=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - one non-native" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - one non-native|pool is deleted" : + [ + "x/MgwJ+FwD8=", + "GkRkl1HHX8A=", + "DALmy1BuYqw=", + "cR3FuNXBgJk=", + "/n9cCQ8ebY4=", + "MlI0a3ixUxs=", + "NtVrNYQWVSk=", + "ff/JtZQNcpc=", + "2W7mD2l2qf0=", + "cZTxmjbj2dI=", + "svta6YdqdOQ=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claim - one non-native|pool still exists" : + [ + "xygGFb0+baM=", + "P9kM3O+K94Y=", + "ZuUGd+7kcaQ=", + "dfKq7c3dWfg=", + "bvZnC2+ePHk=", + "SGu/Mnwk/YM=", + "Yt1fnvDoDY8=", + "+w+nKs4P4CA=", + "HG1f3RqEvns=", + "kXGvUIy/fx0=", + "w/RmOUlRw1M=", + "C0Z9eKG6JQs=", + "Iit2+K+wvVw=", + "SjuWIN5aIzs=", + "ipTKhVpqQbA=", + "ike8886Uhpk=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claimable balance created for issuer|assetA issuer" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "xeV5F90ykR8=", + "+gwXWxx6a8E=", + "Q3VaJoeQgrM=", + "GkRkl1HHX8A=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "xbomjYJ6A2U=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|claimable balance created for issuer|assetB issuer" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "9XqiTtI/0YI=", + "nzW1CVCl0B8=", + "kAerL8wvs90=", + "++SukBbWVBA=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "fwh19zAt3n8=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - both non-native" : + [ + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=", + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - both non-native|pool is deleted" : + [ + "eqURmTshdoU=", + "ESZkLAlpgGE=", + "+Bo0oXoOnMU=", + "uKuNz7HZgjQ=", + "btR9vAI/zsc=", + "r2igwYQDMHM=", + "tM3vXW40Q8E=", + "BXCQCqkzdF0=", + "Fnm5vNgFyGs=", + "2fux4pfF0FE=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - both non-native|pool still exists" : + [ + "kqY4X4f3i0E=", + "1QFpACchEy8=", + "4gEAox7FUtY=", + "mebbBvaYLCA=", + "FBTDoyYT8u8=", + "h/a3yw489GA=", + "OIusLgy02ac=", + "fNCQD9diZeg=", + "UXTsQO+GrEw=", + "DR1sbtRrrcM=", + "A2M5W4+l7UM=", + "ZegnzK0j+NI=", + "1xAXCqHiJUw=", + "S0xJyU6ViCQ=", + "2LDC4yG1/gg=", + "xjtLQ3CObTQ=", + "q7n/2scovxw=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - one non-native" : + [ + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=", + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - one non-native|pool is deleted" : + [ + "hM7lug967E0=", + "YhZSf19ZWzQ=", + "bhm+jxhljCY=", + "iWid/HPeM7w=", + "Tbd3yPekrgA=", + "S1zE4ydM1ao=", + "bWkGVFtqrAY=", + "vA2H+q7Kots=", + "kxBE01p1e38=", + "jyZhoxv1E6I=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|clawback - one non-native|pool still exists" : + [ + "AsniooyAj+k=", + "1dWjW5Jt2HA=", + "JqEiAta7RkI=", + "cQgdvFIOsEk=", + "yS9EyeunPig=", + "KSVoJgepZtA=", + "qy/K06HJxVU=", + "4x8VKaJth7w=", + "A7exKodqy2U=", + "/A+InlbfNp4=", + "XzyRgKH48lw=", + "tfDkX4p6dcw=", + "esNzPAUBlGI=", + "iHASW18z/04=", + "OIu0vnRDR8s=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke from 0 balance pool share trustline" : + [ + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "WA9JJNEjQMU=", + "odq2qvS+iIA=", + "ttzUOsaIBoY=", + "T1l2IU6VtHs=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke from multiple pools" : + [ + "Ej15sgZwk/8=", + "KtpHKUDsWbI=", + "l184XIgBAeE=", + "aTJgLxdwiYQ=", + "EPrCWsfgUqQ=", + "PN4+M90+aQM=", + "85qdD7cFGhQ=", + "BiRdX2k8dEM=", + "Sk0EDDMZXw8=", + "ZD/jdFRjVDg=", + "U8CwBSWmPZk=", + "W+d8+NS8Jfc=", + "5fJsNj+wspk=", + "xIYUXCsPK1A=", + "MFLO5qYoyBY=", + "+Q7AS5LR51g=", + "ZmmFXqrv0bY=", + "uB+5xHHbH2w=", + "aX12TR4j4Do=", + "lMyQHwrJTME=", + "8C52RDeJj/8=", + "qbPZ3uodwe8=", + "Ptul7KLdH+0=", + "CSeIxSRpl9o=", + "vFlZEj0C850=", + "m5jFVGrb8cQ=", + "g1PXQB9Zx/Y=", + "9rrsJjz/Q/g=", + "pf13WPD7hJ8=", + "ZHH+blVwuqM=", + "O2lIZBnDEs4=", + "qOcYlhFOt+A=", + "uetGYsCSoqw=", + "+q9gVrbbK9s=", + "3oBkrVAW6JE=", + "bUaD8AiapZI=", + "oKxx1HmCAXs=", + "SSGQDGKjooU=", + "IMeeZpumd8o=", + "UTxbpWCYsII=", + "RiiZy7X+/uk=", + "h7sutwR1TZY=", + "cR7uve/Pf7M=", + "ToKeBOH1z8U=", + "pHLCgtrtv3A=", + "5ylJKrYNfCw=", + "U8UZDNdrMxE=", + "NNQ7z36o5/0=", + "T/CYSuGEyus=", + "oKAS0SQVrg0=", + "lLvUEgo6tUo=", + "eTVipZ/xyuQ=", + "40A1PdpTnVo=", + "IKWEFkebeIE=", + "+n1HcViSGsw=", + "Q+YBbcY/Aac=", + "X15b10a2f3I=", + "KPPVnmRMk8Q=", + "0dKi+WsNoVc=", + "1GYJFcKvENQ=", + "nmeJQccgYQ4=", + "65v6wdoXexU=", + "MF9XJBBANIQ=", + "S9RevQNqoaQ=", + "SdA/GSOdOrw=", + "gsfsaXClo5U=", + "+2z83VJwktk=", + "8rOo2BIewg4=", + "sT3sHJ3+Lko=", + "0+sTbu+Dv2s=", + "uXZYrB/+zQY=", + "51QnpTZc2R4=", + "/9eNWvcM36o=", + "CRWKXHjMuhw=", + "+ysW91msOdg=", + "MEwUvQR96M0=", + "OsQ2P4F8GBE=", + "GRrYXNGRsWQ=", + "fVHextyz4+g=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetA" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "1U8pMfUIgTw=", + "cu6yCQSH2Qk=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "Fp0/G4TdTb0=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "wVupFjRjvsU=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetB" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "JXJZG8Yos7U=", + "Sp3J20yyJkQ=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "ZrrEiEZr8JU=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "NWvh+/5OvyI=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|one non-native - revoke assetB" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "ASwh0YJ3ty0=", + "J2v8GZ8XIV4=", + "fofvQf14MqQ=", + "FcFgNF79nwM=", + "r7CX3cwTZgI=", + "VjF8n3KSevI=", + "bXkN4v07Rwk=", + "ebZgGYgrQ/0=", + "XNrDtfNgwnc=", + "ygRGrcjJM7g=", + "4KonIE5uxog=", + "cfJEY2CYzDs=", + "kRNrjY6VaVI=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetA" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "9sRqqiKFjeg=", + "B7xUZpLBWDA=", + "xygGFb0+baM=", + "24B7JaVOxbY=", + "SKbMVA6we1g=", + "V0k3rbgNntU=", + "pFNB3NuLX+Q=", + "PMtSlH6DtTA=", + "jx2RoC3YtGE=", + "4Rul+L0t+WE=", + "pxddiin/7b4=", + "N6nk3weoJZA=", + "/hzINuVMx3g=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetB" : + [ + "tywh5+xR0v4=", + "CMvxm6vFvHA=", + "u+Yx++9iq2M=", + "Ad8vXXB9jT0=", + "xygGFb0+baM=", + "e6lcyfaPHIk=", + "JvSvLLTxhJU=", + "LKG0yNbBLeA=", + "/E7bu7ZOnLs=", + "1urk252ChO8=", + "IKVWLXL0+aQ=", + "0S2DV4bLyxo=", + "dcoNQcL6NQw=", + "r/aZey5P0qY=", + "j//DKCUkd54=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "jYF0uW2lDQg=", + "fLcqUde/eO4=", + "yZ3vVlhJE2M=", + "G4tPSEpVnmY=", + "+3Pff4UHyXQ=", + "4KSZaOMrK/s=", + "esb/9o1Ith8=", + "xrQrY/JYbcM=", + "MbOykBvt7FI=", + "YO3GW0Sz64E=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "nch4XDckfm8=", + "BiilzEGKpP4=", + "Y4fg/mICYmA=", + "8MK/LTYK9Dg=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "oj+ok3E7epw=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "KtBN8wbHttk=", + "XPU0Mu8Oo5Q=", + "9+oSpEq6C74=", + "Ut1PP2aMiY4=", + "erukIeNz9h8=", + "XlBeTbG00jk=", + "Y/vlzR2ox5I=", + "n4X/+8hl0Vc=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "6oXlTNs8wn4=", + "ooSzGlVyZOw=", + "jobDkOlDdOk=", + "XFPIMsO2cFU=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "TYABVzPOqvI=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships" : + [ + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Qxb1bSRHPSs=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "87KmiTyC60g=", + "ueaGBgDmnoM=", + "RpUgNVMFrpU=", + "t2JqvrD0xm4=", + "q9ueNpUSruY=", + "Out6Rxu9isY=", + "Hf0BAdxLncQ=", + "77f5MjdHBWg=", + "/fz8AKyNiRM=", + "jD2s+hxb8ME=", + "K0IcWpTufj8=", + "WAiS4mMoTmk=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - no sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "vVrAhaWRbPw=", + "RC0QjlyzzBI=", + "6k47iVDdHhQ=", + "8TEkMta+Ugs=", + "mOqcAnU8Yto=", + "8Riq56qqxMY=", + "/yMbdlqdqdQ=", + "1QopmuAd0uo=", + "g+hYkj6vFk8=", + "+cRUnRTLolI=", + "eKUqK+Y4+DE=", + "yUcwcWD75qU=", + "PdBWklVCL2o=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "XyErsWQCxUA=", + "PEx2d9OURMc=", + "GXvhRrhlqTM=", + "Iky+IrHSmKI=", + "7Rkiq2YBb0Q=", + "rkN82xsGLZc=", + "+Qd0reR74yM=", + "l+ils0txONY=", + "HEBIP2v+wrM=", + "eG7fdBb0nuQ=", + "BKZFtrOPIz0=", + "zT2Gam6mBZY=", + "0kkzMk1k7cc=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - sponsored account is the sponsor of the pool share trustline - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|increase reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "/hOeJJJ5mMQ=", + "iXMx+HQLzFM=", + "ykQzkoL7rN4=", + "W61imUX5t/Y=", + "FnKSUS49NW4=", + "3qPnbcvE+3o=", + "SrTSPxmNdJI=", + "vE5LM9dAjOA=", + "U+QMFpfBZNU=", + "bPn7JE201Fc=", + "uWrwfpHp/mY=", + "aCy7YHn5MMc=", + "CAtZ31dhFTQ=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Y0KQiXCoayk=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "R+AVlIeR8sA=", + "0JhxKLQ9G5I=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "6jb1LeVj00w=", + "c945pKdzmm4=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "NCT2rtqQDVQ=", + "1i3C/LQKcog=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - multiple pool share trustlines - one sponsored pool share trustline - sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "N1hWy+10hjA=", + "oHmwfFW2co8=", + "W/YPEAUchUU=", + "Xc2Ar0bpBaA=", + "sXg/lV8PdO4=", + "tPqGVjY1a5M=", + "Tx67I3JtA9c=", + "KnjXCxlajJc=", + "3mU6EhzQjMA=", + "2amfXdgoxbU=", + "kzurgO+oS7Y=", + "GkiHLPQBgz4=", + "G6pfiTh2kFg=", + "2KHf53MoBec=", + "jimhpvl7g9w=", + "V7GLPLHckhw=", + "ZlDxaYwheIE=", + "UrB9byyhI7s=", + "OWBOfEOdCPc=", + "h9Dbnoiuqeo=", + "5Qu2iohtyXk=", + "j947DTc00fU=", + "Jg4T+xiZhdk=", + "Us9URSoIjKQ=", + "f77qiIiGacQ=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "/6Mrw9MPXz8=", + "+QlpSoKA0aA=", + "/qADlAG9hz0=", + "22zFaPfJo5M=", + "SflnKBqrHFg=", + "qP7ZVB4jbaI=", + "w8A04wiexCs=", + "+3HupLDd924=", + "UCE+MdumGLk=", + "TVcscJ11kZY=", + "5mwqwFgPQFI=", + "1WnWTidOrVM=", + "1rzy6kL9Pnw=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "pvDp7Puvuqk=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "7t6gKBTfYrQ=", + "/edzsxdxWPE=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "T5pcyAswmpY=", + "Ilm4rG46Lnk=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "sfi3O4cRf1c=", + "yO58wjkST+0=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - sponsored account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "g4sVyUnPpfw=", + "GyTzzmvLfQU=", + "s1gxJk+3IFU=", + "+mvI6qfax6s=", + "Lp23JQaBGN4=", + "Y4BQKY/9Vmw=", + "kwqbbIRhx2s=", + "GzjUoNp1QMg=", + "HdUWOhDpq3A=", + "Zm3LB3CKqZE=", + "I196VtsCgC8=", + "sMOM6D4e2Lg=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - sponsored pool share trustline - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "tuiwUYU/EXw=", + "6J9PHOd8BXY=", + "bMUgxBOUFzA=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "OhzesPa0S+c=", + "fsj/kSFV2G4=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "hRNlPz09FOo=", + "nN06QtnRMLE=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|same reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "+zVp3B8qtNc=", + "VFfVREX63hw=", + "/qADlAG9hz0=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "w8A04wiexCs=", + "pVT7vfyvW/U=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "1WnWTidOrVM=", + "3ib6aHpo68Q=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|sponsorships|trustline is owned by one issuer and sponsored by the other" : + [ + "GjbSkanf1hU=", + "s7MjdOBLANk=", + "YPx9015AQko=", + "HgQoNLPFZe8=", + "O/wmtzZ58CU=", + "KpShWnhWRzk=", + "nDp6WE1k7JM=", + "KboarMVOWrs=", + "hJeyTwPxLok=", + "xDI7r/SfmOU=", + "WgGeGR43D2Y=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|trade with pool, revoke, then trade again|both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "MQLOhfdOUcQ=", + "PQ+a0coy0oI=", + "Y4fg/mICYmA=", + "QoCNi8c8tDU=", + "LdwEizxVY2Y=", + "hXuSS9pEyf4=", + "zSJ2bz3eaxw=", + "SsbpJgliMLw=", + "nqgad2MARzg=", + "5H3mf3lKEGM=", + "uMaHM5s1FQE=", + "vgbYU7ndwhc=", + "QThD9qtuu4k=", + "pN/aKDSme6o=", + "c12Sw2o8bDE=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|trade with pool, revoke, then trade again|one non-native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "DDpRsT17okA=", + "x2hg1xGgZMc=", + "MjEBL9rAEbs=", + "o+ttYhvYOQk=", + "NnRpnTLMIYw=", + "lYqJB/6JNrg=", + "cB1eeYocsws=", + "N6oC7nFdTMM=", + "ecdAgS28/Ak=", + "ykVWGqrHUm8=", + "Wiz2rqWiGxg=", + "cn9NlhoC5Fo=", + "8irUQ7VTyas=", + "4G3edp3Lq7o=" + ], + "revoke from pool|protocol version 26|revoke with set trustline flags|validate op num and tx account is used in hash" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "8/L0r2VGyTo=", + "Re1szw+hSQc=", + "R+i1RvPUkS8=", + "ouqhP9P6AxE=", + "Gp/dvueQUpY=", + "e3WWjr3RCYo=", + "eqzP0fBHBLY=", + "R5QVthwgOco=", + "ORYWlyD+vqc=", + "Oxd0d4+rVJw=", + "qQu/HqkkcZk=", + "SB/i/WaCXKE=" + ], + "revoke from pool|protocol version 26|too many sponsoring|one claimable balance" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=" + ], + "revoke from pool|protocol version 26|too many sponsoring|two claimable balances" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=" + ], "revoke from pool|protocol version 3" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 4" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 5" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], @@ -20539,6 +22977,135 @@ "set trustline flags|protocol version 25|upgrade auth when not revocable|0 -> authorized" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "nseFPAiMjX4=" ], "set trustline flags|protocol version 25|upgrade auth when not revocable|0 -> authorized to maintain liabilities" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "xjST+M6UZeU=" ], "set trustline flags|protocol version 25|upgrade auth when not revocable|authorized -> authorized to maintain liabilities -> authorized - with offers" : [ "w6iHOMgk5Zk=", "xwBPyJTkCdg=", "XhY1S+Bov0Y=", "fWhsK0sz/s4=" ], + "set trustline flags|protocol version 26" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=" + ], + "set trustline flags|protocol version 26|clear clawback" : + [ + "2q36ojLRHD4=", + "qh0/I7xumvc=", + "usRMxV2pCms=", + "KpAjWIlYGEk=", + "vfMD++LNONg=", + "/SU69GLvd+U=", + "mLGLCGSoYTk=" + ], + "set trustline flags|protocol version 26|empty flags" : [ "w6iHOMgk5Zk=", "hsA6Wo3b1eg=" ], + "set trustline flags|protocol version 26|errors|can't revoke|authorized -> 0" : [ "uwL6fqbahGg=", "K57lrYKFW20=" ], + "set trustline flags|protocol version 26|errors|can't revoke|authorized to maintain liabilities -> 0" : [ "ITK1uQfAvnE=", "yBsK55Y7kYU=", "Vw5W6hX6Jxw=" ], + "set trustline flags|protocol version 26|errors|invalid state" : [ "DJiVkhmIJs4=", "VY7N5Tg4P4A=", "DJiVkhmIJs4=", "VY7N5Tg4P4A=" ], + "set trustline flags|protocol version 26|errors|invalid state|set authorized when maintain liabilities" : [ "cPCAm5FYyBE=", "DFdctIg8ntM=" ], + "set trustline flags|protocol version 26|errors|invalid state|set maintain liabilities when authorized" : [ "/wPz30B3B3k=", "DFdctIg8ntM=" ], + "set trustline flags|protocol version 26|errors|malformed" : + [ + "Xd9HtdNhGVA=", + "SymM1FmYlyA=", + "LBocPPKS24I=", + "BzS3kHkzM74=", + "01SYm603m9s=", + "vlLZU1HUCck=", + "0sN4o12Ge0o=", + "GrRq36Wg7SM=", + "B7UXmmPPbJY=", + "keHGQAmKIZw=", + "Z6bsTg0wLjs=", + "aG2279UTCvE=", + "B4o5qBSKoDk=", + "gGukDOtmPrk=", + "SXE0j60942Y=", + "y8F0cyYnv1U=", + "kGwQ0M4SqnY=", + "S83NYVprs/8=", + "VqXgmfg9PAQ=", + "j1SkQRTo+X8=", + "h2ySbgoi+yg=", + "Agm/TGJjuLg=", + "tcuaFPrkzwo=", + "RipipwRxKjE=", + "Dc1ON5R1VmY=", + "HqXZ1MTe1IU=", + "LD/sfiuaYpQ=", + "160Bc14MRK0=", + "P+DWs7+hLDU=", + "v/VIU+7ijFw=" + ], + "set trustline flags|protocol version 26|errors|no trust" : [ "Xd9HtdNhGVA=" ], + "set trustline flags|protocol version 26|small test" : + [ + "9/P8T63L/mc=", + "t8Xt2RuSDDk=", + "0fsz0JFBVkg=", + "l6NH8YN0z70=", + "fR8HKma4Bns=" + ], + "set trustline flags|protocol version 26|upgrade auth when not revocable|0 -> authorized" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "nseFPAiMjX4=" ], + "set trustline flags|protocol version 26|upgrade auth when not revocable|0 -> authorized to maintain liabilities" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "xjST+M6UZeU=" ], + "set trustline flags|protocol version 26|upgrade auth when not revocable|authorized -> authorized to maintain liabilities -> authorized - with offers" : [ "w6iHOMgk5Zk=", "xwBPyJTkCdg=", "XhY1S+Bov0Y=", "fWhsK0sz/s4=" ], "set trustline flags|protocol version 2|not supported before version 17" : [ "/lfj8xIFS8I=" ], "set trustline flags|protocol version 3" : [ diff --git a/test-tx-meta-baseline-current/TxEnvelopeTests.json b/test-tx-meta-baseline-current/TxEnvelopeTests.json index 6cc48decbd..9ad6fb9a3a 100644 --- a/test-tx-meta-baseline-current/TxEnvelopeTests.json +++ b/test-tx-meta-baseline-current/TxEnvelopeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "txenvelope|protocol version 0|alternative signatures" : [ @@ -1216,7 +1217,7 @@ "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1247,7 +1248,7 @@ "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 14|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 14|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1460,7 +1461,7 @@ "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1491,7 +1492,7 @@ "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 15|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 15|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1704,7 +1705,7 @@ "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1735,7 +1736,7 @@ "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 16|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 16|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1948,7 +1949,7 @@ "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1979,7 +1980,7 @@ "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 17|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 17|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -2192,7 +2193,7 @@ "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -2223,7 +2224,7 @@ "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 18|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 18|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -2455,7 +2456,7 @@ "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "seWgWQjP1KA=", "HD+KE2dv0J8=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "7xAxuX2koIU=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "od7ol9puDzI=" ], - "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "n54lTWoqP6c=" ], + "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "J1TPVPqVGng=", "rrLhA7Z1UnA=", "oasdKqTDCOA=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "82DS8lxCTyM=", "jamZv4a6NgY=", "Te+Mi7134UI=", "0NccSo9SKW8=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|single signature|failing transaction" : [ "JpMQtM6sUVs=", "Mi4truI3NJ4=" ], @@ -2486,7 +2487,7 @@ "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "EM8eNo5S2Rg=", "1SD5E7Sv0wM=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "7dRyDVVWD/o=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "7dRyDVVWD/o=" ], - "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "jkPDpouHQkQ=" ], + "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success signature + hash x" : [ "J1TPVPqVGng=", "zSMquDS/218=", "GYh9gczOApY=" ], "txenvelope|protocol version 19|alternative signatures|hash x|single signature|accountMerge signing account" : [ "82DS8lxCTyM=", "jamZv4a6NgY=", "HthBV2u6yIM=", "sjeWbqW5W2w=" ], "txenvelope|protocol version 19|alternative signatures|hash x|single signature|failing transaction" : [ "ThY7/Mobm5U=", "rcoIrs45/xg=" ], @@ -2515,7 +2516,7 @@ "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "0W/+Rbf99jQ=", "XGBSWiLy4Es=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "6cQ1e6fl0yA=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "6cQ1e6fl0yA=" ], - "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "ZUTCMzwc9ZY=" ], + "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "J1TPVPqVGng=", "7fO6akVkQ3Q=", "O90hZRetVuc=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "tlAFvpcsg4A=", "Nbzl0nNC5F4=", "GCLfz0SkNWc=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|payload signer in op source account signers" : [ "tlAFvpcsg4A=", "Nbzl0nNC5F4=", "KgOPmO2NGVA=" ], @@ -3048,7 +3049,7 @@ "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3079,7 +3080,7 @@ "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 20|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 20|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3108,7 +3109,7 @@ "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -3390,7 +3391,7 @@ "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3421,7 +3422,7 @@ "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 21|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 21|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3450,7 +3451,7 @@ "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -3732,7 +3733,7 @@ "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3763,7 +3764,7 @@ "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 22|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 22|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3792,7 +3793,7 @@ "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -4074,7 +4075,7 @@ "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4105,7 +4106,7 @@ "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 23|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 23|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4134,7 +4135,7 @@ "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -4416,7 +4417,7 @@ "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4447,7 +4448,7 @@ "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 24|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 24|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4476,7 +4477,7 @@ "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -4758,7 +4759,7 @@ "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4789,7 +4790,7 @@ "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 25|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 25|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4818,7 +4819,7 @@ "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -5018,6 +5019,348 @@ "txenvelope|protocol version 25|outer envelope|no signature" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 25|outer envelope|too many signatures (signed twice)" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 25|outer envelope|too many signatures (unused signature)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 26|alternative signatures" : + [ + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=" + ], + "txenvelope|protocol version 26|alternative signatures|empty X" : [ "rwNYUsvxUXI=", "CTs4F3izVmM=", "tqnFBwNWLjo=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|hash tx in multiple ops source account signers" : [ "BahzAZdyops=", "CJZk3cmY69I=", "2HyD46LmMA8=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|hash tx in op source account signers" : [ "Zptmmof6T2Y=", "F7WSVIcaxqE=", "Ez+RsXXfABE=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "vDoXGkKmIL0=", "yO7sxtrTA4o=", "rhoNOYGXUZE=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights (envelope)" : [ "pBi6zV5UG30=", "pE7scQEyvA4=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "uwKD8d7nQDs=", "4O0eUK8zJjw=", "RbyPfEk2/Pc=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|invalid seq nr" : [ "dZ5tdD9vm78=", "VIsJfF9efF0=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|invalid signature" : [ "WqUldHvceXk=", "hH9fZ7vm6IE=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|merge source account before payment|merge op source account" : [ "wBV3EVc6/MI=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|merge source account before payment|merge tx source account" : [ "UUg8SLWrfeE=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|success" : [ "spOYk57UnbQ=", "LIm07cvW9gk=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|too many signatures (signed by owner)" : [ "spOYk57UnbQ=", "zaJVZ8bPECw=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|hash x in multiple ops source account signers" : [ "KhrsPrJeMKQ=", "rno8ihfVJEs=", "qYmHnjWMmKk=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|hash x in op source account signers" : [ "KhrsPrJeMKQ=", "rno8ihfVJEs=", "s5X1c4hu+BY=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "CTs4F3izVmM=", "Yo7IJqAbn4k=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights (envelope)" : [ "CTs4F3izVmM=", "7mznDGX+WXE=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "CTs4F3izVmM=", "Yo7IJqAbn4k=", "Vvlp5+YkDFI=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|invalid seq nr" : [ "/RiyrxZOjJU=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|invalid signature" : [ "oG1CULz/v8Y=", "eCkJR1BQw1A=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|merge source account before payment|merge op source account" : [ "7IYvW4+WPNc=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|merge source account before payment|merge tx source account" : [ "7IYvW4+WPNc=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|success" : [ "/RiyrxZOjJU=", "vApZbfMf4hU=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|single signature|too many signatures (signed by owner)" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "PZxmNF7cYUQ=", "kyDWcZ1YZl4=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights (envelope)" : [ "PZxmNF7cYUQ=", "kXKT2U5Cs5I=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "PZxmNF7cYUQ=", "kyDWcZ1YZl4=", "Z1A7gJnvV98=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "+1oPlCoa7Z4=", "Bt5UK97U1xM=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|failing transaction" : [ "QYPt2rHQ69s=", "5yEP9CyFaaQ=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|invalid seq nr" : [ "QYPt2rHQ69s=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|invalid signature" : [ "mkVH2A0g9dU=", "Om8GIp++A3w=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|merge source account before payment|merge op source account" : [ "z5KjFduen9s=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|merge source account before payment|merge tx source account" : [ "z5KjFduen9s=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|success" : [ "QYPt2rHQ69s=", "lJJazC7dHHE=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|single signature|too many signatures (signed by owner)" : [ "QYPt2rHQ69s=", "5yEP9CyFaaQ=" ], + "txenvelope|protocol version 26|batching|empty batch" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|batching|non empty" : + [ + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=" + ], + "txenvelope|protocol version 26|batching|non empty|multiple tx|both success" : [ "ed5VrA2COL0=" ], + "txenvelope|protocol version 26|batching|non empty|multiple tx|one failed tx" : [ "A84rnNwfKjA=" ], + "txenvelope|protocol version 26|batching|non empty|multiple tx|one invalid tx" : [ "A84rnNwfKjA=" ], + "txenvelope|protocol version 26|batching|non empty|operation using default signature" : [ "qV3u/8pEI+M=" ], + "txenvelope|protocol version 26|batching|non empty|single tx wrapped by different account|missing signature" : [ "wkmQXFCYhEg=" ], + "txenvelope|protocol version 26|batching|non empty|single tx wrapped by different account|success" : [ "/T+9YKd7z4w=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction" : + [ + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=" + ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|change thresholds twice" : [ "o0lSXoiKSFY=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|lower master weight twice" : [ "cx/7twhL5PM=", "d8fZl+7DYKg=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|merge one of signing accounts" : [ "6P5Au3Xd6YU=", "6P5Au3Xd6YU=", "6P5Au3Xd6YU=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|merge one of signing accounts|by destination" : [ "OCN0WlyN8Yk=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|merge one of signing accounts|by source, signed by destination" : [ "pS6cdEpZoJo=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|reduce auth, do something" : [ "na4r5iaBuOo=", "na4r5iaBuOo=", "na4r5iaBuOo=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|reduce auth, do something|single tx|missing signature" : [ "MaloAfduObM=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|reduce auth, do something|single tx|valid" : [ "M81hMcpZjk0=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|switch a into regular account 1" : [ "WonJdB8EWJQ=", "5rtub7YsfE0=" ], + "txenvelope|protocol version 26|change signer and weights mid-transaction|switch a into regular account 2" : [ "WonJdB8EWJQ=", "VSo0Hxrk0xE=" ], + "txenvelope|protocol version 26|common transaction" : + [ + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=" + ], + "txenvelope|protocol version 26|common transaction|Insufficient fee" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|common transaction|duplicate payment" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|common transaction|time issues|on time" : [ "MIyf3xETJKg=" ], + "txenvelope|protocol version 26|common transaction|time issues|too early" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|common transaction|time issues|too late" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|common transaction|transaction gap" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|ed25519 payload signer" : + [ + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=" + ], + "txenvelope|protocol version 26|ed25519 payload signer|3 byte payload" : [ "zflp2nEyWqc=", "Fb91c2RSbw4=" ], + "txenvelope|protocol version 26|ed25519 payload signer|4 byte payload" : [ "RvEUbBY6YeU=", "PBSTtzpJ2Nk=" ], + "txenvelope|protocol version 26|ed25519 payload signer|5 byte payload" : [ "FOzfW19Mdqk=", "OkQWWae6OHY=" ], + "txenvelope|protocol version 26|ed25519 payload signer|empty payload in payload signer in extra signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|ed25519 payload signer|payload is tx" : [ "Ixf1E+3uxs0=", "Hre9i3AO5l4=", "9Izn6nScHtM=" ], + "txenvelope|protocol version 26|ed25519 payload signer|payload signer in extra signers|fail" : [ "BktTqnyYnMw=" ], + "txenvelope|protocol version 26|ed25519 payload signer|payload signer in extra signers|success" : [ "1SvvqMBkpYg=" ], + "txenvelope|protocol version 26|ed25519 payload signer|payload signer with zeroed out ed25519" : [ "j3d4BDjfdaE=", "OSpUlVwrpMA=" ], + "txenvelope|protocol version 26|extraSigners" : + [ + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=" + ], + "txenvelope|protocol version 26|extraSigners|duplicate extra signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|extraSigners|duplicate hash card signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 26|extraSigners|one extra hashx signer|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 26|extraSigners|one extra hashx signer|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 26|extraSigners|one extra signer|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 26|extraSigners|one extra signer|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 26|extraSigners|preauth signer" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 26|extraSigners|signer overlap with added account signer" : [ "aI/qkx86PSM=", "aI/qkx86PSM=" ], + "txenvelope|protocol version 26|extraSigners|signer overlap with added account signer - both signers used" : [ "aI/qkx86PSM=", "3k/4PoxlEe8=" ], + "txenvelope|protocol version 26|extraSigners|signer overlap with added account signer|signature missing" : [ "QV8nsu6lcwk=" ], + "txenvelope|protocol version 26|extraSigners|signer overlap with added account signer|signature present" : [ "i5GLE8glWZ8=" ], + "txenvelope|protocol version 26|extraSigners|signer overlap with default account signer" : [ "DF8gl+xOXqU=" ], + "txenvelope|protocol version 26|extraSigners|two extra signers|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 26|extraSigners|two extra signers|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 26|multisig" : + [ + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=" + ], + "txenvelope|protocol version 26|multisig|account locked down" : [ "aY3ARmof8NE=", "0H1IgRarsek=" ], + "txenvelope|protocol version 26|multisig|do not allow duplicate signature" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 26|multisig|not enough rights (envelope)" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 26|multisig|not enough rights (first signer)" : [ "laAzyxeZuKE=" ], + "txenvelope|protocol version 26|multisig|not enough rights (first thresholds)" : [ "laAzyxeZuKE=" ], + "txenvelope|protocol version 26|multisig|not enough rights (operation, together)" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 26|multisig|success two signatures, first signer" : [ "thXzNwPU0Ys=" ], + "txenvelope|protocol version 26|multisig|success two signatures, first thresholds" : [ "thXzNwPU0Ys=" ], + "txenvelope|protocol version 26|multisig|success two signatures, together" : [ "MYbC+RJv5Js=" ], + "txenvelope|protocol version 26|multisig|without master key" : [ "u0xZ7kST12g=", "u0xZ7kST12g=" ], + "txenvelope|protocol version 26|multisig|without master key|good tx" : [ "Y6I7h/K3QhE=" ], + "txenvelope|protocol version 26|multisig|without master key|master key is extra" : [ "yOZG7A3j6SY=" ], + "txenvelope|protocol version 26|mux accounts" : [ "bsNWqs4A9XQ=", "bsNWqs4A9XQ=" ], + "txenvelope|protocol version 26|mux accounts|dest account" : [ "zzCg6Wknl90=" ], + "txenvelope|protocol version 26|mux accounts|src account" : [ "zzCg6Wknl90=" ], + "txenvelope|protocol version 26|outer envelope|bad signature" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 26|outer envelope|bad signature (wrong hint)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 26|outer envelope|no signature" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 26|outer envelope|too many signatures (signed twice)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 26|outer envelope|too many signatures (unused signature)" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 2|alternative signatures" : [ "49rU55h6rBs=", diff --git a/test-tx-meta-baseline-current/TxResultsTests.json b/test-tx-meta-baseline-current/TxResultsTests.json index 292e70a4b0..506d141abc 100644 --- a/test-tx-meta-baseline-current/TxResultsTests.json +++ b/test-tx-meta-baseline-current/TxResultsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 25, + "!cfg protocol version" : 26, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -30,7 +30,8 @@ 22, 23, 24, - 25 + 25, + 26 ], "txresults|protocol version 0" : [ @@ -3683,6 +3684,199 @@ "txresults|protocol version 25|not enough signature weight|before tx" : [ "R51x7z7h5Zw=" ], "txresults|protocol version 25|not enough signature weight|normal" : [ "gp2J7tvctEY=" ], "txresults|protocol version 25|not enough signature weight|with operation after" : [ "4P8x4nLbeOU=" ], + "txresults|protocol version 26" : + [ + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=" + ], + "txresults|protocol version 26|create account|normal" : [ "RHQgioGEE04=" ], + "txresults|protocol version 26|create account|with payment after" : [ "pEg9scPYtzg=" ], + "txresults|protocol version 26|fees with liabilities" : [ "ykK4qLMIdWU=", "ykK4qLMIdWU=" ], + "txresults|protocol version 26|fees with liabilities|buying liabilities" : [ "bBEmCuCcPW0=", "huxHnrofXJw=" ], + "txresults|protocol version 26|fees with liabilities|selling liabilities" : [ "L6xveLuxMvs=" ], + "txresults|protocol version 26|merge account|normal" : [ "5Hc2qkhawS0=" ], + "txresults|protocol version 26|merge account|with operation after" : [ "/QqVExssKBQ=" ], + "txresults|protocol version 26|not enough signature weight|before tx" : [ "R51x7z7h5Zw=" ], + "txresults|protocol version 26|not enough signature weight|normal" : [ "gp2J7tvctEY=" ], + "txresults|protocol version 26|not enough signature weight|with operation after" : [ "4P8x4nLbeOU=" ], "txresults|protocol version 2|create account|normal" : [ "SySR+eR5Mwo=" ], "txresults|protocol version 2|create account|with payment after" : [ "XxNMjyQ/39I=" ], "txresults|protocol version 2|fees with liabilities" : [ "YZfznGXhWYA=", "YZfznGXhWYA=" ], diff --git a/test-tx-meta-baseline-next/AllowTrustTests.json b/test-tx-meta-baseline-next/AllowTrustTests.json index 75adfec843..11465da5ef 100644 --- a/test-tx-meta-baseline-next/AllowTrustTests.json +++ b/test-tx-meta-baseline-next/AllowTrustTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "allow trust|protocol version 0|allow trust" : [ @@ -3939,6 +3940,260 @@ "allow trust|protocol version 26|set trust line flags|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], "allow trust|protocol version 26|set trust line flags|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], "allow trust|protocol version 26|set trust line flags|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], + "allow trust|protocol version 27|allow trust" : + [ + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=" + ], + "allow trust|protocol version 27|allow trust|allow trust not required" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 27|allow trust|allow trust not required with payment" : [ "SKY/HFRZ8rY=", "n6lF21W1Y+M=", "IQIX1vX5nyo=" ], + "allow trust|protocol version 27|allow trust|allow trust required" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=" + ], + "allow trust|protocol version 27|allow trust|allow trust required|do not set revocable flag" : [ "iuqKZZVjl4E=", "nbWKJOVbLlA=", "AMfhXHm4M2c=" ], + "allow trust|protocol version 27|allow trust|allow trust required|invalid authorization flag" : [ "iuqKZZVjl4E=", "HygELYnQxjM=" ], + "allow trust|protocol version 27|allow trust|allow trust required|set revocable flag" : + [ + "OLJXeE+lPPs=", + "Nmuwi32W3Iw=", + "RY1d8mPBy1E=", + "ONd/UiFhGTE=", + "WIUxJgYJsYo=" + ], + "allow trust|protocol version 27|allow trust|allow trust with offers|an asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=" + ], + "allow trust|protocol version 27|allow trust|allow trust with offers|an asset matches|buying asset matches" : [ "13yZREZHAAY=", "pLs029KAkyU=" ], + "allow trust|protocol version 27|allow trust|allow trust with offers|an asset matches|selling asset matches" : [ "ObTLwhjEt3I=", "OoZR6IhycNw=", "08fP79JzV6Q=" ], + "allow trust|protocol version 27|allow trust|allow trust with offers|neither asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "aZ/WXfuGOrM=", + "sikUbNq8XGI=", + "Ws69fKMyE58=", + "utcu40gYV1w=", + "xKlmQzXePtc=", + "hCC/pghaFm4=", + "7PLZ3B4PdHA=" + ], + "allow trust|protocol version 27|allow trust|allow trust without trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 27|allow trust|allow trust without trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 27|allow trust|allow trust without trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 27|allow trust|authorize when AUTH_REQUIRED is not set" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "w+1cC16HHpc=", + "WybXLoo8TFo=", + "MWfRAIHXYcU=" + ], + "allow trust|protocol version 27|allow trust|revoke when AUTH_REQUIRED is not set" : [ "SKY/HFRZ8rY=", "7MiZjHuy3Ag=", "r1DApnx1qwE=" ], + "allow trust|protocol version 27|allow trust|self allow trust|allow trust with trustline" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 27|allow trust|self allow trust|allow trust without explicit trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 27|allow trust|self allow trust|allow trust without explicit trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 27|allow trust|self allow trust|allow trust without explicit trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 27|allow trust|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], + "allow trust|protocol version 27|allow trust|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], + "allow trust|protocol version 27|allow trust|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], + "allow trust|protocol version 27|set trust line flags" : + [ + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=", + "PKrYd+aio5o=", + "rc7hd8wsFAM=", + "mmFyTEFAuM8=" + ], + "allow trust|protocol version 27|set trust line flags|allow trust not required" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 27|set trust line flags|allow trust not required with payment" : [ "SKY/HFRZ8rY=", "n6lF21W1Y+M=", "IQIX1vX5nyo=" ], + "allow trust|protocol version 27|set trust line flags|allow trust required" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=", + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "ydl1qGU5iik=", + "/thQN2neRno=", + "36tYz+3kKcM=" + ], + "allow trust|protocol version 27|set trust line flags|allow trust required|do not set revocable flag" : [ "iuqKZZVjl4E=", "nbWKJOVbLlA=", "AMfhXHm4M2c=" ], + "allow trust|protocol version 27|set trust line flags|allow trust required|invalid authorization flag" : [ "iuqKZZVjl4E=", "HygELYnQxjM=" ], + "allow trust|protocol version 27|set trust line flags|allow trust required|set revocable flag" : + [ + "OLJXeE+lPPs=", + "Nmuwi32W3Iw=", + "RY1d8mPBy1E=", + "ONd/UiFhGTE=", + "WIUxJgYJsYo=" + ], + "allow trust|protocol version 27|set trust line flags|allow trust with offers|an asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=" + ], + "allow trust|protocol version 27|set trust line flags|allow trust with offers|an asset matches|buying asset matches" : [ "13yZREZHAAY=", "pLs029KAkyU=" ], + "allow trust|protocol version 27|set trust line flags|allow trust with offers|an asset matches|selling asset matches" : [ "ObTLwhjEt3I=", "OoZR6IhycNw=", "08fP79JzV6Q=" ], + "allow trust|protocol version 27|set trust line flags|allow trust with offers|neither asset matches" : + [ + "uueqi5D5PaM=", + "ZBoM719GRdQ=", + "wYIvIsGJ6e4=", + "aZ/WXfuGOrM=", + "sikUbNq8XGI=", + "Ws69fKMyE58=", + "utcu40gYV1w=", + "xKlmQzXePtc=", + "hCC/pghaFm4=", + "7PLZ3B4PdHA=" + ], + "allow trust|protocol version 27|set trust line flags|allow trust without trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 27|set trust line flags|allow trust without trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 27|set trust line flags|allow trust without trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 27|set trust line flags|authorize when AUTH_REQUIRED is not set" : + [ + "ulOv5CGbSyc=", + "ZBoM719GRdQ=", + "w+1cC16HHpc=", + "WybXLoo8TFo=", + "MWfRAIHXYcU=" + ], + "allow trust|protocol version 27|set trust line flags|revoke when AUTH_REQUIRED is not set" : [ "SKY/HFRZ8rY=", "7MiZjHuy3Ag=", "r1DApnx1qwE=" ], + "allow trust|protocol version 27|set trust line flags|self allow trust|allow trust with trustline" : [ "eq7w3+INWHA=", "mi9baI8kxz4=" ], + "allow trust|protocol version 27|set trust line flags|self allow trust|allow trust without explicit trustline" : [ "ulOv5CGbSyc=", "ulOv5CGbSyc=" ], + "allow trust|protocol version 27|set trust line flags|self allow trust|allow trust without explicit trustline|do not set revocable flag" : [ "G5sgiX2clMg=", "N0hEBCMcmnw=" ], + "allow trust|protocol version 27|set trust line flags|self allow trust|allow trust without explicit trustline|set revocable flag" : [ "YxSez3Ggwkc=", "+nWvrAEh3nY=", "5ppan/uCdCw=" ], + "allow trust|protocol version 27|set trust line flags|with clawback" : [ "hhPHFopJYS0=", "47NJKsn7lwQ=", "hhPHFopJYS0=", "47NJKsn7lwQ=" ], + "allow trust|protocol version 27|set trust line flags|with clawback|remove offers by pulling auth while clawback is enabled" : [ "y282W1p1dO0=", "v2Fwk8N9PUc=" ], + "allow trust|protocol version 27|set trust line flags|with clawback|trustline auth changes while clawback is enabled" : [ "Qu/MIyYebW4=", "qGCwNYl7gzY=", "12hTN6upbiQ=" ], "allow trust|protocol version 2|allow trust" : [ "/ruuvWxCmeY=", @@ -14310,6 +14565,754 @@ "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], "authorized to maintain liabilities|protocol version 26|set trust line flags|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=" + ], + "authorized to maintain liabilities|protocol version 27|allow trust|AUTHORIZED_FLAG and AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG can't be used together" : [ "XCtzJqGkYZM=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|auth transition tests" : + [ + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=", + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=" + ], + "authorized to maintain liabilities|protocol version 27|allow trust|auth transition tests|authorized -> authorized to maintain liabilities" : [ "eZbcZvvFQx0=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|auth transition tests|authorized to maintain liabilities -> not authorized" : [ "f920LFPoJ9c=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities" : + [ + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=" + ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "W8unRxcP8mI=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|delete offer" : [ "8P3fMY0H8Uk=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "CqP2D203klk=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "qHfTD7McSYE=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities" : + [ + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=" + ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "ahf1zsZNROg=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|delete offer" : [ "BwhmfEnoE+c=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "0uKr/9DGb6k=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "S0ldi3VUl9w=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], + "authorized to maintain liabilities|protocol version 27|allow trust|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "uueqi5D5PaM=", + "tTW80kWah+w=", + "BprXAJJ5rq8=", + "9J/BmUK0UTM=", + "NB/KZ0bFx74=", + "cngWVhuK5Zw=", + "ueCOs74laM0=", + "URR0VRl3H0E=" + ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|AUTHORIZED_FLAG and AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG can't be used together" : [ "XCtzJqGkYZM=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|auth transition tests" : + [ + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=", + "dd0UDeNPqMI=", + "MrWThAADUks=", + "hj07YrnIBz8=", + "2pMkxepbT6o=" + ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|auth transition tests|authorized -> authorized to maintain liabilities" : [ "eZbcZvvFQx0=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|auth transition tests|authorized to maintain liabilities -> not authorized" : [ "f920LFPoJ9c=", "i5yV0WCJ1wY=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities" : + [ + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=", + "cjHI3qrzyQs=" + ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "W8unRxcP8mI=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|delete offer" : [ "8P3fMY0H8Uk=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "CqP2D203klk=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|buying asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "qHfTD7McSYE=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities" : + [ + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=", + "cLnjqmOCj7g=" + ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't add offer" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change buying asset" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|change selling asset" : [ "ahf1zsZNROg=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|swap assets" : [ "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating amount" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|can't update offer|try updating price" : [ "AuT77EdYH9s=", "AuT77EdYH9s=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|delete offer" : [ "BwhmfEnoE+c=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on buying asset" : [ "0uKr/9DGb6k=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|offer tests|selling asset is only allowed to maintain liabilities|don't pull orders until denyTrust|denyTrust on selling asset" : [ "S0ldi3VUl9w=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|payment tests" : [ "cjHI3qrzyQs=", "cjHI3qrzyQs=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|payment tests|can't receive payment" : [ "Kq3QpUzRGos=", "6LPdzi8WAm4=", "GrTZ279LxrM=", "A9iKL07rfUY=" ], + "authorized to maintain liabilities|protocol version 27|set trust line flags|payment tests|can't send payment" : [ "AuT77EdYH9s=" ], "authorized to maintain liabilities|protocol version 2|allow trust" : [ "0HxJuvxFaP8=", diff --git a/test-tx-meta-baseline-next/BeginSponsoringFutureReservesTests.json b/test-tx-meta-baseline-next/BeginSponsoringFutureReservesTests.json index 7f7e134aa1..7fce6bf136 100644 --- a/test-tx-meta-baseline-next/BeginSponsoringFutureReservesTests.json +++ b/test-tx-meta-baseline-next/BeginSponsoringFutureReservesTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "sponsor future reserves|protocol version 0|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 10|sponsorships with precondition that uses v3 extension" : [ "rwI1SSa7khg=" ], @@ -131,6 +132,13 @@ "sponsor future reserves|protocol version 26|sponsoring account is sponsored" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], "sponsor future reserves|protocol version 26|sponsorships with precondition that uses v3 extension" : [ "0EonDaqtUyo=", "/VUxG88a6YU=" ], "sponsor future reserves|protocol version 26|success" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 27|add sponsored entry before adding first sponsored signer" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 27|already sponsored" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 27|bad sponsorship" : [ "5KjEutNtf8g=" ], + "sponsor future reserves|protocol version 27|sponsored account is sponsoring" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "sponsor future reserves|protocol version 27|sponsoring account is sponsored" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "sponsor future reserves|protocol version 27|sponsorships with precondition that uses v3 extension" : [ "0EonDaqtUyo=", "/VUxG88a6YU=" ], + "sponsor future reserves|protocol version 27|success" : [ "5KjEutNtf8g=" ], "sponsor future reserves|protocol version 2|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 3|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], "sponsor future reserves|protocol version 4|sponsorships with precondition that uses v3 extension" : [ "L/KhvR2g/gc=" ], diff --git a/test-tx-meta-baseline-next/BumpSequenceTests.json b/test-tx-meta-baseline-next/BumpSequenceTests.json index 4627391484..a40854c966 100644 --- a/test-tx-meta-baseline-next/BumpSequenceTests.json +++ b/test-tx-meta-baseline-next/BumpSequenceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "bump sequence|protocol version 0" : [ @@ -474,6 +475,31 @@ "bump sequence|protocol version 26|test success|large bump" : [ "KDk3TqUQkEU=" ], "bump sequence|protocol version 26|test success|large bump|no more tx when INT64_MAX is reached" : [ "R6/tPSYNWDY=" ], "bump sequence|protocol version 26|test success|small bump" : [ "1x5MkE51m4M=" ], + "bump sequence|protocol version 27" : + [ + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=", + "DKQqbAOaoas=", + "aFvubGY3q80=" + ], + "bump sequence|protocol version 27|seqnum equals starting sequence" : [ "l7Jo9jHXv6w=", "R6/tPSYNWDY=" ], + "bump sequence|protocol version 27|test success|backward jump (no-op)" : [ "SEHtVmEF8Dc=" ], + "bump sequence|protocol version 27|test success|bad seq" : [ "261VQSEf710=", "2TinaXRxsJU=" ], + "bump sequence|protocol version 27|test success|large bump" : [ "KDk3TqUQkEU=" ], + "bump sequence|protocol version 27|test success|large bump|no more tx when INT64_MAX is reached" : [ "R6/tPSYNWDY=" ], + "bump sequence|protocol version 27|test success|small bump" : [ "1x5MkE51m4M=" ], "bump sequence|protocol version 2|not supported" : [ "/lfj8xIFS8I=" ], "bump sequence|protocol version 3" : [ diff --git a/test-tx-meta-baseline-next/ChangeTrustTests.json b/test-tx-meta-baseline-next/ChangeTrustTests.json index 2b0f02268b..6aaab6ca55 100644 --- a/test-tx-meta-baseline-next/ChangeTrustTests.json +++ b/test-tx-meta-baseline-next/ChangeTrustTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "change trust pool share trustline|protocol version 0" : [ "y3OKoeosX6s=", "y3OKoeosX6s=" ], "change trust pool share trustline|protocol version 0|pool trustline sponsorship" : [ "Vv+QRgIt0Cg=", "jba1E+ywrQM=", "TU5dHQFzjW0=" ], @@ -4293,6 +4294,476 @@ "aw48+4kEW7A=" ], "change trust pool share trustline|protocol version 26|pool trustline|too many|too many subentries" : [ "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=" ], + "change trust pool share trustline|protocol version 27" : + [ + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=" + ], + "change trust pool share trustline|protocol version 27|pool trustline" : + [ + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=", + "GOrIZdK4EWA=", + "umczPAeLSeI=", + "ZJfEanza+7I=", + "b3o+LA0MAQE=", + "NZSeZHyGNig=" + ], + "change trust pool share trustline|protocol version 27|pool trustline sponsorship" : [ "xIXr0bH0EOo=", "Dm2uoHTpU5s=", "JBBdfCqaFR4=" ], + "change trust pool share trustline|protocol version 27|pool trustline sponsorship|create, modify, and remove sponsored entry" : [ "4v5F70Baddw=" ], + "change trust pool share trustline|protocol version 27|pool trustline|below reserve" : [ "IJIdutocexU=", "IJIdutocexU=" ], + "change trust pool share trustline|protocol version 27|pool trustline|below reserve|delete pool share trustline while below the reserve" : [ "l/+mPeJlg1E=", "03ImO74hQL4=", "XQNfhTJy3JQ=", "u4hS+DYM4Ds=" ], + "change trust pool share trustline|protocol version 27|pool trustline|below reserve|delete sponsored pool share trustline while below the reserve" : + [ + "l/+mPeJlg1E=", + "03ImO74hQL4=", + "jZEV4Idmgds=", + "bo8SdhDkOfE=", + "8Sa505Nc0rY=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|existing pool with a native asset" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "tH7cGz2YfH8=", + "wMVdNefjzCI=", + "2jBGHpqK3LA=", + "xNgPy5bOLfw=", + "NWTqWdOn8S0=", + "kI7zGTbTgAw=", + "85mf41CycP4=", + "qPJDOLB7IvE=", + "pZStxLavcRQ=", + "/0O4p0G4IHA=", + "Cni5IFAtjkc=", + "pdUPcAQJE3c=", + "YGll1P5bsvo=", + "Jpiatb19P1k=", + "clmpS+PgZbc=", + "JEDXtKVWBAc=", + "YNwzqiFbCKo=", + "pxEQ8deRSwg=", + "Ae2brvpjbSA=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|existing pool with one issuer asset" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "8JrfhRc4myQ=", + "O+HlJerDQOQ=", + "qNImzimYYk0=", + "ZrW24morUyA=", + "YLNmrCkEcoQ=", + "5MFdstZ9eo4=", + "rncCPXAg8X8=", + "4bX1AkKSNnM=", + "w8HtKd8ETX8=", + "88lnovwJVcA=", + "zj0S8nETZV8=", + "Q7S4l3DxW+Y=", + "NRyYfpwPaeo=", + "tu4Kv0plV04=", + "t/dC9viivMM=", + "P7e+hWxyvew=", + "vsn3Ei4nDCw=", + "/GRAjfWVIhw=", + "3tHU7EfGR0g=", + "NRtZCsektXA=", + "pphE8W8nk5A=", + "DHNHuKBYdFE=", + "Afqcs1Ox+ug=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|existing pool with two issuer assets" : + [ + "OEPUOHLOEoE=", + "ZvZ0WOXhGyE=", + "8JrfhRc4myQ=", + "FieCbvQujPc=", + "qNImzimYYk0=", + "CO5hHDBrb+0=", + "YoBhB/RvbtY=", + "eieA9bJRBig=", + "KFtmJsWp0uE=", + "rVnncy7o4ls=", + "hxZc9HNq7dQ=", + "RvuBvmwRnnU=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|existing pool with two non-native assets" : + [ + "OEPUOHLOEoE=", + "+M9a8mke5Sw=", + "YGBSuAidDUw=", + "wSEsuL5cHkw=", + "qNImzimYYk0=", + "ZrW24morUyA=", + "YLNmrCkEcoQ=", + "5MFdstZ9eo4=", + "rncCPXAg8X8=", + "sJabMZaIBeo=", + "VmRA1hJwyPg=", + "P8tJnRY6zCA=", + "kYT2qHjpMfo=", + "8wNYeTTJaH4=", + "rqNifdj5fzE=", + "osZ1JGeONJY=", + "wxED9SUhh5Q=", + "YezIaYNurcw=", + "RxG2sU/eEAg=", + "SUwz6N9ufH8=", + "jytaFh9tJ/s=", + "Jdt8qpaPHxw=", + "5DYA2QVq7Qw=", + "edS8jPoD2wA=", + "zFuie3/nWe0=", + "k+FPiq9pHWk=", + "3e5nIkB4xKU=", + "DKxmPpeQjqI=", + "Ijoqfujr5Dw=", + "MQzpGt1J/N8=", + "Mz9Ee9MBo0Y=", + "yg+p0WfC3gw=", + "RO+5yqdjTZU=", + "sWXMVVlT1nA=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|low reserve" : + [ + "3No6kvp1D7I=", + "tJhnnjVS8Mc=", + "8VmotHeQtBQ=", + "sDmzSNb9u2g=", + "a7DP0lwPt0s=", + "mhG1p4u9RO8=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|new pool with a native asset" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "wZy5erCX0L4=", + "Hp2Olj7oXXw=", + "tBxPBh1d1QI=", + "YkaiTQ7imQM=", + "ab2tqUDqfhk=", + "G8P+f+RHP6U=", + "iVSp0d8Gg+s=", + "q2oZ1o37t7o=", + "DeeXoYn9UzI=", + "Ds1ou5sSVhQ=", + "CHOm6DqQHZI=", + "UD6UCaK+Fi4=", + "u1AwanACaoA=", + "Pgo3l3fbAFk=", + "PZoOde1hlww=", + "vCiOwOGC8Ow=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|new pool with one issuer asset" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "dEExw9gXiy0=", + "VszVdeNWzaA=", + "65CxRHWDR6Y=", + "fhGOLhNJVCg=", + "iPusuweuIA0=", + "W/1dj73Beb0=", + "rMCudO+O+9c=", + "6cEo7UraXL8=", + "asLBRfMClKY=", + "d6L9dtaWOfs=", + "eimErEsxjLw=", + "4RbmRjl2YS0=", + "z3lt1yjnK+8=", + "tQAxNhs0MmQ=", + "PPyxytOH/P8=", + "Vnu/QvMUmdk=", + "D6WVY3J0E+o=", + "cDl8FeELkf0=", + "rSGwMwCCGD0=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|new pool with two issuer assets" : + [ + "HwYjVPlyokM=", + "65FzmhW/cd0=", + "Z+yJEMvtYOI=", + "Tn2UjOstci4=", + "rEQax9Aoi4U=", + "aORoP/L6at8=", + "7mq2zPjCxL8=", + "acKmKVLetOo=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|new pool with two non-native assets" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "dEExw9gXiy0=", + "VszVdeNWzaA=", + "65CxRHWDR6Y=", + "oAaUvifbVJg=", + "sNaoeWUfnHw=", + "5VPtX5C8uy4=", + "DXJbFghABq0=", + "CCtm/0HOcl4=", + "wyL7/ql/9x0=", + "FY2cbLCwbrM=", + "EAju28gpAKg=", + "XSEI7AKeUDw=", + "v17c6BRAHlI=", + "O34D9y5KoIw=", + "NwSOYy4zdro=", + "L3xtRxXrsSs=", + "wViZsViX6LA=", + "rxEqMBj0nvQ=", + "jx6bL4057Kg=", + "+TwpAGQaTqM=", + "WLLYDvFFdXc=", + "u/eBT2w7DOU=", + "SARZEtgzXI4=", + "K1Uty2FcLlg=", + "pwufbJ/fvvY=", + "To+n9ytt/OY=", + "WgFg7ouiMas=", + "QCTLKVx2KYw=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|pool with two alphanum12 assets" : + [ + "HwYjVPlyokM=", + "KRz2GYiw7Pg=", + "l3E++G+qXMs=", + "VszVdeNWzaA=", + "1Agodn1ZBXQ=", + "oAaUvifbVJg=", + "ggddE9d3hm4=", + "5VPtX5C8uy4=", + "R/poZIkCjLs=", + "lZldXIrYbcw=", + "wyL7/ql/9x0=", + "FY2cbLCwbrM=", + "EAju28gpAKg=", + "XSEI7AKeUDw=", + "iyAOeCM/isw=", + "kymeieg3KRo=", + "o6poBaauEX0=", + "nv2OSFO5WZI=", + "hs8UAi+GX1Q=", + "PoUSElM/ykU=", + "cHT/zjYj4TI=", + "+TwpAGQaTqM=", + "WLLYDvFFdXc=", + "rXhRmZVMpww=", + "N1lSLAcDI5o=", + "4t2sJpp86UI=", + "PmN0WfU8WnA=", + "Waq1Pj+xHc4=", + "3oBznLFhLOs=", + "zPMajVl9Tuk=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets" : + [ + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=", + "Pc9+2kEReWY=", + "vMsx+mEJTVo=", + "RxED/1EsT0c=", + "xpignb4x81Y=", + "D8Wpno0BDHk=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|give account enough reserves to transfer the sponsorship" : [ "TFAlwEUi/fw=" ], + "change trust pool share trustline|protocol version 27|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|give owner enough reserves to take on the pool share trustline" : [ "CAxaqlPdDdg=" ], + "change trust pool share trustline|protocol version 27|pool trustline|sponsored pool share trustline where sponsor is issuer of both assets|try to transfer the sponsorship but fail" : [ "1Lz3lAoIBhk=" ], + "change trust pool share trustline|protocol version 27|pool trustline|too many" : + [ + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=", + "3No6kvp1D7I=", + "mM7jUscnnhk=", + "aw48+4kEW7A=" + ], + "change trust pool share trustline|protocol version 27|pool trustline|too many|too many subentries" : [ "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=", "Zl14zS6DzsE=" ], "change trust pool share trustline|protocol version 2|pool trustline" : [ "/lfj8xIFS8I=" ], "change trust pool share trustline|protocol version 2|pool trustline sponsorship" : [ "Vv+QRgIt0Cg=", "jba1E+ywrQM=", "TU5dHQFzjW0=" ], "change trust pool share trustline|protocol version 3" : [ "y3OKoeosX6s=", "y3OKoeosX6s=" ], @@ -5528,6 +5999,69 @@ "change trust|protocol version 26|too many|too many subentries" : [ "PG+6UqbLYsQ=", "PG+6UqbLYsQ=" ], "change trust|protocol version 26|trusting self" : [ "bX7cLSpsIqs=", "Ran3kHICmu0=" ], "change trust|protocol version 26|trustline on native asset" : [ "bX7cLSpsIqs=" ], + "change trust|protocol version 27" : + [ + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=", + "sh2pplTZS3U=" + ], + "change trust|protocol version 27|basic tests" : + [ + "GOrIZdK4EWA=", + "F1ZwdX8R8Wo=", + "Ao1tWPaJy6Y=", + "mo3OWoXTXVk=", + "EqqIZrDBAZA=", + "dRLKGj3jhJY=", + "0Iqam/50UYU=", + "CuaPOO6Ufvs=" + ], + "change trust|protocol version 27|cannot reduce limit below buying liabilities or delete" : + [ + "IcrOUU5F/8M=", + "NtcRxd3MoEY=", + "GdmSzpe/HXU=", + "x9i4ujqv/Js=", + "BZ2KsNaCAKg=", + "6BwB5XgF1kc=" + ], + "change trust|protocol version 27|create trust line with native buying liabilities" : [ "ozOXzNVBr3M=", "Nm6WGa5tG1I=", "8II0iGd5T0E=" ], + "change trust|protocol version 27|create trust line with native selling liabilities" : + [ + "ozOXzNVBr3M=", + "g+/6K99/PJs=", + "iCYVXgg/1Pg=", + "L92VcKnlzPw=", + "jp3g/Zp30QI=" + ], + "change trust|protocol version 27|issuer does not exist|edit existing" : [ "R3tSLDyYznk=", "7tMf92QFNqA=", "ubJYbsd08IQ=" ], + "change trust|protocol version 27|issuer does not exist|new trust line" : [ "GOrIZdK4EWA=" ], + "change trust|protocol version 27|sponsorship" : [ "h1Lx1hm4SRM=", "xTBz+kpeJZ4=", "h1Lx1hm4SRM=", "xTBz+kpeJZ4=" ], + "change trust|protocol version 27|sponsorship|create, modify, and remove sponsored entry" : [ "yznCBxYN5VA=" ], + "change trust|protocol version 27|too many" : + [ + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=", + "uUbOUG+H7mw=" + ], + "change trust|protocol version 27|too many|too many subentries" : [ "PG+6UqbLYsQ=", "PG+6UqbLYsQ=" ], + "change trust|protocol version 27|trusting self" : [ "bX7cLSpsIqs=", "Ran3kHICmu0=" ], + "change trust|protocol version 27|trustline on native asset" : [ "bX7cLSpsIqs=" ], "change trust|protocol version 2|basic tests" : [ "/lfj8xIFS8I=", diff --git a/test-tx-meta-baseline-next/ClaimableBalanceTests.json b/test-tx-meta-baseline-next/ClaimableBalanceTests.json index caea4c7e07..54df84f668 100644 --- a/test-tx-meta-baseline-next/ClaimableBalanceTests.json +++ b/test-tx-meta-baseline-next/ClaimableBalanceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "claimableBalance|protocol version 0" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 1" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], @@ -19179,6 +19180,1479 @@ "2vnUfjzq67A=", "nwUbQU2zWvU=" ], + "claimableBalance|protocol version 27" : + [ + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=", + "P5U3bpeWWIM=", + "M2RHOWZ/4Ic=", + "wsjsKqyCK48=", + "3aPZLt6Ifgc=" + ], + "claimableBalance|protocol version 27|claim claimable trustline issues" : + [ + "IF87YpW8M70=", + "p6UFEgHHfFo=", + "XKG+szxlT0s=", + "PiaBCNeVAS4=", + "F5fsbkUt1sg=", + "0XqQHyU3eqU=", + "TZ8NP1wfSHg=", + "WmowU27TiFw=", + "TE93kBOKEZs=", + "jJSBpPdUwxg=", + "+379KbDFQ0w=", + "4KHUyxFYaLA=" + ], + "claimableBalance|protocol version 27|claim is sponsored" : [ "wHdd57TIHfs=" ], + "claimableBalance|protocol version 27|create is sponsored" : [ "hZvzkHzw+lY=" ], + "claimableBalance|protocol version 27|invalid asset" : [ "xtHaja7O76w=" ], + "claimableBalance|protocol version 27|merge create account before claim" : [ "wHdd57TIHfs=", "s/kQ0KFX9zE=", "6/RFx4/TVUs=" ], + "claimableBalance|protocol version 27|merge sponsoring account" : [ "3cEJnQ+BKGw=", "QN+zg9n9BDo=" ], + "claimableBalance|protocol version 27|multiple claimants try to claim balance in same tx" : [ "Cz9zOTDmbx8=", "9weieLASzLA=", "Dw12IJrsLZk=" ], + "claimableBalance|protocol version 27|multiple creates in tx to test index in hash" : [ "/cZLoIvkgt4=", "ufpXmC+eyi0=" ], + "claimableBalance|protocol version 27|native" : + [ + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=", + "AlLyBt6kIxM=", + "4iHtv66w4Rs=", + "2XAb3Qb26KQ=", + "0bNJUQjVlZA=", + "oGjB0I/ZyyQ=", + "XHxHBtbtH/Q=" + ], + "claimableBalance|protocol version 27|native line full" : [ "9al6tq2MkrE=", "tmgSSpTjAXI=", "wIQZlLOuRIs=", "aIv19GtzMkA=" ], + "claimableBalance|protocol version 27|native|balanceID relies on sequence number" : + [ + "iQoYBQR3/k4=", + "xCMDTJ0kZwU=", + "CL/PUeiLHC0=", + "xRQl62UqJDM=", + "VdZQBBTQrdU=" + ], + "claimableBalance|protocol version 27|native|claim balance|balance does not exist" : [ "iQoYBQR3/k4=", "wZe6GyvOmXM=" ], + "claimableBalance|protocol version 27|native|claim balance|no destination match" : [ "iQoYBQR3/k4=", "ZKkXzbft2M8=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|NOT predicate not satisfied" : [ "bMpWX+lsnxI=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|absBefore not satisfied" : [ "l+NVVB04yWc=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|and predicate not satisfied" : [ "fAAyVBOjqTU=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|complex" : [ "f+Ob8NdSWl0=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|complex 2" : [ "ro1DopPX6Ys=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|complex 3" : [ "wfedr694Ndo=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|complex 4" : [ "nJY1NqC8fjQ=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|not unconditional" : [ "Dh9I2IWYMps=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|or predicate not satisfied" : [ "N6y7C1I9ku0=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate not satisfied|relBefore not satisfied" : [ "l+NVVB04yWc=", "TgYUMvbJMtI=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|NOT predicate satisfied" : [ "RoL07U39Lo0=", "IoTaXoom2Ro=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|Unconditional" : [ "guDU4SIN4LY=", "9flY4xCnPKA=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|absAfter satisfied" : [ "uPsLCXAVpZU=", "jO3cCIZ041I=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|absBefore satisfied" : [ "8Evd63a7S9g=", "SfqWPn8b8BM=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|and predicate satisfied" : [ "bBUGmf3NzlI=", "CVL8GLxVre4=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|complex 1" : [ "67AJMo1JQms=", "qWDFcXqfe6E=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|complex 2" : [ "k/67m5HA+e8=", "xiLvOHytr3c=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|complex 3" : [ "H1JDEetdGZ0=", "gtZj4tx9MIs=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|complex 4" : [ "2H6M/RT2ziA=", "yrJ3SA2Q/eA=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|complex 5" : [ "8pVVtCs9JYs=", "R1UT99Zn1/E=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|or predicate satisfied" : [ "zfojdeXqTLA=", "JECggEvrrEo=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|relAfter satisfied" : [ "uPsLCXAVpZU=", "jO3cCIZ041I=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|relBefore max satisfied" : [ "3pRcziFbCdY=", "603yLTiNxms=" ], + "claimableBalance|protocol version 27|native|claim balance|predicate satisfied|relBefore satisfied" : [ "8Evd63a7S9g=", "SfqWPn8b8BM=" ], + "claimableBalance|protocol version 27|native|multiple create and claims" : + [ + "iQoYBQR3/k4=", + "qDIQ0O651UQ=", + "81Dj16JXAzw=", + "VXyZOj4vx6A=", + "CS0keM/C/SU=" + ], + "claimableBalance|protocol version 27|native|successful createdBy == claimant|create and claim in different tx" : [ "nEFUKe7rrGM=", "sMh/VpB/x20=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=1" : [ "iQoYBQR3/k4=", "qDIQ0O651UQ=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=10" : [ "HU+TbRHa0PM=", "4IePD7nphZs=", "v/zwLFQsgzs=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=2" : [ "hIys2rqcpjA=", "rZizm/qaxfo=", "jJZQULd5rJQ=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=3" : [ "yTcYLRPvAVg=", "15xTSvZLBmk=", "3J0HfrNNDMg=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=4" : [ "TGIOfSzllS4=", "E+x3JnxHNjk=", "6BCxb2zfTfE=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=5" : [ "dIIHm/o0K30=", "LH24Wya57VI=", "GP6XCIA+KCU=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=6" : [ "OI6eNXdGGII=", "S778IAB8tKM=", "JfC2qvGh5dc=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=7" : [ "gg06gNt1D3w=", "RKMd8WJhlcU=", "7PvQDtSB7bs=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=8" : [ "UfmF5IvNxbs=", "c6345PWVuv4=", "OfllUeKyjZk=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|number of claimants=9" : [ "m+zwD30NPxU=", "hDp9HBUuJZM=", "Ce3VLdLzP4o=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|predicate at level 0" : [ "3pRcziFbCdY=", "UJJkuQ0Lnmo=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|predicate at level 1" : [ "AaLVjuRTixk=", "Z9Yi1pZIjKo=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|predicate at level 2" : [ "7WVmSTq3yP8=", "wy00/4E8u2E=" ], + "claimableBalance|protocol version 27|native|valid predicate and claimant combinations|predicate at level 3" : [ "iQoYBQR3/k4=", "DbJkQT/ZN8A=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid amount" : [ "fO5Hh5Gektc=", "eiOYWWzirgA=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|duplicate claimants" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|empty claimants" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid absBefore" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid andPredicate size" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid not nested" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid null not" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid orPredicate size" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid predicate height" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|native|validity checks|invalid claimants|invalid predicate|invalid relBefore" : [ "fO5Hh5Gektc=" ], + "claimableBalance|protocol version 27|non-native" : + [ + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=", + "zb40MJIjTdI=", + "8Ng622DdmG4=", + "Iy8IT87jOJk=", + "Zl81jCCtB+M=", + "85uaBDLQQIA=", + "NI4iceUamSE=", + "TmJEf2xgIMY=", + "Vi13NdUhf7s=" + ], + "claimableBalance|protocol version 27|non-native|balanceID relies on sequence number" : + [ + "mGKoAhww12o=", + "dgfpb9Uw624=", + "ZQHo0WBsZyk=", + "vCXfaWjfJqY=", + "cKHql/sFXiY=" + ], + "claimableBalance|protocol version 27|non-native|claim balance|balance does not exist" : [ "mGKoAhww12o=", "UegjVZrX3is=" ], + "claimableBalance|protocol version 27|non-native|claim balance|no destination match" : [ "mGKoAhww12o=", "+Xym0HeT/1Y=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|NOT predicate not satisfied" : [ "PNBAzMvx8hc=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|absBefore not satisfied" : [ "LkGvULA7Qh4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|and predicate not satisfied" : [ "xQQcLZ5c4I4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|complex" : [ "NySJUoyWDpM=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|complex 2" : [ "TNhNJQQa8/8=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|complex 3" : [ "WjTIVMkf2QM=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|complex 4" : [ "E9kz6Hnf3Ic=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|not unconditional" : [ "hLdOhomEx6E=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|or predicate not satisfied" : [ "2Hmj/Ceolds=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate not satisfied|relBefore not satisfied" : [ "LkGvULA7Qh4=", "NY7v6PPLICA=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|NOT predicate satisfied" : [ "E6bY3jbZnls=", "wVqZalLW8nQ=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|Unconditional" : [ "bO43G4ZE6z4=", "MQqfFv7OgLM=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|absAfter satisfied" : [ "lYGW071gUj0=", "ewyH//LimSI=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|absBefore satisfied" : [ "cKJaD6tJ6vQ=", "vB5msTlJb4U=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|and predicate satisfied" : [ "1atfKi31tGc=", "nuP5W0M/BsM=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|complex 1" : [ "kyhukCDkXmE=", "6Q0OKQGKS9c=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|complex 2" : [ "Deb/awR6TxY=", "dXXQ8TlqXtM=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|complex 3" : [ "Bu0xCTMFU7Y=", "SmMEEItbins=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|complex 4" : [ "5shv8SdOS3A=", "2dNt+qcCaXU=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|complex 5" : [ "WYW+yOVUAKY=", "kz00gKYKf7I=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|or predicate satisfied" : [ "AHdoF0mMUJY=", "NNyX9eOpDGQ=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|relAfter satisfied" : [ "lYGW071gUj0=", "ewyH//LimSI=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|relBefore max satisfied" : [ "+xbi8vlQwo8=", "2eLym8iTJfE=" ], + "claimableBalance|protocol version 27|non-native|claim balance|predicate satisfied|relBefore satisfied" : [ "cKJaD6tJ6vQ=", "vB5msTlJb4U=" ], + "claimableBalance|protocol version 27|non-native|multiple create and claims" : + [ + "mGKoAhww12o=", + "olWEQonFQr8=", + "aTzelVVtEOo=", + "j3VrKHElXSM=", + "p/ZZT9JnQ3w=" + ], + "claimableBalance|protocol version 27|non-native|successful createdBy == claimant|create and claim in different tx" : [ "KG4ZCfgo65c=", "Y1MZ52lf5PI=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=1" : [ "mGKoAhww12o=", "olWEQonFQr8=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=10" : [ "vhKz+vj0DrU=", "p25ZP/zG1jg=", "8/BP097P/Zc=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=2" : [ "3ARhLyvn2OE=", "+UPB4EN6Srg=", "kFVyAr8I1JM=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=3" : [ "qasdA7MPaMo=", "BFERMwbFGD4=", "Rd9ZzYoRlqQ=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=4" : [ "WP3FUudffQU=", "g/S41+dwTg4=", "Jk4/Bg2x2Pk=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=5" : [ "OiGx0C3V5BE=", "6dIM3Z5kYZQ=", "y0g4d5XyTSs=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=6" : [ "M/gFF3LrAgc=", "P/D+nMXsmVE=", "+PdU7A3U3Zs=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=7" : [ "4SbAL5JQ9jc=", "CTf49XXhY18=", "dtF1DSid7U4=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=8" : [ "yssmxi7YVv4=", "o5ao0wvOjTM=", "aiHRrA4OmiU=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|number of claimants=9" : [ "yWqzVjq3oEo=", "4Zt9ym8Pj+k=", "kUbRwy1jOT4=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|predicate at level 0" : [ "+xbi8vlQwo8=", "Sh6IF5umQp8=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|predicate at level 1" : [ "fJHNZXDwKf0=", "5enns/kRnn0=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|predicate at level 2" : [ "lXkZ5exmY+c=", "CzTSRiXH9Kc=" ], + "claimableBalance|protocol version 27|non-native|valid predicate and claimant combinations|predicate at level 3" : [ "mGKoAhww12o=", "oVRBC09Hnrs=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid amount" : [ "nbdFtMfH56E=", "6vitIf7N+kg=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|duplicate claimants" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|empty claimants" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid absBefore" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid andPredicate size" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid not nested" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid null not" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid orPredicate size" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid predicate height" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|non-native|validity checks|invalid claimants|invalid predicate|invalid relBefore" : [ "nbdFtMfH56E=" ], + "claimableBalance|protocol version 27|op source account last modified is updated on claim of sponsored balance|claim" : [ "Sa3QK3wT+nY=", "BOVxyPIP1dg=" ], + "claimableBalance|protocol version 27|op source account last modified is updated on claim of sponsored balance|clawback" : [ "rxy9AEEvLJY=", "3yNA702jlkw=", "rtUohNutExc=" ], + "claimableBalance|protocol version 27|source account is issuer" : [ "QCFQMKEfd2s=", "IoxuJAIJAeU=" ], + "claimableBalance|protocol version 27|tx account is different than op account on successful create" : [ "dupwEZTiUAc=", "/q42IhmfUv8=", "nD1CgBvPM9Q=", "Kku4R15nG5E=" ], + "claimableBalance|protocol version 27|validate tx account is used in hash" : + [ + "Z98WFIlrRGc=", + "JjkqnhkiCWE=", + "CLOAqVnKIhI=", + "sc5mPLLz4cM=", + "5VgvMEY9sIk=", + "5zV53bccDX0=", + "2vnUfjzq67A=", + "nwUbQU2zWvU=" + ], "claimableBalance|protocol version 2|not supported before version 14" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "claimableBalance|protocol version 3" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 3|not supported before version 14" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-next/ClawbackClaimableBalanceTests.json b/test-tx-meta-baseline-next/ClawbackClaimableBalanceTests.json index dae48f0a0d..06aae248a9 100644 --- a/test-tx-meta-baseline-next/ClawbackClaimableBalanceTests.json +++ b/test-tx-meta-baseline-next/ClawbackClaimableBalanceTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "clawbackClaimableBalance|protocol version 0" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], "clawbackClaimableBalance|protocol version 1" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], @@ -103,8 +104,8 @@ "Do+HQ7zDQXo=" ], "clawbackClaimableBalance|protocol version 17|basic test" : [ "NI0A4zxuiKs=", "vHiJqFzKwSo=", "Rcj3N7FarPU=", "DBA56dnFvoI=" ], - "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is issuer" : [ "bJvMffGuGro=", "E0pKlEQdz7o=" ], - "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is not issuer" : [ "Cp7Ps16cwGY=", "ntfZMpKFVNg=" ], + "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is issuer" : [ "cDG7PLIdGvk=", "bfqfQ1L1fXE=" ], + "clawbackClaimableBalance|protocol version 17|clawback sponsored claimable balance|sponsor is not issuer" : [ "kcd2xTfptjE=", "Rcj3N7FarPU=" ], "clawbackClaimableBalance|protocol version 17|clawback when issuer already has INT64_MAX liabilities" : [ "D9uwxUsRMmg=", "V+lofDv0638=", "1O3P9gT0QqY=" ], "clawbackClaimableBalance|protocol version 17|errors|not clawback enabled" : [ @@ -184,8 +185,8 @@ "Do+HQ7zDQXo=" ], "clawbackClaimableBalance|protocol version 18|basic test" : [ "NI0A4zxuiKs=", "vHiJqFzKwSo=", "Rcj3N7FarPU=", "DBA56dnFvoI=" ], - "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is issuer" : [ "bJvMffGuGro=", "E0pKlEQdz7o=" ], - "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is not issuer" : [ "Cp7Ps16cwGY=", "ntfZMpKFVNg=" ], + "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is issuer" : [ "cDG7PLIdGvk=", "bfqfQ1L1fXE=" ], + "clawbackClaimableBalance|protocol version 18|clawback sponsored claimable balance|sponsor is not issuer" : [ "kcd2xTfptjE=", "Rcj3N7FarPU=" ], "clawbackClaimableBalance|protocol version 18|clawback when issuer already has INT64_MAX liabilities" : [ "D9uwxUsRMmg=", "V+lofDv0638=", "1O3P9gT0QqY=" ], "clawbackClaimableBalance|protocol version 18|errors|not clawback enabled" : [ @@ -265,8 +266,8 @@ "M1925OX02LU=" ], "clawbackClaimableBalance|protocol version 19|basic test" : [ "DlVjWy6FyAk=", "/SlT/90/3rU=", "q3+ND7rJyEs=", "7/u+V6ZATgs=" ], - "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is issuer" : [ "JHpDvKOpZEk=", "tHDwzrcHDJM=" ], - "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is not issuer" : [ "cHKmO85ZelA=", "7pzi3ejC60w=" ], + "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is issuer" : [ "IubrCYeR6uQ=", "8pCnEVlLfyM=" ], + "clawbackClaimableBalance|protocol version 19|clawback sponsored claimable balance|sponsor is not issuer" : [ "toMCyRL+Wcs=", "q3+ND7rJyEs=" ], "clawbackClaimableBalance|protocol version 19|clawback when issuer already has INT64_MAX liabilities" : [ "tG7vmgNH0Ww=", "OZiPJFQQD38=", "AtwtMrLpwcY=" ], "clawbackClaimableBalance|protocol version 19|errors|not clawback enabled" : [ @@ -348,8 +349,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 20|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 20|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 20|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 20|errors|not clawback enabled" : [ @@ -429,8 +430,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 21|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 21|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 21|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 21|errors|not clawback enabled" : [ @@ -510,8 +511,8 @@ "PfDFotejSEo=" ], "clawbackClaimableBalance|protocol version 22|basic test" : [ "KVLGgtd1dNA=", "K0W44iWqwVA=", "tNKCBLVohUc=", "2QDwzx5plAI=" ], - "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is issuer" : [ "DegTt94PUPs=", "+C9j3MSMdn0=" ], - "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is not issuer" : [ "JC2VGYXnrrI=", "E6wJFb0TMcY=" ], + "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is issuer" : [ "/qRBdkfO82w=", "LYxL8lPLYcY=" ], + "clawbackClaimableBalance|protocol version 22|clawback sponsored claimable balance|sponsor is not issuer" : [ "KDdTW4dMwag=", "tNKCBLVohUc=" ], "clawbackClaimableBalance|protocol version 22|clawback when issuer already has INT64_MAX liabilities" : [ "8294rZiTT74=", "ZIcRGm2T57s=", "TfsRKUgSzus=" ], "clawbackClaimableBalance|protocol version 22|errors|not clawback enabled" : [ @@ -591,8 +592,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 23|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 23|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 23|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 23|errors|not clawback enabled" : [ @@ -672,8 +673,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 24|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 24|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 24|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 24|errors|not clawback enabled" : [ @@ -753,8 +754,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 25|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 25|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 25|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 25|errors|not clawback enabled" : [ @@ -834,8 +835,8 @@ "SyXTvYICbys=" ], "clawbackClaimableBalance|protocol version 26|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], - "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is issuer" : [ "02+2CuPbRfc=", "rlFxglIMQNw=" ], - "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is not issuer" : [ "TmPigIuZQZI=", "7iGCUifX55c=" ], + "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 26|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], "clawbackClaimableBalance|protocol version 26|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], "clawbackClaimableBalance|protocol version 26|errors|not clawback enabled" : [ @@ -861,6 +862,87 @@ "No/KX4ID5Ks=" ], "clawbackClaimableBalance|protocol version 26|successful alphanum12 clawback" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "oXVyUyVQNyc=" ], + "clawbackClaimableBalance|protocol version 27" : + [ + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=", + "E/2ZLTlhN0U=", + "WflRc/9sGlI=", + "drQT52uSTUU=", + "IPe8g6AAG08=", + "SyXTvYICbys=" + ], + "clawbackClaimableBalance|protocol version 27|basic test" : [ "r+qTfk8vBhc=", "9H+zCX9D72o=", "kvgLGCRzn0o=", "+/JxVMKqUeI=" ], + "clawbackClaimableBalance|protocol version 27|clawback sponsored claimable balance|sponsor is issuer" : [ "pR1kztpTOBc=", "U7DFWKUUrxE=" ], + "clawbackClaimableBalance|protocol version 27|clawback sponsored claimable balance|sponsor is not issuer" : [ "MMoHN5uFHf8=", "kvgLGCRzn0o=" ], + "clawbackClaimableBalance|protocol version 27|clawback when issuer already has INT64_MAX liabilities" : [ "Ne6CMDJKGQg=", "YAPgwFlna3s=", "k2iCsR/nSqo=" ], + "clawbackClaimableBalance|protocol version 27|errors|not clawback enabled" : + [ + "snRVLS8NG54=", + "EMW6NGkgAlU=", + "DlvgrtUeZXU=", + "NlZWujO3CtM=", + "Zuw/Wo5XpIo=", + "e8ldBQMwH/E=" + ], + "clawbackClaimableBalance|protocol version 27|errors|not issuer|assetCode12" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "4/UXi8efC94=" ], + "clawbackClaimableBalance|protocol version 27|errors|not issuer|assetCode4" : [ "r+qTfk8vBhc=", "NFA79rSVcQQ=" ], + "clawbackClaimableBalance|protocol version 27|errors|not issuer|native" : [ "oMiqMnps6gw=", "bc/WP0iyag8=" ], + "clawbackClaimableBalance|protocol version 27|issuer claimable balance" : + [ + "snRVLS8NG54=", + "58bXYWrZd/Y=", + "18ywOwQoMog=", + "S4sNXr7ODL8=", + "ZPaDlc4A3j0=", + "/yeTKVVM40Y=", + "ZU0nhP0eeQI=", + "No/KX4ID5Ks=" + ], + "clawbackClaimableBalance|protocol version 27|successful alphanum12 clawback" : [ "DNl3tkm3rDc=", "TFgVfPNhpzI=", "j6W8kM2P3Uo=", "oXVyUyVQNyc=" ], "clawbackClaimableBalance|protocol version 2|pre V17 errors" : [ "/lfj8xIFS8I=" ], "clawbackClaimableBalance|protocol version 3" : [ "5KGCodU10M4=", "8+8sE8mGx6k=" ], "clawbackClaimableBalance|protocol version 3|pre V17 errors" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-next/ClawbackTests.json b/test-tx-meta-baseline-next/ClawbackTests.json index 046fd19d50..583bd421c1 100644 --- a/test-tx-meta-baseline-next/ClawbackTests.json +++ b/test-tx-meta-baseline-next/ClawbackTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "clawback|protocol version 0" : [ @@ -1329,6 +1330,125 @@ ], "clawback|protocol version 26|from V17|errors|set options" : [ "0Tfxm4XVEr0=", "d+6niptq9w4=", "tdqsDRpoM3s=" ], "clawback|protocol version 26|from V17|errors|set options clawback immutable" : [ "l77R48sqLpw=", "AH57wge7wl8=", "RkaLElBC+CY=" ], + "clawback|protocol version 27" : + [ + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=", + "Dy9L2beyoqI=", + "yK6SzJU7bnQ=" + ], + "clawback|protocol version 27|all version errors" : [ "p4/WJEhlYrk=" ], + "clawback|protocol version 27|from V17" : + [ + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=", + "oFsNPa6txrU=", + "Z71sYDgOc+E=", + "sk9GRafbppU=" + ], + "clawback|protocol version 27|from V17|allow trust" : [ "n6LIgU69wl0=", "n6LIgU69wl0=", "n6LIgU69wl0=" ], + "clawback|protocol version 27|from V17|allow trust|allow trust can't set clawback" : [ "2IteCfyCwhU=", "sTAww/zzaMA=" ], + "clawback|protocol version 27|from V17|allow trust|clawback after revoking auth" : [ "i0CxNCezxac=", "oCDi/0Bb1hY=" ], + "clawback|protocol version 27|from V17|allow trust|clawback after revoking auth to AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG" : [ "5l7/Tyy8zGY=", "uS/pzWBz1oo=" ], + "clawback|protocol version 27|from V17|basic test" : [ "lZTJiD6j/6I=" ], + "clawback|protocol version 27|from V17|clawback after removing liabilites" : + [ + "n6LIgU69wl0=", + "1lZte7ya2Eo=", + "SomBRcy0dYI=", + "UcZprHwrsAI=", + "e9Bkr7o90Mc=" + ], + "clawback|protocol version 27|from V17|clawback when issuer already has INT64_MAX liabilities" : [ "iuNv6Bi0CT0=", "2LCZG/Gsjw4=" ], + "clawback|protocol version 27|from V17|errors|apply|no trust" : [ "0Tfxm4XVEr0=" ], + "clawback|protocol version 27|from V17|errors|apply|not clawback enabled" : [ "0balGGSFtIM=", "qVlDsyHEP/8=", "nWIiEArIuP4=", "iYyoqUwRP44=" ], + "clawback|protocol version 27|from V17|errors|apply|underfunded" : [ "0Tfxm4XVEr0=", "1lZte7ya2Eo=", "UDIlEKz5C9w=", "13DJ/ZYpDZQ=" ], + "clawback|protocol version 27|from V17|errors|check validity" : + [ + "0Tfxm4XVEr0=", + "0LP5DLjBmuc=", + "bK6vnjBD0VQ=", + "drjFOKZHvC0=", + "9rNmV2HCIHo=", + "cIVGh/yHpfE=", + "Z5uq8uXGf+U=", + "BP5deJCm8Vc=", + "j+2qhP5UkQQ=", + "m7+a9+0Xa00=", + "ebv6hZx31rY=", + "bQz/QnTg+Gs=", + "JTW7WKA2nrI=", + "QQsmtXSSMV8=", + "4OQurciAuA8=", + "tdcidOTzj0o=", + "DcjA5DGNg6c=", + "YgXTAsQrOww=", + "yXX1M25JdY8=", + "S9vKwOdc9us=", + "u6AfaV6kAaE=", + "ICitmJpn33I=", + "tiirdAWMjSI=", + "pA0fozCtzFg=", + "pOPWDxSWLJs=", + "N4IpepbVE94=" + ], + "clawback|protocol version 27|from V17|errors|set options" : [ "0Tfxm4XVEr0=", "d+6niptq9w4=", "tdqsDRpoM3s=" ], + "clawback|protocol version 27|from V17|errors|set options clawback immutable" : [ "l77R48sqLpw=", "AH57wge7wl8=", "RkaLElBC+CY=" ], "clawback|protocol version 2|all version errors" : [ "/lfj8xIFS8I=" ], "clawback|protocol version 2|pre V17 errors" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "clawback|protocol version 3" : diff --git a/test-tx-meta-baseline-next/CreateAccountTests.json b/test-tx-meta-baseline-next/CreateAccountTests.json index b97b7138bd..d419ea765a 100644 --- a/test-tx-meta-baseline-next/CreateAccountTests.json +++ b/test-tx-meta-baseline-next/CreateAccountTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "create account|protocol version 10|Amount too small to create account" : [ "X2yKCWehH5U=" ], "create account|protocol version 10|Not enough funds (source)" : [ "x6hOin79MFA=", "6VHOcmD0yD4=" ], @@ -258,6 +259,19 @@ "hrHXWVqKXGE=", "DWKVsFqPjZM=" ], + "create account|protocol version 27|Amount too small to create account" : [ "Zby/J3+a3+M=" ], + "create account|protocol version 27|Not enough funds (source)" : [ "MSQOA5zJeR0=", "eLoxbAMaFeM=" ], + "create account|protocol version 27|Success" : [ "d9drKjBULJU=" ], + "create account|protocol version 27|Success|Account already exists" : [ "15rvbjTq2Ig=" ], + "create account|protocol version 27|with native buying liabilities" : [ "BuDREniMj40=", "hOPYBhC5f80=", "gsKAaaHOdCw=" ], + "create account|protocol version 27|with native selling liabilities" : + [ + "BuDREniMj40=", + "WpBVt4ChwFU=", + "WtsecA6H5uM=", + "hrHXWVqKXGE=", + "DWKVsFqPjZM=" + ], "create account|protocol version 2|Amount too small to create account" : [ "/lfj8xIFS8I=" ], "create account|protocol version 2|Not enough funds (source)" : [ "4+svrnV0hxY=", "/lfj8xIFS8I=" ], "create account|protocol version 2|Success" : [ "IxXegoyiQk4=" ], diff --git a/test-tx-meta-baseline-next/EndSponsoringFutureReservesTests.json b/test-tx-meta-baseline-next/EndSponsoringFutureReservesTests.json index 3795dba606..1799c2f5ab 100644 --- a/test-tx-meta-baseline-next/EndSponsoringFutureReservesTests.json +++ b/test-tx-meta-baseline-next/EndSponsoringFutureReservesTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "confirm and clear sponsor|protocol version 13|not supported" : [ "QJDMJ0PvkYA=" ], "confirm and clear sponsor|protocol version 14|not sponsored" : [ "QJDMJ0PvkYA=" ], @@ -46,5 +47,6 @@ "confirm and clear sponsor|protocol version 23|not sponsored" : [ "5KjEutNtf8g=" ], "confirm and clear sponsor|protocol version 24|not sponsored" : [ "5KjEutNtf8g=" ], "confirm and clear sponsor|protocol version 25|not sponsored" : [ "5KjEutNtf8g=" ], - "confirm and clear sponsor|protocol version 26|not sponsored" : [ "5KjEutNtf8g=" ] + "confirm and clear sponsor|protocol version 26|not sponsored" : [ "5KjEutNtf8g=" ], + "confirm and clear sponsor|protocol version 27|not sponsored" : [ "5KjEutNtf8g=" ] } diff --git a/test-tx-meta-baseline-next/EventTests.json b/test-tx-meta-baseline-next/EventTests.json index d21db62196..7aa840cabd 100644 --- a/test-tx-meta-baseline-next/EventTests.json +++ b/test-tx-meta-baseline-next/EventTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "payment events|protocol version 0" : [ @@ -405,6 +406,25 @@ "payment events|protocol version 26|mint event (payer is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], "payment events|protocol version 26|mint event with memo ID" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], "payment events|protocol version 26|with tx memo" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 27" : + [ + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=", + "PM6oEIMJJ0s=" + ], + "payment events|protocol version 27|a pays b, a is mux" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 27|a pays b, b is mux" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 27|a pays b. Also validate fee event" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 27|burn event (payee is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=", "urzqLiB3Ryo=" ], + "payment events|protocol version 27|memo order of precedence" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], + "payment events|protocol version 27|mint event (payer is issuer)" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], + "payment events|protocol version 27|mint event with memo ID" : [ "/sivEP6YNuk=", "ieAQ0aL6H5A=" ], + "payment events|protocol version 27|with tx memo" : [ "/sivEP6YNuk=", "GOHogd0W7oA=" ], "payment events|protocol version 2|a pays b, a is mux" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], "payment events|protocol version 2|a pays b, b is mux" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], "payment events|protocol version 2|a pays b. Also validate fee event" : [ "4PeZDD6OQd8=", "gYxnOGKrh9E=" ], diff --git a/test-tx-meta-baseline-next/FeeBumpTransactionTests.json b/test-tx-meta-baseline-next/FeeBumpTransactionTests.json index 77fadb2045..ca01a8feb8 100644 --- a/test-tx-meta-baseline-next/FeeBumpTransactionTests.json +++ b/test-tx-meta-baseline-next/FeeBumpTransactionTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "fee bump transactions|protocol version 0|apply|bad signatures" : [ "Yhe2gNuDHbY=" ], "fee bump transactions|protocol version 0|apply|extra signatures" : [ "OB5K2o+Lbus=", "2vq/WrMO01Y=" ], @@ -345,6 +346,23 @@ "fee bump transactions|protocol version 26|validity|inner transaction invalid, transaction level" : [ "/7ACbejmtbQ=" ], "fee bump transactions|protocol version 26|validity|insufficient balance" : [ "urCUjHnhTso=" ], "fee bump transactions|protocol version 26|validity|valid" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 27|apply|bad signatures" : [ "NhEx+s6J1Zs=", "yP8dhV0/pQM=" ], + "fee bump transactions|protocol version 27|apply|extra signatures" : [ "CdLCGSh1huU=", "MOQMoybQQxc=", "CwphNloF/gQ=" ], + "fee bump transactions|protocol version 27|apply|fee source does not exist" : [ "NhEx+s6J1Zs=", "fYD+RdGUZ7w=" ], + "fee bump transactions|protocol version 27|apply|inner transaction fails, operation level" : [ "NhEx+s6J1Zs=" ], + "fee bump transactions|protocol version 27|apply|inner transaction fails, transaction level" : [ "NhEx+s6J1Zs=", "xID29F/qzKk=" ], + "fee bump transactions|protocol version 27|apply|insufficient balance" : [ "NhEx+s6J1Zs=", "yE2a74X0L7w=" ], + "fee bump transactions|protocol version 27|apply|one-time signer removal" : [ "H0brR3zmSJ4=", "N/hrQ2v7Thk=", "H0brR3zmSJ4=", "N/hrQ2v7Thk=" ], + "fee bump transactions|protocol version 27|apply|one-time signer removal|not sponsored" : [ "8+/oNk7vshI=", "DaR9c0iTG2k=" ], + "fee bump transactions|protocol version 27|apply|one-time signer removal|sponsored" : [ "8+/oNk7vshI=" ], + "fee bump transactions|protocol version 27|fee processing" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 27|validity|bad signatures, signature invalid" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 27|validity|bad signatures, signature missing" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 27|validity|extra signatures" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 27|validity|inner transaction invalid, operation level" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 27|validity|inner transaction invalid, transaction level" : [ "/7ACbejmtbQ=" ], + "fee bump transactions|protocol version 27|validity|insufficient balance" : [ "urCUjHnhTso=" ], + "fee bump transactions|protocol version 27|validity|valid" : [ "/7ACbejmtbQ=" ], "fee bump transactions|protocol version 2|apply|bad signatures" : [ "Yhe2gNuDHbY=" ], "fee bump transactions|protocol version 2|apply|extra signatures" : [ "OB5K2o+Lbus=", "2vq/WrMO01Y=" ], "fee bump transactions|protocol version 2|apply|fee source does not exist" : [ "Yhe2gNuDHbY=" ], diff --git a/test-tx-meta-baseline-next/FrozenLedgerKeysTests.json b/test-tx-meta-baseline-next/FrozenLedgerKeysTests.json new file mode 100644 index 0000000000..124eeef058 --- /dev/null +++ b/test-tx-meta-baseline-next/FrozenLedgerKeysTests.json @@ -0,0 +1,2067 @@ + +{ + "!cfg protocol version" : 27, + "!rng seed" : 12345, + "!test all versions" : true, + "!versions to test" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ], + "deauth removes offers on frozen account" : + [ + "DacWHBn53mA=", + "BHt32BfGHdg=", + "thRTR69es+0=", + "RQrU/aegI2c=", + "liUp8uVOyp0=", + "iRy/J6geXLQ=", + "GDoBb0yXRAQ=" + ], + "freeze bypass tx hash allows frozen key access at validation time" : + [ + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "6CmtErdDHKk=" + ], + "frozen ledger keys DEX offer operations" : + [ + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=", + "dROvjn1oZgA=", + "wgVEL6+CtcI=", + "4Y7TSWNjzJ8=", + "z35KLOsU0zI=", + "6LEMxT4kV2k=", + "kpWFkyAJ7r0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [create-passive-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-buy][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "7HURPDSCy34=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "FrdcvWcrVJ0=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer active [manage-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "s1oXN6i+Kyo=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [create-passive-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-buy][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "ccRHbVieTsw=", + "SIk6EzSNNIU=", + "YTXYxQkECjo=", + "D03a2r64awc=", + "u0m/JV4s3Q0=", + "HoyNmTSXTcI=", + "camVDOU0C7I=", + "lVgryQtUCw0=", + "b4bdwQpMOHE=", + "FnMTkn9Jn2E=", + "MW1Dtly8A6o=", + "lvrZR5qo+vs=", + "aRfpkC8fg1w=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][both-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][credit-native][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "6VjQbqbbuAk=", + "jDnZQ4ZgABk=", + "6KQbVLRdk3w=", + "7/YQuwhh6TI=", + "iM5ZOHIqzLg=", + "1eRHliGXeqs=", + "iTycvSyljs0=", + "XkrrDvK4zSs=", + "kgx5PwmlbjA=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][both-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][buying-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX offer operations|second offer frozen [manage-sell][native-credit][selling-frozen]" : + [ + "5T6l8LjCUkY=", + "254mVlqDxAE=", + "jDnZQ4ZgABk=", + "dXFJT+pLeTg=", + "7/YQuwhh6TI=", + "bMdsOUzGrZM=", + "1eRHliGXeqs=", + "XSuqNLC2K3o=", + "ccLd/umPUiE=", + "IOM0KKSLRP0=" + ], + "frozen ledger keys DEX path payments" : + [ + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=", + "aY2C4p/9qcw=", + "zJ9sGQUvfGQ=", + "7fYvXIbcZyE=", + "i6aZ1T5L9P8=", + "U4Pbx19vJ8M=", + "HiIoDPEX+eE=", + "uDXezWa8xNQ=", + "T/GEMUgvPtQ=", + "+kr9gYlStNc=", + "/reDqinGgXY=", + "OXwiBQJqOns=", + "5BuQgUu787I=", + "38Z6pSP9oI4=", + "Zz623bsxVkA=", + "U6QHjN+rP8g=", + "tX5RfCrgFH0=", + "Aqw277PxgNk=", + "BrcCIiO0L+s=", + "6xsrkSKswk0=", + "JEIuT9C8xmE=", + "eqlPRZunMmE=", + "P5PONQu76y0=", + "lZIRo+LomGw=", + "bNJtJaqUne0=", + "AXy4uiwhM+I=", + "/w9rxRGo2Qw=", + "eO7T3jT6jBM=", + "t8zuSIlPQiQ=", + "9QCBdUrXc6k=", + "GrNiQ/qnODo=" + ], + "frozen ledger keys apply time validation" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=" + ], + "frozen ledger keys apply time validation|claim claimable balance trustline frozen" : [ "KWQKyjBIFco=" ], + "frozen ledger keys apply time validation|liquidity pool deposit assetA trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool deposit assetB trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool withdraw assetA trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys apply time validation|liquidity pool withdraw assetB trustline frozen" : [ "68zQEnUoWak=", "94Lxi/EzWuw=" ], + "frozen ledger keys in Soroban footprint" : [ "E/Hp+63+Q2Y=" ], + "operation destination frozen" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=" + ], + "operation destination frozen|ClawbackOp from trustline frozen" : [ "dl3b5XRie08=", "6Umcp50dy1w=", "NCE6KjdBf2I=", "6eJJgJRJRVk=" ], + "operation destination frozen|SetTrustLineFlagsOp trustor trustline frozen" : [ "FFNGCyg5dJ4=" ], + "source account frozen" : + [ + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=", + "cpVo6Aho2ao=", + "IBmLxZVWm4Y=" + ], + "source account frozen|fee bump source account frozen" : [ "6CmtErdDHKk=" ], + "source account frozen|one of multiple ops source account frozen" : [ "OnSCl340l+U=", "OBYw8xSVvlY=" ], + "source account frozen|op source account frozen" : [ "Z4OpilPA/jk=" ], + "source account frozen|op source frozen via muxed account ID" : [ "R01UcLdO4lI=" ], + "source trustline frozen" : + [ + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=", + "tMoQ2Vse5tc=", + "xORLh0b3QZY=", + "zmU28zD7PUE=", + "GpZOJFWuGak=", + "Qx1IqUzjv2w=", + "VPGZIGfI6Rg=", + "bXNUiwR2HR0=", + "PAmiGhwY1GA=", + "NHP1/DNlYAw=", + "y2oaGajRq7Y=", + "KmiMr73908A=" + ], + "sponsorship can be removed with frozen sponsor" : [ "DNbanX3bsGI=", "A6H9fxI4C/k=", "eUPWbi2D4Bc=" ] +} diff --git a/test-tx-meta-baseline-next/InflationTests.json b/test-tx-meta-baseline-next/InflationTests.json index 61e7bee862..812f52fc41 100644 --- a/test-tx-meta-baseline-next/InflationTests.json +++ b/test-tx-meta-baseline-next/InflationTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "inflation|protocol version 10|inflation scenarios|50/50 split" : [ @@ -46,8 +47,7 @@ "okLol2/zzkI=", "B5S2fRH2ri8=", "ElojLaOm1x8=", - "15i9Ac2qDrA=", - "I4s+Pkequ8c=" + "15i9Ac2qDrA=" ], "inflation|protocol version 10|inflation scenarios|all to one destination" : [ @@ -62,8 +62,7 @@ "VTMnSq4QfAo=", "Y0RBsIJxSE8=", "8xhlGIhx6f0=", - "mBql+0cJxK4=", - "fCo+/8egePU=" + "mBql+0cJxK4=" ], "inflation|protocol version 10|inflation scenarios|no one over min" : [ @@ -79,7 +78,6 @@ "0OQKWDOLqnw=", "gTd5waf6+pY=", "whqO/nU1IEQ=", - "CMs2zJVJdIw=", "zes9HSGAPb4=", "3CS1kePxH6Q=", "cRAGh4ul+Xk=", @@ -2279,8 +2277,7 @@ "SkAzeo4YgPs=", "Jval1YuxC6w=", "VwHDrLXwm2c=", - "IS91VZZhfUQ=", - "7ijobQ0fB+Y=" + "IS91VZZhfUQ=" ], "inflation|protocol version 10|inflation scenarios|no winner" : [ @@ -2295,8 +2292,7 @@ "GKCPV2dubW8=", "0OQKWDOLqnw=", "gTd5waf6+pY=", - "whqO/nU1IEQ=", - "CMs2zJVJdIw=" + "whqO/nU1IEQ=" ], "inflation|protocol version 10|inflation scenarios|some winner does not exist" : [ @@ -2311,8 +2307,7 @@ "YdBenUbFiEc=", "AzhHkyOSuPM=", "tjrvBlONHHc=", - "KBqgRxqJvGM=", - "KFHhqn/7IGw=" + "KBqgRxqJvGM=" ], "inflation|protocol version 10|inflation scenarios|two guys over threshold" : [ @@ -2435,41 +2430,12 @@ "HjFEn03j0O4=", "vSfv6dmnldw=", "b9sqKjeGb58=", - "BaWwvPGbVs8=", - "arnsoVdb5+s=" - ], - "inflation|protocol version 10|inflation with liabilities|available balance greater than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "6EPKgfSY9sE=", - "bSP0fZ3GGHs=", - "7JSijM9osnU=" - ], - "inflation|protocol version 10|inflation with liabilities|large available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "B/4xkrwFZEA=", - "kgm9Iohtweg=", - "Zf1mhZEHVdU=" - ], - "inflation|protocol version 10|inflation with liabilities|no available balance" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "LIrttP4HQjY=", - "z3ftJsvTIBo=", - "jwLsLdvf5FY=" - ], - "inflation|protocol version 10|inflation with liabilities|small available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "UXKxM34HcWE=", - "61+zX+N8RQg=", - "xu7ZC272ZdM=" + "BaWwvPGbVs8=" ], + "inflation|protocol version 10|inflation with liabilities|available balance greater than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "6EPKgfSY9sE=", "bSP0fZ3GGHs=" ], + "inflation|protocol version 10|inflation with liabilities|large available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "B/4xkrwFZEA=", "kgm9Iohtweg=" ], + "inflation|protocol version 10|inflation with liabilities|no available balance" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "LIrttP4HQjY=", "z3ftJsvTIBo=" ], + "inflation|protocol version 10|inflation with liabilities|small available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "UXKxM34HcWE=", "61+zX+N8RQg=" ], "inflation|protocol version 10|not time" : [ "7lvxYNMEkXM=", @@ -2492,8 +2458,7 @@ "okLol2/zzkI=", "B5S2fRH2ri8=", "ElojLaOm1x8=", - "15i9Ac2qDrA=", - "I4s+Pkequ8c=" + "15i9Ac2qDrA=" ], "inflation|protocol version 11|inflation scenarios|all to one destination" : [ @@ -2508,8 +2473,7 @@ "VTMnSq4QfAo=", "Y0RBsIJxSE8=", "8xhlGIhx6f0=", - "mBql+0cJxK4=", - "fCo+/8egePU=" + "mBql+0cJxK4=" ], "inflation|protocol version 11|inflation scenarios|no one over min" : [ @@ -2525,7 +2489,6 @@ "0OQKWDOLqnw=", "gTd5waf6+pY=", "whqO/nU1IEQ=", - "CMs2zJVJdIw=", "zes9HSGAPb4=", "3CS1kePxH6Q=", "cRAGh4ul+Xk=", @@ -4725,8 +4688,7 @@ "SkAzeo4YgPs=", "Jval1YuxC6w=", "VwHDrLXwm2c=", - "IS91VZZhfUQ=", - "7ijobQ0fB+Y=" + "IS91VZZhfUQ=" ], "inflation|protocol version 11|inflation scenarios|no winner" : [ @@ -4741,8 +4703,7 @@ "GKCPV2dubW8=", "0OQKWDOLqnw=", "gTd5waf6+pY=", - "whqO/nU1IEQ=", - "CMs2zJVJdIw=" + "whqO/nU1IEQ=" ], "inflation|protocol version 11|inflation scenarios|some winner does not exist" : [ @@ -4757,8 +4718,7 @@ "YdBenUbFiEc=", "AzhHkyOSuPM=", "tjrvBlONHHc=", - "KBqgRxqJvGM=", - "KFHhqn/7IGw=" + "KBqgRxqJvGM=" ], "inflation|protocol version 11|inflation scenarios|two guys over threshold" : [ @@ -4881,41 +4841,12 @@ "HjFEn03j0O4=", "vSfv6dmnldw=", "b9sqKjeGb58=", - "BaWwvPGbVs8=", - "arnsoVdb5+s=" - ], - "inflation|protocol version 11|inflation with liabilities|available balance greater than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "6EPKgfSY9sE=", - "bSP0fZ3GGHs=", - "7JSijM9osnU=" - ], - "inflation|protocol version 11|inflation with liabilities|large available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "B/4xkrwFZEA=", - "kgm9Iohtweg=", - "Zf1mhZEHVdU=" - ], - "inflation|protocol version 11|inflation with liabilities|no available balance" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "LIrttP4HQjY=", - "z3ftJsvTIBo=", - "jwLsLdvf5FY=" - ], - "inflation|protocol version 11|inflation with liabilities|small available balance less than payout" : - [ - "oBhuxnqQM50=", - "vdeMArhjmbU=", - "UXKxM34HcWE=", - "61+zX+N8RQg=", - "xu7ZC272ZdM=" + "BaWwvPGbVs8=" ], + "inflation|protocol version 11|inflation with liabilities|available balance greater than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "6EPKgfSY9sE=", "bSP0fZ3GGHs=" ], + "inflation|protocol version 11|inflation with liabilities|large available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "B/4xkrwFZEA=", "kgm9Iohtweg=" ], + "inflation|protocol version 11|inflation with liabilities|no available balance" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "LIrttP4HQjY=", "z3ftJsvTIBo=" ], + "inflation|protocol version 11|inflation with liabilities|small available balance less than payout" : [ "oBhuxnqQM50=", "vdeMArhjmbU=", "UXKxM34HcWE=", "61+zX+N8RQg=" ], "inflation|protocol version 11|not time" : [ "7lvxYNMEkXM=", @@ -4946,8 +4877,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 1|inflation scenarios|all to one destination" : [ @@ -4962,8 +4892,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 1|inflation scenarios|no one over min" : [ @@ -4979,7 +4908,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -7179,8 +7107,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 1|inflation scenarios|no winner" : [ @@ -7195,8 +7122,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 1|inflation scenarios|some winner does not exist" : [ @@ -7211,8 +7137,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 1|inflation scenarios|two guys over threshold" : [ @@ -7335,41 +7260,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 1|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 1|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 1|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 1|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 1|not time" : [ "/lfj8xIFS8I=", @@ -7386,6 +7282,7 @@ "inflation|protocol version 24|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 25|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 26|not supported" : [ "Zby/J3+a3+M=" ], + "inflation|protocol version 27|not supported" : [ "Zby/J3+a3+M=" ], "inflation|protocol version 2|inflation scenarios|50/50 split" : [ "kLAIaEj7I2M=", @@ -7399,8 +7296,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 2|inflation scenarios|all to one destination" : [ @@ -7415,8 +7311,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 2|inflation scenarios|no one over min" : [ @@ -7432,7 +7327,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -9632,8 +9526,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 2|inflation scenarios|no winner" : [ @@ -9648,8 +9541,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 2|inflation scenarios|some winner does not exist" : [ @@ -9664,8 +9556,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 2|inflation scenarios|two guys over threshold" : [ @@ -9788,41 +9679,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 2|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 2|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 2|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 2|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 2|not time" : [ "/lfj8xIFS8I=", @@ -9845,8 +9707,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 3|inflation scenarios|all to one destination" : [ @@ -9861,8 +9722,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 3|inflation scenarios|no one over min" : [ @@ -9878,7 +9738,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -12078,8 +11937,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 3|inflation scenarios|no winner" : [ @@ -12094,8 +11952,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 3|inflation scenarios|some winner does not exist" : [ @@ -12110,8 +11967,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 3|inflation scenarios|two guys over threshold" : [ @@ -12234,41 +12090,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 3|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 3|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 3|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 3|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 3|not time" : [ "/lfj8xIFS8I=", @@ -12291,8 +12118,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 4|inflation scenarios|all to one destination" : [ @@ -12307,8 +12133,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 4|inflation scenarios|no one over min" : [ @@ -12324,7 +12149,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -14524,8 +14348,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 4|inflation scenarios|no winner" : [ @@ -14540,8 +14363,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 4|inflation scenarios|some winner does not exist" : [ @@ -14556,8 +14378,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 4|inflation scenarios|two guys over threshold" : [ @@ -14680,41 +14501,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 4|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 4|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 4|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 4|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 4|not time" : [ "/lfj8xIFS8I=", @@ -14737,8 +14529,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 5|inflation scenarios|all to one destination" : [ @@ -14753,8 +14544,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 5|inflation scenarios|no one over min" : [ @@ -14770,7 +14560,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -16970,8 +16759,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 5|inflation scenarios|no winner" : [ @@ -16986,8 +16774,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 5|inflation scenarios|some winner does not exist" : [ @@ -17002,8 +16789,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 5|inflation scenarios|two guys over threshold" : [ @@ -17126,41 +16912,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 5|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 5|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 5|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 5|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 5|not time" : [ "/lfj8xIFS8I=", @@ -17183,8 +16940,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 6|inflation scenarios|all to one destination" : [ @@ -17199,8 +16955,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 6|inflation scenarios|no one over min" : [ @@ -17216,7 +16971,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -19416,8 +19170,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 6|inflation scenarios|no winner" : [ @@ -19432,8 +19185,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 6|inflation scenarios|some winner does not exist" : [ @@ -19448,8 +19200,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 6|inflation scenarios|two guys over threshold" : [ @@ -19572,41 +19323,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 6|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 6|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 6|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 6|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 6|not time" : [ "/lfj8xIFS8I=", @@ -19629,8 +19351,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 7|inflation scenarios|all to one destination" : [ @@ -19645,8 +19366,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 7|inflation scenarios|no one over min" : [ @@ -19662,7 +19382,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -21862,8 +21581,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 7|inflation scenarios|no winner" : [ @@ -21878,8 +21596,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 7|inflation scenarios|some winner does not exist" : [ @@ -21894,8 +21611,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 7|inflation scenarios|two guys over threshold" : [ @@ -22018,41 +21734,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 7|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 7|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 7|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 7|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 7|not time" : [ "/lfj8xIFS8I=", @@ -22075,8 +21762,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 8|inflation scenarios|all to one destination" : [ @@ -22091,8 +21777,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 8|inflation scenarios|no one over min" : [ @@ -22108,7 +21793,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -24308,8 +23992,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 8|inflation scenarios|no winner" : [ @@ -24324,8 +24007,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 8|inflation scenarios|some winner does not exist" : [ @@ -24340,8 +24022,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 8|inflation scenarios|two guys over threshold" : [ @@ -24464,41 +24145,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 8|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 8|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 8|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 8|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 8|not time" : [ "/lfj8xIFS8I=", @@ -24521,8 +24173,7 @@ "2KkMZYy1spw=", "9PRgsY243ek=", "v9yi6oZg+o4=", - "dTnFWmoj0JE=", - "R+8JPdY37XM=" + "dTnFWmoj0JE=" ], "inflation|protocol version 9|inflation scenarios|all to one destination" : [ @@ -24537,8 +24188,7 @@ "oAwUCLcew+4=", "ouksoU44tfA=", "bbg7znc1z1k=", - "ArrQdMToKBo=", - "R/TZ+mInPqM=" + "ArrQdMToKBo=" ], "inflation|protocol version 9|inflation scenarios|no one over min" : [ @@ -24554,7 +24204,6 @@ "dPiW+eLVCQA=", "Wo62/zEQips=", "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=", "XbgVVPWkboM=", "vSD3qr+6dTc=", "fvMa24V+YyI=", @@ -26754,8 +26403,7 @@ "TJW+OScTryA=", "kH3mZzySvxE=", "B52AWsh0lcw=", - "sHrX5XVI5wk=", - "PoaWeZKiPuQ=" + "sHrX5XVI5wk=" ], "inflation|protocol version 9|inflation scenarios|no winner" : [ @@ -26770,8 +26418,7 @@ "OiOzIG+86Mg=", "dPiW+eLVCQA=", "Wo62/zEQips=", - "Q34ZeSZxjaw=", - "PoaWeZKiPuQ=" + "Q34ZeSZxjaw=" ], "inflation|protocol version 9|inflation scenarios|some winner does not exist" : [ @@ -26786,8 +26433,7 @@ "4v9gNiZyZDg=", "vjnUTrdJKGs=", "DitZ3HCLoIU=", - "juis8BsYl4w=", - "8TVbCvjew9Y=" + "juis8BsYl4w=" ], "inflation|protocol version 9|inflation scenarios|two guys over threshold" : [ @@ -26910,41 +26556,12 @@ "wX42yPMjGQQ=", "+JRjqrbRcE4=", "PePg3RdJcZs=", - "QHmDTILjqKM=", - "QYV97WiJHgY=" - ], - "inflation|protocol version 9|inflation with liabilities|available balance greater than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "bTaQUI44Ol4=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|large available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "byAaLJNpjxg=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|no available balance" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "dM+J2mdEPlk=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" - ], - "inflation|protocol version 9|inflation with liabilities|small available balance less than payout" : - [ - "k3eeF49CnWQ=", - "g2eKBtbrQbc=", - "B1LKeNeD3Pw=", - "RSok2NYBiJA=", - "pmS0XRqNdbw=" + "QHmDTILjqKM=" ], + "inflation|protocol version 9|inflation with liabilities|available balance greater than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "bTaQUI44Ol4=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|large available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "byAaLJNpjxg=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|no available balance" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "dM+J2mdEPlk=", "RSok2NYBiJA=" ], + "inflation|protocol version 9|inflation with liabilities|small available balance less than payout" : [ "k3eeF49CnWQ=", "g2eKBtbrQbc=", "B1LKeNeD3Pw=", "RSok2NYBiJA=" ], "inflation|protocol version 9|not time" : [ "/lfj8xIFS8I=", diff --git a/test-tx-meta-baseline-next/InvokeHostFunctionTests.json b/test-tx-meta-baseline-next/InvokeHostFunctionTests.json index 878c33b4b1..a842318790 100644 --- a/test-tx-meta-baseline-next/InvokeHostFunctionTests.json +++ b/test-tx-meta-baseline-next/InvokeHostFunctionTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "Failed write still causes ttl observation" : [ "+cR3oq2qY0I=", "qJ8KIK1AUN8=", "mvtbiiIU4+E=", "tLtF1ukXymY=" ], "Module cache" : [ "MR6BJ3xmn2c=" ], @@ -1310,6 +1311,7 @@ "Soroban non-refundable resource fees are stable|protocol version 24" : [ "+cR3oq2qY0I=" ], "Soroban non-refundable resource fees are stable|protocol version 25" : [ "+cR3oq2qY0I=" ], "Soroban non-refundable resource fees are stable|protocol version 26" : [ "+cR3oq2qY0I=" ], + "Soroban non-refundable resource fees are stable|protocol version 27" : [ "+cR3oq2qY0I=" ], "Stellar asset contract transfer with CAP-67 address types" : [ "+cR3oq2qY0I=", @@ -1419,6 +1421,20 @@ "wHwgNBvEIfA=", "kskE4Ud1al0=" ], + "Trustline stellar asset contract|protocol version 27" : + [ + "NTGGdj1offM=", + "dJ7wIRG9fGM=", + "m7dhjUPnS7c=", + "JXXSYU51PEk=", + "i6QEhSSAatQ=", + "rZB9oqyMSdg=", + "ei4T6aiso3E=", + "yYwUqope2ZU=", + "Xl79rsoQeGo=", + "wHwgNBvEIfA=", + "kskE4Ud1al0=" + ], "Vm instantiation tightening" : [ "MR6BJ3xmn2c=" ], "archival meta|protocol version 20" : [ @@ -1715,6 +1731,61 @@ "+cR3oq2qY0I=", "HIBfzi55AYI=" ], + "archival meta|protocol version 27" : + [ + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=", + "+cR3oq2qY0I=", + "HIBfzi55AYI=" + ], "autorestore contract instance" : [ "+cR3oq2qY0I=", @@ -1841,6 +1912,21 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "basic contract invocation|protocol version 27" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "buying liabilities plus refund is greater than INT64_MAX" : [ "+cR3oq2qY0I=", @@ -1856,12 +1942,14 @@ "classic payment source same as soroban fee bump source|protocol version 24" : [ "NTGGdj1offM=", "/BL0GVDK25E=", "el74K0RTG3s=", "G2A+Ze4n0j0=" ], "classic payment source same as soroban fee bump source|protocol version 25" : [ "NTGGdj1offM=", "/BL0GVDK25E=", "el74K0RTG3s=", "G2A+Ze4n0j0=" ], "classic payment source same as soroban fee bump source|protocol version 26" : [ "NTGGdj1offM=", "JkjG87qxDtA=", "gOE41BpipEE=", "rZI7+N9E35o=" ], + "classic payment source same as soroban fee bump source|protocol version 27" : [ "NTGGdj1offM=", "JkjG87qxDtA=", "gOE41BpipEE=", "rZI7+N9E35o=" ], "classic payment to soroban fee bump account|protocol version 21" : [ "NTGGdj1offM=", "fjoLcDhWHYA=", "4IRpUOj0+wQ=", "sSgQaOxyoRw=" ], "classic payment to soroban fee bump account|protocol version 22" : [ "NTGGdj1offM=", "uATUQupgc10=", "Bm2FUdIKm9s=", "lvpJjIticYI=" ], "classic payment to soroban fee bump account|protocol version 23" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], "classic payment to soroban fee bump account|protocol version 24" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], "classic payment to soroban fee bump account|protocol version 25" : [ "NTGGdj1offM=", "Q863mNGKGLA=", "GoSyXOxdw1s=", "02AVQAnH7qc=" ], "classic payment to soroban fee bump account|protocol version 26" : [ "NTGGdj1offM=", "aHlgICbAAQs=", "1S4Ni3f8c/0=", "wiDaeJY86QQ=" ], + "classic payment to soroban fee bump account|protocol version 27" : [ "NTGGdj1offM=", "aHlgICbAAQs=", "1S4Ni3f8c/0=", "wiDaeJY86QQ=" ], "classic phase bumps sequence of soroban source account|protocol version 20" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "9Rpfyyb4ewI=" ], "classic phase bumps sequence of soroban source account|protocol version 21" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "9Rpfyyb4ewI=" ], "classic phase bumps sequence of soroban source account|protocol version 22" : [ "NTGGdj1offM=", "CTLGLR5LLHY=", "xXpwdFz6+Uc=" ], @@ -1869,6 +1957,7 @@ "classic phase bumps sequence of soroban source account|protocol version 24" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "3KNBsUHfZIc=" ], "classic phase bumps sequence of soroban source account|protocol version 25" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "3KNBsUHfZIc=" ], "classic phase bumps sequence of soroban source account|protocol version 26" : [ "NTGGdj1offM=", "da8GTCxd54M=", "9CwFTVdoLAc=" ], + "classic phase bumps sequence of soroban source account|protocol version 27" : [ "NTGGdj1offM=", "da8GTCxd54M=", "9CwFTVdoLAc=" ], "classic phase sets master weight of soroban source account to 0|protocol version 20" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "Xrc/DmdG8do=" ], "classic phase sets master weight of soroban source account to 0|protocol version 21" : [ "NTGGdj1offM=", "FVbub/Ss/Xg=", "Xrc/DmdG8do=" ], "classic phase sets master weight of soroban source account to 0|protocol version 22" : [ "NTGGdj1offM=", "CTLGLR5LLHY=", "FBx7+A8nzD8=" ], @@ -1876,6 +1965,7 @@ "classic phase sets master weight of soroban source account to 0|protocol version 24" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "CpEmfvshkZs=" ], "classic phase sets master weight of soroban source account to 0|protocol version 25" : [ "NTGGdj1offM=", "jcAe7jOvF7U=", "CpEmfvshkZs=" ], "classic phase sets master weight of soroban source account to 0|protocol version 26" : [ "NTGGdj1offM=", "da8GTCxd54M=", "EgZGRWa/jP0=" ], + "classic phase sets master weight of soroban source account to 0|protocol version 27" : [ "NTGGdj1offM=", "da8GTCxd54M=", "EgZGRWa/jP0=" ], "complex contract|diagnostics disabled" : [ "+cR3oq2qY0I=" ], "complex contract|diagnostics enabled" : [ "+cR3oq2qY0I=" ], "contract constructor support" : @@ -1972,6 +2062,17 @@ "+cR3oq2qY0I=" ], "contract storage|protocol version 26|footprint|unused readWrite key" : [ "cPvvRUP0NPQ=" ], + "contract storage|protocol version 27" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], + "contract storage|protocol version 27|footprint|unused readWrite key" : [ "cPvvRUP0NPQ=" ], "create in first stage delete in second stage" : [ "+cR3oq2qY0I=", "0hd/OzcsUOc=", "WlN4KxDWk6Q=" ], "delete in first stage extend in second stage" : [ "+cR3oq2qY0I=", "0hd/OzcsUOc=", "WlN4KxDWk6Q=" ], "delete non existent entry with parallel apply" : [ "+cR3oq2qY0I=", "MQWsAsiP/Lg=" ], @@ -2024,6 +2125,14 @@ "atdtuKny6hU=", "3ZsUMDlmszc=" ], + "fee bump inner account merged then used as inner account on soroban fee bump|protocol version 27" : + [ + "+cR3oq2qY0I=", + "436Fz1Yi0Ts=", + "KvGyFNFxZNU=", + "atdtuKny6hU=", + "3ZsUMDlmszc=" + ], "fee bump refund account merged|protocol version 20" : [ "NTGGdj1offM=", @@ -2080,6 +2189,14 @@ "c5hUdIZ/qhk=", "DHmwRyYdmCc=" ], + "fee bump refund account merged|protocol version 27" : + [ + "NTGGdj1offM=", + "hKYDUB68SCM=", + "UYuGUCgj4ZE=", + "c5hUdIZ/qhk=", + "DHmwRyYdmCc=" + ], "ledger entry size limit enforced" : [ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], "loadgen Wasm executes properly" : [ "+cR3oq2qY0I=" ], "merge account then SAC payment scenarios|protocol version 20" : @@ -2187,6 +2304,21 @@ "DzHuWCGGPqQ=", "LoyTOp3yHD0=" ], + "merge account then SAC payment scenarios|protocol version 27" : + [ + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=", + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=", + "+cR3oq2qY0I=", + "7m9h795C/mY=", + "DzHuWCGGPqQ=", + "LoyTOp3yHD0=" + ], "multiple soroban ops in a tx|protocol version 20" : [ "bKDF6V5IzTo=", "n9Sc/mMA2VA=", "bKDF6V5IzTo=", "n9Sc/mMA2VA=" ], "multiple soroban ops in a tx|protocol version 20|with fee bump" : [ "nfyrGO2ZGaM=" ], "multiple soroban ops in a tx|protocol version 21" : [ "bKDF6V5IzTo=", "SStJyt3nT/c=", "bKDF6V5IzTo=", "SStJyt3nT/c=" ], @@ -2201,6 +2333,8 @@ "multiple soroban ops in a tx|protocol version 25|with fee bump" : [ "+6PP7MKB9TU=" ], "multiple soroban ops in a tx|protocol version 26" : [ "+cR3oq2qY0I=", "IL12u4uPsBM=", "+cR3oq2qY0I=", "IL12u4uPsBM=" ], "multiple soroban ops in a tx|protocol version 26|with fee bump" : [ "JBz2FcMw6No=" ], + "multiple soroban ops in a tx|protocol version 27" : [ "+cR3oq2qY0I=", "IL12u4uPsBM=", "+cR3oq2qY0I=", "IL12u4uPsBM=" ], + "multiple soroban ops in a tx|protocol version 27|with fee bump" : [ "JBz2FcMw6No=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 20" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 21" : [ "NTGGdj1offM=", "YDNTfJslOvc=", "0lSgIUSYUl4=", "hoRx9d0FZhY=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 22" : [ "NTGGdj1offM=", "uXD8Cnl+z1A=", "geKndLx9Dwk=", "up/hSXkPDJo=" ], @@ -2208,6 +2342,7 @@ "non-fee source account is recipient of payment in both classic and soroban|protocol version 24" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 25" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "non-fee source account is recipient of payment in both classic and soroban|protocol version 26" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], + "non-fee source account is recipient of payment in both classic and soroban|protocol version 27" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], "overly large soroban values are handled gracefully" : [ "+cR3oq2qY0I=", @@ -2938,6 +3073,7 @@ "refund account merged|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=", "VANzopQnZEI=" ], "refund account merged|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=", "VANzopQnZEI=" ], "refund account merged|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=", "c5hUdIZ/qhk=" ], + "refund account merged|protocol version 27" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=", "c5hUdIZ/qhk=" ], "refund is sent to fee-bump source|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund is sent to fee-bump source|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund is sent to fee-bump source|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=", "51g/NdOY708=" ], @@ -2945,6 +3081,7 @@ "refund is sent to fee-bump source|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund is sent to fee-bump source|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund is sent to fee-bump source|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], + "refund is sent to fee-bump source|protocol version 27" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], "refund still happens on bad auth|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund still happens on bad auth|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=", "lDIOdHQWnno=" ], "refund still happens on bad auth|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=", "51g/NdOY708=" ], @@ -2952,6 +3089,7 @@ "refund still happens on bad auth|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund still happens on bad auth|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=", "Fwl38theYqY=" ], "refund still happens on bad auth|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], + "refund still happens on bad auth|protocol version 27" : [ "NTGGdj1offM=", "hKYDUB68SCM=", "UYuGUCgj4ZE=" ], "refund test with closeLedger|protocol version 20" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=" ], "refund test with closeLedger|protocol version 21" : [ "NTGGdj1offM=", "4gCiTRsvvQQ=" ], "refund test with closeLedger|protocol version 22" : [ "NTGGdj1offM=", "g3gHe/+0R0s=" ], @@ -2959,6 +3097,7 @@ "refund test with closeLedger|protocol version 24" : [ "NTGGdj1offM=", "6peNuI0WUWU=" ], "refund test with closeLedger|protocol version 25" : [ "NTGGdj1offM=", "6peNuI0WUWU=" ], "refund test with closeLedger|protocol version 26" : [ "NTGGdj1offM=", "hKYDUB68SCM=" ], + "refund test with closeLedger|protocol version 27" : [ "NTGGdj1offM=", "hKYDUB68SCM=" ], "refund to source in tx1 and SAC transfer from same account in tx2|protocol version 20" : [ "NTGGdj1offM=", @@ -3022,6 +3161,15 @@ "kqd1AzcRBeU=", "oxBuoWbPY2M=" ], + "refund to source in tx1 and SAC transfer from same account in tx2|protocol version 27" : + [ + "NTGGdj1offM=", + "kqd1AzcRBeU=", + "oxBuoWbPY2M=", + "NTGGdj1offM=", + "kqd1AzcRBeU=", + "oxBuoWbPY2M=" + ], "resource fee exceeds uint32" : [ "+cR3oq2qY0I=", @@ -3069,6 +3217,7 @@ "source account of first tx is in second txs footprint|protocol version 24" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "source account of first tx is in second txs footprint|protocol version 25" : [ "NTGGdj1offM=", "iA54BbkrMmc=", "KLpBGpyr9Fg=", "7yXpRaCKcqw=" ], "source account of first tx is in second txs footprint|protocol version 26" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], + "source account of first tx is in second txs footprint|protocol version 27" : [ "NTGGdj1offM=", "kqd1AzcRBeU=", "oxBuoWbPY2M=", "wFa/kgJaTtA=" ], "state archival operation errors|protocol version 20" : [ "bKDF6V5IzTo=", @@ -3146,6 +3295,17 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "state archival operation errors|protocol version 27" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "state archival|protocol version 20" : [ "bKDF6V5IzTo=", @@ -3272,6 +3432,24 @@ "+cR3oq2qY0I=", "+cR3oq2qY0I=" ], + "state archival|protocol version 27" : + [ + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=", + "+cR3oq2qY0I=" + ], "transaction validation diagnostics" : [ "+cR3oq2qY0I=" ], "trustline deletion then SAC payment|protocol version 20" : [ @@ -3350,6 +3528,17 @@ "T452ExvJRU0=", "U3cl0rcrkIE=" ], + "trustline deletion then SAC payment|protocol version 27" : + [ + "+cR3oq2qY0I=", + "b/fY7LlgGo4=", + "g6TpGLXhIY4=", + "v3bfhcmu/lA=", + "1sdvrI0ljdU=", + "8+WGK0Ogv8k=", + "T452ExvJRU0=", + "U3cl0rcrkIE=" + ], "validate return values|protocol version 20" : [ "bKDF6V5IzTo=", @@ -3427,5 +3616,16 @@ "crqL+imN/4Y=", "UBoXpTeXotI=" ], + "validate return values|protocol version 27" : + [ + "+cR3oq2qY0I=", + "IL12u4uPsBM=", + "TsmRFGNQZXw=", + "3vL2mMtcm70=", + "ndN3JwediTI=", + "N+dicBLi5m0=", + "crqL+imN/4Y=", + "UBoXpTeXotI=" + ], "version test" : [ "766L+TYsWqA=" ] } diff --git a/test-tx-meta-baseline-next/LiquidityPoolDepositTests.json b/test-tx-meta-baseline-next/LiquidityPoolDepositTests.json index 1d764317aa..318b86a095 100644 --- a/test-tx-meta-baseline-next/LiquidityPoolDepositTests.json +++ b/test-tx-meta-baseline-next/LiquidityPoolDepositTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "liquidity pool deposit|protocol version 10|not supported before protocol 18" : [ "X2yKCWehH5U=" ], "liquidity pool deposit|protocol version 11|not supported before protocol 18" : [ "X2yKCWehH5U=" ], @@ -1860,6 +1861,208 @@ "rWgI3zRbOIE=", "9xMyUK9Hqgo=" ], + "liquidity pool deposit|protocol version 27|bad price in existing pool due to 0 calculated deposit amounts for both assets" : + [ + "3Z8M0tc2y4o=", + "82/LqEGmN4Q=", + "+Dz1kPXWG40=", + "MzAHgiW1f2s=", + "TmxbA7OSPfI=", + "CN3XD6Y0lPE=", + "mqFZhAUxCaA=", + "FZvWRJ8PQzM=" + ], + "liquidity pool deposit|protocol version 27|both non-native without liabilities" : + [ + "KPadaxNwZEQ=", + "dKxoH50Kji0=", + "+DXwkil4Ekk=", + "CnVpXVZVG90=", + "bHQfXGWqzEs=", + "63FxEYRLy2w=", + "qBn1xAn5dPA=", + "UDWqLfj0e+E=", + "s0saHEjddN8=", + "CbYM83NEDbE=", + "dMFdIx+mytw=", + "BqwIayU4/Vg=", + "MGNrEEO3eJ8=", + "AICPdC/v5+k=", + "FRZWdlEimpw=", + "3CuiEuSAh88=", + "lxf2QnhY1I8=", + "fLvlDdLzvDI=", + "m6g4Svik7z0=", + "Qw3LLYggtBY=", + "TAVKIwU1vHk=", + "PbEe87PG7Oo=", + "W0PMhvOfyvY=", + "1jx49+gqTA4=", + "2YTSCJt9Fvs=", + "/P/eZN9IesM=", + "fT0gdlzHeLI=", + "KECr1nKb8Bc=", + "X56Ntb/lF1k=", + "4Rf/Oi1/OaE=", + "qe5cGAuA1YA=", + "jAwi4AEoFog=", + "r3skzXmlKV4=", + "/Mnfp3PuqyU=", + "UEKKmuogRpM=", + "uFLCmV+3vPg=", + "zwX2BJRAPKI=", + "dF6uPvEbNEA=", + "fkv1wgY+9WM=", + "RGIJTjNi6ms=" + ], + "liquidity pool deposit|protocol version 27|one non-native without liabilities" : + [ + "KPadaxNwZEQ=", + "l1HCxSd4aRA=", + "LYFG721ojsA=", + "A+v0AsH0O60=", + "7fWi6Vih0zM=", + "f2jrR3qD2Rc=", + "v8Xa2paSLII=", + "Rl63n62ndfo=", + "mV26iQfEKWE=", + "bSDPZ/bCVo0=", + "JhJmwf9U86M=", + "brrJ3YS2BJI=", + "kqHqoNS03FA=", + "vfdfU56vqG4=", + "1YtJttx0Rgw=", + "wlBzWGVWNE4=", + "qwqsYHNHOWc=", + "Yqylhvzil/w=", + "droWXE6EHYo=", + "iU0CngPLHdY=", + "YWRAzQzdwKg=", + "7yDCPmLhpmI=", + "Z8wFC7sZxFc=", + "MosLnj2LFQA=", + "Ac7UfH0CnWI=", + "W6zApeuTczY=", + "9TMWJ3D5juw=", + "O9YnlS64xe4=", + "SOs6N28/XYU=", + "3wBeOJJOEeM=", + "Fg/7s1YVHhg=", + "pcp9V2U8xd4=" + ], + "liquidity pool deposit|protocol version 27|pool share calculation overflows for one asset" : + [ + "3Z8M0tc2y4o=", + "n38JJ0P5t08=", + "XUTu0d5Phpw=", + "q4lbyr614Ns=", + "8vjLWn3FPvc=", + "+dZuGYEOOrc=", + "sNDdWz/lx4I=", + "niKzBOa5MH0=", + "5QJkJ3iHAcQ=", + "zBYS9iFaXTw=", + "/RhSmssDtJM=", + "kCcBGDCL6B4=", + "3Z8M0tc2y4o=", + "n38JJ0P5t08=", + "XUTu0d5Phpw=", + "q4lbyr614Ns=", + "8vjLWn3FPvc=", + "+dZuGYEOOrc=", + "sNDdWz/lx4I=", + "niKzBOa5MH0=", + "5QJkJ3iHAcQ=", + "zBYS9iFaXTw=", + "/RhSmssDtJM=", + "kCcBGDCL6B4=" + ], + "liquidity pool deposit|protocol version 27|pool share calculation overflows for one asset|deposit then withdraw - rounding results in extra asset in pool - assetA fail" : [ "5n1S3BUJEUM=", "9wcTNyGR/QM=", "/47n/Cv7Jr0=", "fkh77qTimgA=" ], + "liquidity pool deposit|protocol version 27|pool share calculation overflows for one asset|deposit then withdraw - rounding results in extra asset in pool - assetB fail" : [ "0jPmYtweOvk=", "l/2TbkSPkIE=", "eXwDMwWCXy8=", "qf50g7Ch4YI=" ], + "liquidity pool deposit|protocol version 27|underfunded due to liabilities" : + [ + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=", + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=", + "3Z8M0tc2y4o=", + "7lYd1Fnd5rM=", + "ItuFSPgklmc=", + "4x6smnD6CG4=", + "qSN1gueOUm0=", + "6Z/gu8aArq0=", + "ljcxgUVtRJU=" + ], + "liquidity pool deposit|protocol version 27|underfunded due to liabilities|assetA" : + [ + "A0rxRc/TlIA=", + "FZ1PIzsoTbA=", + "y8CFjdD0VEs=", + "M/Z41Cbq4iM=", + "0dcgbhrfx2c=", + "HoL45XD4gjw=", + "+k49/n6WCQ0=", + "yYWB6dIXpFI=", + "z48yvi/h/FE=", + "pKGcmChGbag=" + ], + "liquidity pool deposit|protocol version 27|underfunded due to liabilities|assetB" : + [ + "3o+NIkSOrYM=", + "FZ1PIzsoTbA=", + "BeHdQh1w0TE=", + "olhQp66/aQc=", + "0dcgbhrfx2c=", + "HoL45XD4gjw=", + "5Q2ivM7H49E=", + "yYWB6dIXpFI=", + "/SYrVARU5OQ=", + "LlRZJJxKzmU=" + ], + "liquidity pool deposit|protocol version 27|underfunded due to liabilities|native" : + [ + "iymAmKwyMQA=", + "6DhobJYecJQ=", + "/FpEPyuFGL8=", + "Vzj+s4gsqmo=", + "9pfkxNpG7RA=", + "FcYbCwOfSOE=", + "pEXsKuz8yDY=", + "o4XI8ePjWzU=", + "76TPVczLZwE=", + "8lr0vbko2I8=", + "ENxm6pGMmVk=", + "mhGCU5d2c/o=", + "sd/UseinCHY=", + "Rdua52j41yA=", + "KnodtZT8gC8=" + ], + "liquidity pool deposit|protocol version 27|validity checks" : + [ + "Zby/J3+a3+M=", + "c3wyZ9CLvUY=", + "JuC4AuiIpbs=", + "RpcbumH8vz8=", + "gfKt+nb+HGo=", + "E+1gFs0xgc4=", + "+IopLW8CNwc=", + "zWL1ZtG34Jg=", + "HCraC1rTyGE=", + "Mph+WRIoQDM=", + "K2Xp/o5UFaA=", + "rWgI3zRbOIE=", + "9xMyUK9Hqgo=" + ], "liquidity pool deposit|protocol version 2|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], "liquidity pool deposit|protocol version 3|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], "liquidity pool deposit|protocol version 4|not supported before protocol 18" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-next/LiquidityPoolTradeTests.json b/test-tx-meta-baseline-next/LiquidityPoolTradeTests.json index 2513448995..15d35bdbf5 100644 --- a/test-tx-meta-baseline-next/LiquidityPoolTradeTests.json +++ b/test-tx-meta-baseline-next/LiquidityPoolTradeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "liquidity pool trade|protocol version 18|CUR1, CUR2|chooses best price" : [ @@ -18725,5 +18726,2082 @@ "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|at limit" : [ "azMuD88dCkU=" ], "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], - "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ] + "liquidity pool trade|protocol version 26|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|chooses best price" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "sxE8XEeQsH4=", + "0z+ZOkDdcqc=", + "gN7Kg3Mxo+M=", + "lO6nSncvuFM=", + "VEQLFOoC6CY=", + "JCOHmTpDvGY=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|chooses best price|book has strictly better price" : [ "1idf6qqcC4Q=", "nsxaelSu21M=", "88h/3pddn4c=", "/PD8oiagY7g=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|chooses best price|both prices equal" : [ "30H9KZ3jFgI=", "d1WK+HgwjuE=", "bk61FSHHbpk=", "hL2gIbEJ6kA=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|chooses best price|pool has strictly better price" : [ "1idf6qqcC4Q=", "nsxaelSu21M=", "uoQx538BxG4=", "8UoqXbU1NUg=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in opposite directions" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times" : [ "2AwHrS6wykc=", "2AwHrS6wykc=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times|strict receive" : [ "QB+kfYBW5/8=", "7eXzB1YsV/I=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in opposite directions|liquidity pool both times|strict send" : [ "QB+kfYBW5/8=", "7eXzB1YsV/I=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "GS6yDZyyMnw=", + "mvM4DnjGnGw=", + "7v8w+93MoKk=", + "7u1VGIfO3t0=", + "HqDB7WLW0ZU=", + "ludHOyZKgOc=", + "FMi+eGXqo04=", + "qS8POzutr34=", + "IZYviD/ExaU=", + "Jw/0hfHJggk=", + "Z68GRv51DaI=", + "mfzbE2HA0N8=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times" : [ "hgEJXBqQBb4=", "wPjsYkGaFdk=", "hgEJXBqQBb4=", "wPjsYkGaFdk=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict receive" : [ "7CtIquKmEfo=", "pKSMkpCxPlI=", "T4zBa/avARo=", "HreVih42xWc=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict send" : + [ + "ZLPTwl/EzxU=", + "3g3TxOBYms0=", + "1E9ykqio9cE=", + "IRDexUyTMF8=", + "kiUZCuyxY8g=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times|strict receive" : [ "T4zBa/avARo=", "v2LGpc22URI=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool both times|strict send" : [ "T4zBa/avARo=", "rD5rlp6j168=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop" : [ "0WeWWmFry7k=", "TV5RMDwS8R0=", "0WeWWmFry7k=", "TV5RMDwS8R0=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict receive" : [ "T4zBa/avARo=", "Xkpj75WtVhg=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict send" : [ "T4zBa/avARo=", "Xkpj75WtVhg=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop" : [ "j+Vh/O2mlOA=", "Bu0IuxaitXE=", "j+Vh/O2mlOA=", "Bu0IuxaitXE=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict receive" : [ "T4zBa/avARo=", "Wet6BjDbzxQ=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict send" : [ "T4zBa/avARo=", "Wet6BjDbzxQ=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop" : [ "M3v5n92xflc=", "4cIgiEreFws=", "M3v5n92xflc=", "4cIgiEreFws=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict receive" : [ "T4zBa/avARo=", "xrKYH4syXtE=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict send" : [ "T4zBa/avARo=", "6GYWaNgllys=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|order book both times" : [ "d7yibHVwTf4=", "DJ4ZL7Kc/J0=", "d7yibHVwTf4=", "DJ4ZL7Kc/J0=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|order book both times|strict receive" : [ "T4zBa/avARo=", "q7CXWxiHsn8=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|cross the same pair twice in the same direction|order book both times|strict send" : [ "T4zBa/avARo=", "q7CXWxiHsn8=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|liquidity pool charges the correct fee" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "2AwHrS6wykc=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "2AwHrS6wykc=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|liquidity pool charges the correct fee|strict receive" : [ "QB+kfYBW5/8=", "oFuMpzT5/0g=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|liquidity pool charges the correct fee|strict send" : [ "QB+kfYBW5/8=", "oFuMpzT5/0g=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|max offers to cross" : + [ + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=", + "hGaJe5L9FCE=", + "HS8lRPRSyYw=", + "zXDpH1JMOfE=", + "6mdJLVCfonI=", + "HvdS3DJK/h0=", + "OHGGKSynUsc=", + "EewZecOeLzw=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "NViu+CnXvBA=", + "UQlrULJm1/M=", + "YuNrfvVRyNw=", + "ViDn45fXVb8=", + "tliqwL+cgKY=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "QPJcmN9m+0M=", + "dU6YJxUvLjI=", + "Q5aAau4oih8=", + "fIGgNNK7Gr0=", + "chrYvX6XJr0=", + "lOEgsUtyzM4=", + "O4AavgkeyXI=", + "oCbYxaxlo10=", + "pOwgfx/cXV0=", + "xgz7yn4t/6s=", + "+lWwB1uiYfA=", + "ya/jtERmDe0=", + "xcx1qI2z3ck=", + "xiL3HQVdbKg=", + "fq+lfbgkBeM=", + "3TsAVCrwMPE=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|max offers to cross|liquidity pool fails when crossing one above limit" : + [ + "XJcTPWOr8rE=", + "i8CXc+ffC4Y=", + "lMqnbV+hjDw=", + "DjpOkMz6q78=", + "gClDf/W22Jc=", + "NB/k1EMXdt8=", + "aS+Lp6WTq/o=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|max offers to cross|liquidity pool succeeds when crossing limit" : [ "XJcTPWOr8rE=", "GWBV/wUIRnk=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|max offers to cross|order book fails when crossing one above limit" : [ "YjYn982b8+g=", "i8CXc+ffC4Y=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|max offers to cross|order book succeeds when crossing limit" : [ "YjYn982b8+g=", "z9TNHHlIjto=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|order book is better, but there is a self-trade" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "txvdya09kWM=", + "AnGKfrEDCbk=", + "SokHUq5YYd8=", + "r1WkrmFGa30=", + "ZNY3nV/UECs=", + "8UzAEjneCfQ=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|order book is better, but there is a self-trade|strict receive|no self trade" : [ "m4DMzye4STs=", "v1m1W8YdE0A=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|order book is better, but there is a self-trade|strict receive|self trade" : [ "2tc96YzF5ls=", "Xp4CJx7lo/Q=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|order book is better, but there is a self-trade|strict send|no self trade" : [ "m4DMzye4STs=", "vHQuHjal1MI=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|order book is better, but there is a self-trade|strict send|self trade" : [ "2tc96YzF5ls=", "Xp4CJx7lo/Q=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment into pool would be larger than INT64_MAX" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "OsaGWTRDcIs=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "1KXxz9e/1Gs=", + "5A9fKOmF378=", + "Uiazntlkamw=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment into pool would be larger than INT64_MAX|strict receive" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that a market maker participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "fJ2pdS6t5aM=", + "jyjxGnhtQGQ=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "fJ2pdS6t5aM=", + "jyjxGnhtQGQ=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that a market maker participates in|strict receive" : [ "rX+FXU5Tag4=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that a market maker participates in|strict send" : [ "rX+FXU5Tag4=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the destination participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "z/J9FjCjmPs=", + "1frK1TvX9aM=", + "q4bRDzg5H8A=", + "kAh4djC8e18=", + "Wg8lqRELqEA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "z/J9FjCjmPs=", + "1frK1TvX9aM=", + "q4bRDzg5H8A=", + "kAh4djC8e18=", + "Wg8lqRELqEA=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the destination participates in|strict receive" : [ "j6tHMpdf/14=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the destination participates in|strict send" : [ "j6tHMpdf/14=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the sender participates in" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "w21Q1UO8HN0=", + "zLe3280d87I=", + "Y82IHcYtA0s=", + "mLm6gdode9Y=", + "XrisdY/B9kc=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the sender participates in|strict receive" : [ "4LdY9l7ZIf0=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through a pool that the sender participates in|strict send" : [ "4LdY9l7ZIf0=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through empty liquidity pools" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "7mklc0KyvKE=", + "BwoMPmvt5Vw=", + "6EnneHN8vD0=", + "L4T/6iPhf4o=", + "wQ86b5xJ848=", + "mC59mA054cI=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "7mklc0KyvKE=", + "BwoMPmvt5Vw=", + "6EnneHN8vD0=", + "L4T/6iPhf4o=", + "wQ86b5xJ848=", + "mC59mA054cI=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through empty liquidity pools|strict receive" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through empty liquidity pools|strict send" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through pool after offer that yields nothing" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "xw1HaX1EoqA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "mwYZszOnj/g=", + "pfjMjwAI3dM=", + "dpuQTJ0o4zs=", + "STFuaOXWb+c=", + "EQ5ATomL1wc=", + "gV10XTkgntM=", + "usgbbN+M/a4=", + "KuiafWI8woI=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through pool after offer that yields nothing|strict send" : [ "OKq29a3HWFo=", "yidLcZxajJw=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through pool that yields nothing" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "VoIw2rGAkJc=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment through pool that yields nothing|strict send" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment would receive more than the reserve" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "OsaGWTRDcIs=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "XJ2tYGynRuk=", + "+GJv9idEJIo=", + "k4+j9exyGhQ=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|payment would receive more than the reserve|strict receive" : [ "QB+kfYBW5/8=", "bnwzjUxDAAo=", "ZOg1vYd66As=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|trade fails due to excess reserves" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "SXARJE9hdHs=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "U2ca3P7ZIBU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "M3Ckrl3h3fk=", + "7gdJn0xjmMo=", + "2WfEEJOkmoE=", + "gC8h++NifOs=", + "SbTk1a2k8DE=", + "SXARJE9hdHs=" + ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|trade fails due to excess reserves|strict receive" : [ "QB+kfYBW5/8=", "pyHrXCwrei4=" ], + "liquidity pool trade|protocol version 27|CUR1, CUR2|trade fails due to excess reserves|strict send" : [ "QB+kfYBW5/8=", "pyHrXCwrei4=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|chooses best price" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "sxE8XEeQsH4=", + "Xhq7G/yMFPw=", + "DbpeJL7J5PE=", + "EUAUTitBgL4=", + "aGjA2FWim14=", + "KNqh4dZ6abg=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|chooses best price|book has strictly better price" : [ "rgU3E3KrQP8=", "Y6SkZ57nWls=", "gqUla51RoCs=", "mVMhZs+koog=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|chooses best price|both prices equal" : [ "sjR96OGIjEo=", "OGm/oJP+Lag=", "RcQ+swdN710=", "YBiqxTrwLok=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|chooses best price|pool has strictly better price" : [ "rgU3E3KrQP8=", "Y6SkZ57nWls=", "m+VfXbDDFkE=", "wY+Wsq691Ic=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in opposite directions" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times" : [ "W5IrbHh1mEM=", "W5IrbHh1mEM=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times|strict receive" : [ "QB+kfYBW5/8=", "eNWZthsSWMc=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in opposite directions|liquidity pool both times|strict send" : [ "QB+kfYBW5/8=", "eNWZthsSWMc=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "GS6yDZyyMnw=", + "j2V6RKfEcJo=", + "7v8w+93MoKk=", + "/I53/wAoO4k=", + "HqDB7WLW0ZU=", + "YW+fXmG+KGU=", + "FMi+eGXqo04=", + "ElFcJ8vREKw=", + "IZYviD/ExaU=", + "C7hYQKUy+/U=", + "Z68GRv51DaI=", + "SeiGFTGbJMk=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times" : [ "8FfQAly+ITI=", "OGFIVsoNSIo=", "8FfQAly+ITI=", "OGFIVsoNSIo=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict receive" : [ "QurnT01khwI=", "JqG3PMy3Uw0=", "T4zBa/avARo=", "UzlycVmt2YM=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times, fails on the second hop|strict send" : + [ + "aVt4idxeGVM=", + "W5SkZpAOrQg=", + "mAUgw292idY=", + "IRDexUyTMF8=", + "f0tuCQxAalc=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times|strict receive" : [ "T4zBa/avARo=", "P4cKVBRO2oo=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool both times|strict send" : [ "T4zBa/avARo=", "PkRp+D7OELI=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop" : [ "xipyLwVqK+U=", "GbAnn4uzjZI=", "xipyLwVqK+U=", "GbAnn4uzjZI=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict receive" : [ "T4zBa/avARo=", "DjUa8s81zx8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send indifferent on first hop|strict send" : [ "T4zBa/avARo=", "DjUa8s81zx8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop" : [ "ZCYpWKyL+NE=", "sIvwfNpkeZI=", "ZCYpWKyL+NE=", "sIvwfNpkeZI=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict receive" : [ "T4zBa/avARo=", "fZj0Ac9t2ao=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers liquidity pool on first hop|strict send" : [ "T4zBa/avARo=", "fZj0Ac9t2ao=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop" : [ "DtCu6Y+X2Xo=", "8rtXCdzMnUA=", "DtCu6Y+X2Xo=", "8rtXCdzMnUA=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict receive" : [ "T4zBa/avARo=", "5EAwzxAfco8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|liquidity pool once, order book once, strict send prefers order book on first hop|strict send" : [ "T4zBa/avARo=", "PqCtHi98PCA=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|order book both times" : [ "O7VVW13ioQs=", "pB4Wg16XMrM=", "O7VVW13ioQs=", "pB4Wg16XMrM=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|order book both times|strict receive" : [ "T4zBa/avARo=", "xS3e2wBQsMQ=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|cross the same pair twice in the same direction|order book both times|strict send" : [ "T4zBa/avARo=", "xS3e2wBQsMQ=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|liquidity pool charges the correct fee" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "W5IrbHh1mEM=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "W5IrbHh1mEM=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|liquidity pool charges the correct fee|strict receive" : [ "QB+kfYBW5/8=", "g1/MlEWFPaY=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|liquidity pool charges the correct fee|strict send" : [ "QB+kfYBW5/8=", "g1/MlEWFPaY=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|max offers to cross" : + [ + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=", + "hGaJe5L9FCE=", + "+Md4N3Anuuw=", + "OqAZSK5bhYU=", + "6mdJLVCfonI=", + "21EcZTM8mr4=", + "WcizX2uq8Ug=", + "zPOlaPWwU3w=", + "dMZ8c6i9AZ8=", + "+gozMTKJpGE=", + "6UmG4CGxiB0=", + "v7e6WDPFj0U=", + "YuNrfvVRyNw=", + "p7V8gny8PJw=", + "xT3Cz+YfJXE=", + "YU/Lt86CaZ0=", + "xOTBRDpciqc=", + "UtB0Xyc5ijs=", + "EUvFpxEZb6U=", + "Q5aAau4oih8=", + "Dr2E0fNzfaU=", + "fAE3TJMluVY=", + "lOEgsUtyzM4=", + "PPnXtCbfnSk=", + "5n8GSgkPOL0=", + "x2uzrLrHMRU=", + "6S6BoIZl03g=", + "IRMzVnZAblc=", + "Yk/k3xNlN2k=", + "YKo+63uOBN8=", + "4oracc2snyA=", + "9LCsAVkjyeY=", + "AyTdD2sAsNY=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|max offers to cross|liquidity pool fails when crossing one above limit" : + [ + "/o3X7QzeRJE=", + "i8CXc+ffC4Y=", + "4y5R3DybfKo=", + "DjpOkMz6q78=", + "0lHckhHHa+I=", + "sbeDrgv6/eg=", + "aS+Lp6WTq/o=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|max offers to cross|liquidity pool succeeds when crossing limit" : [ "/o3X7QzeRJE=", "3o2c9OJDVLw=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|max offers to cross|order book fails when crossing one above limit" : [ "H+sjMQpO2QY=", "i8CXc+ffC4Y=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|max offers to cross|order book succeeds when crossing limit" : [ "H+sjMQpO2QY=", "6uZArrsZu9s=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|order book is better, but there is a self-trade" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "txvdya09kWM=", + "jbwyZ8kjOAQ=", + "uqjhJ7QH8cA=", + "tS0ZrkU/ow8=", + "4j1An6C1tkk=", + "DCUOc8NXB9I=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|order book is better, but there is a self-trade|strict receive|no self trade" : [ "4pOq/SKFLg0=", "qFaN7hkwp+I=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|order book is better, but there is a self-trade|strict receive|self trade" : [ "No9kQ15bEd0=", "61GVuTgS1tw=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|order book is better, but there is a self-trade|strict send|no self trade" : [ "4pOq/SKFLg0=", "1rjUpg7HBS8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|order book is better, but there is a self-trade|strict send|self trade" : [ "No9kQ15bEd0=", "61GVuTgS1tw=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment into pool would be larger than INT64_MAX" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "zDRGlHRPtSU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "VfKh7Mqmf2s=", + "xaEZTuWcI/A=", + "WHsyl28xpL8=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment into pool would be larger than INT64_MAX|strict receive" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that a market maker participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "20lAYj+2q/w=", + "6DVHVqxV7f8=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "20lAYj+2q/w=", + "6DVHVqxV7f8=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that a market maker participates in|strict receive" : [ "sbv+GIZfMTk=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that a market maker participates in|strict send" : [ "sbv+GIZfMTk=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the destination participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "XaOHGgiDS7M=", + "Gt5XxwhKanY=", + "MudyJYS7Qh4=", + "VfazWtZVHpA=", + "jPNzZZ5UK4M=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "2XMouutsQFA=", + "XaOHGgiDS7M=", + "Gt5XxwhKanY=", + "MudyJYS7Qh4=", + "VfazWtZVHpA=", + "jPNzZZ5UK4M=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the destination participates in|strict receive" : [ "rfq0jhmV5aQ=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the destination participates in|strict send" : [ "rfq0jhmV5aQ=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the sender participates in" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "yQkdQiBnxXs=", + "7b1MHbQpsaM=", + "F+a8G1dBn1Q=", + "x2nUH4gqfaQ=", + "lf+UQMEM6OY=", + "mLm6gdode9Y=", + "UF5lOwP32tM=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the sender participates in|strict receive" : [ "NYwYFPeHAj0=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through a pool that the sender participates in|strict send" : [ "NYwYFPeHAj0=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through empty liquidity pools" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "+V51XryRTlc=", + "g8235W1R1xo=", + "TaIZc0PXOwc=", + "LCYGjVC6uRo=", + "Ai6iOZXY2/k=", + "mC59mA054cI=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "UUhqdE/nwuU=", + "UkxqnLKbQJ0=", + "+V51XryRTlc=", + "g8235W1R1xo=", + "TaIZc0PXOwc=", + "LCYGjVC6uRo=", + "Ai6iOZXY2/k=", + "mC59mA054cI=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through empty liquidity pools|strict receive" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through empty liquidity pools|strict send" : [ "E29CJW51q5c=", "jMMtwAD61R4=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through pool after offer that yields nothing" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "xw1HaX1EoqA=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "/ES7XV64ijE=", + "pfjMjwAI3dM=", + "otnkzWMYwGg=", + "STFuaOXWb+c=", + "YgXz55R9yYw=", + "gmSLTrdwQbc=", + "usgbbN+M/a4=", + "XoumJjWza2o=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through pool after offer that yields nothing|strict send" : [ "OKq29a3HWFo=", "yidLcZxajJw=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through pool that yields nothing" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "gnCW6thOpK8=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment through pool that yields nothing|strict send" : [ "QB+kfYBW5/8=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment would receive more than the reserve" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "zDRGlHRPtSU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "TGlU+epDSZk=", + "ViIdEFIX5ig=", + "6m7okHuk+Jw=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|payment would receive more than the reserve|strict receive" : [ "QB+kfYBW5/8=", "bnwzjUxDAAo=", "jOhl5lGyNPY=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|trade fails due to excess reserves" : + [ + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "DR+Vl3N8rlc=", + "3Z8M0tc2y4o=", + "aO6ZVkdX2HI=", + "PSL7W0thsJU=", + "ytpdtcerYBg=", + "Hbwt/kcZTeY=", + "DESh/1WirI0=", + "OxQWWRdVrTk=", + "xawuC0vJv/0=", + "G3jmqche/1Y=", + "lhjGyL2JiEA=", + "fDNldwqjoNM=", + "DR+Vl3N8rlc=" + ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|trade fails due to excess reserves|strict receive" : [ "QB+kfYBW5/8=", "6VUvx7HXbOs=" ], + "liquidity pool trade|protocol version 27|CUR2, CUR1|trade fails due to excess reserves|strict send" : [ "QB+kfYBW5/8=", "6VUvx7HXbOs=" ], + "liquidity pool trade|protocol version 27|without offers" : + [ + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=", + "3Z8M0tc2y4o=", + "E8OMp2xoZpw=", + "Y3vSp7sN3VU=", + "IDU7gDdUmQw=", + "JKq93fVfyGc=", + "fIQBkIBgf9w=", + "xgM2JwIdy3w=", + "MktRBMwQIwM=", + "UF5lOwP32tM=", + "N6W5GxqJVBA=", + "vuvR1xormfQ=", + "kfwjO+P3074=", + "Cj1HBZ1iwhI=", + "7mtGKbha8Wo=", + "KhUDqTZBglw=", + "BIRDZc2fSpA=" + ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur1|at limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur1|satisfies limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur2|at limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur2|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict receive|pool sells cur2|satisfies limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur1|at limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur1|satisfies limit" : [ "e4uS6NbOvQQ=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur2|at limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur2|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|both non-native, strict send|pool sells cur2|satisfies limit" : [ "povK1VWdBPM=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells cur1|at limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells native|at limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict receive|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells cur1|at limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells cur1|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells cur1|satisfies limit" : [ "MFasltrYgR0=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells native|at limit" : [ "azMuD88dCkU=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells native|fails due to limit" : [ "Av/3FqLNbV8=" ], + "liquidity pool trade|protocol version 27|without offers|one native, strict send|pool sells native|satisfies limit" : [ "azMuD88dCkU=" ] } diff --git a/test-tx-meta-baseline-next/LiquidityPoolWithdrawTests.json b/test-tx-meta-baseline-next/LiquidityPoolWithdrawTests.json index f18bf095a3..3231f1f336 100644 --- a/test-tx-meta-baseline-next/LiquidityPoolWithdrawTests.json +++ b/test-tx-meta-baseline-next/LiquidityPoolWithdrawTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "liquidity pool withdraw|protocol version 0" : [ "1kTXt7VFL1o=" ], "liquidity pool withdraw|protocol version 1" : [ "1kTXt7VFL1o=" ], @@ -13850,6 +13851,1539 @@ "4isDr+X5NBQ=", "ZXOCz0P9J2w=" ], + "liquidity pool withdraw|protocol version 27" : + [ + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=", + "alQ6EsRSoSQ=" + ], + "liquidity pool withdraw|protocol version 27|both non-native issuer deposit and withdraw" : + [ + "Qgk3guxhcVI=", + "CHuj+qrc0Tk=", + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "tMPf2GY/5z0=", + "pxgUi2S26TM=", + "h1jJVHJ3Iow=", + "h2UgPzdxmrQ=", + "CTtFRzm8Z9Q=", + "LfYrZeUAaFk=" + ], + "liquidity pool withdraw|protocol version 27|both non-native one asset withdraw is zero" : + [ + "I2iIYR+cu2w=", + "09cc2uWQBKg=", + "clpvLcM5i0Y=", + "UdO5P7LffTQ=", + "cQLiZIK9KNE=", + "aEoD5FR/irI=", + "JR/c+VfJsrs=", + "0F7DPJnys7Y=", + "4wI0GNamyE0=", + "J68MeiK/89I=", + "93d+jR3tDJ0=", + "pXAS6NXfttw=", + "L7Yomzi3eFc=" + ], + "liquidity pool withdraw|protocol version 27|both non-native without liabilities" : + [ + "JalXUAF9b20=", + "Qpa3JrV4pLY=", + "pSCTBOr9yks=", + "sTDCmgYe/s0=", + "pBx/q6UNLdg=", + "PqCcTjPfKw4=", + "RJUCj6Qk2Nc=", + "Zg1VvoVVgbI=", + "B98PykTfhH4=", + "WvD+Cx8NWzE=", + "WbBOlufInd8=", + "qiFgKHxEH+M=", + "pJ6fI9onSPQ=", + "uHeNfeldpeY=", + "DfBFTlAW7X4=", + "+eTxOM93SoA=", + "ljG2/2WumfY=", + "R62Am0Pb53A=", + "16FqBMQhObE=", + "Jdsn9etSx9I=", + "j3i8AGxW97I=", + "UkPTyIceS5w=", + "Z2DlFN+HZbc=", + "YofrdSRuoa0=", + "yYQRgBMsOcQ=", + "On7F5pwtk+A=", + "+7ug0I4odzI=", + "jV1iTe4NBnk=", + "L3NX8yvH3Dw=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1000" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "6lV+Q8szXTQ=", + "mXjv3723hFs=", + "ruvVfGazffo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "xI2gT6C81rM=", + "oD/ItykwNDs=", + "7ssun2DqZWI=", + "YGK+xC1S71c=", + "71R80Y7MUUA=", + "CzS7t3iy+6M=", + "extEk5ryvxA=", + "2kHRkR6uBcI=", + "MO+zCVtx6zw=", + "r/o1iHX7L7M=", + "KPW2nN0oFKw=", + "7ZNaDlfK/7A=", + "vYmN0ehour4=", + "XpMjQCX3WDE=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1001" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "qbNWWS94uis=", + "kSPd6ffqo3E=", + "CfYlLDA8wLs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "+nZ0q1e7ZIo=", + "R1eE+oAKeXo=", + "O5HZx6IzFjQ=", + "P42D+cLdhd8=", + "Z44OdYoYlJI=", + "9t5iFVGFOgI=", + "jmAsAV4sIEE=", + "RcSrneHVmRg=", + "Fm24fbjC+OU=", + "lIabVllYFfI=", + "jdxxS9ydLtM=", + "MNKTLnpYOUc=", + "sqfAX5mine8=", + "sqlHfVgSZ+A=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1002" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "P3CrjwQpwrs=", + "s2ZG3LnofOQ=", + "aNVxvW32h+g=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "yqzx+3k3D60=", + "VbO/3UcCBzA=", + "a158pO2ALDA=", + "W/cKDy5Zxxo=", + "lN3farzpMMo=", + "yPDWIhxhPRk=", + "r6tHmIpPPE4=", + "HT9ekiicI70=", + "QWUUnJMC6Tw=", + "shBaODT+QXI=", + "QwNJsdtLnFY=", + "ogctZfqX0AQ=", + "AEmaN9oW8LY=", + "gDdF8Sg+kjQ=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1003" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "gZbrCZFCl/k=", + "oz4nTemvbmA=", + "5/p1qoUI8xY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "uLtl50CPOgI=", + "Qg8QGwEWlr4=", + "qaoU11u5NzI=", + "ff0KRHGRNto=", + "ujUXYLeply8=", + "9S1hiFrkDCw=", + "pizvNXzqplQ=", + "vCukk+zkgYQ=", + "GO+Lbh6br8Q=", + "t0LcZ3N1Eo0=", + "wrUfsAu55EM=", + "AmpPkRt/54E=", + "ZGntxzVSY9Q=", + "BO18lKIdCNk=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1004" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "xI4o28Ma/CI=", + "ZSzrQAPIs7U=", + "UqzkAuSC6W8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "h8yhhqSWE+s=", + "g2dWQE5D2ug=", + "CSFYMAkTrVs=", + "mI2q5ikWQkw=", + "4t1nh2NRMbA=", + "OaHUr5jXbdQ=", + "hzgfHce1iv8=", + "CnQmFDjm7jU=", + "cCq85GmjJmQ=", + "gHoxPOpBY68=", + "5oGZKe4MbpY=", + "D6SsxF9d/S0=", + "L+ZpFlEFKTs=", + "kPKse+XAfo4=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1005" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "/yy4cXD226Y=", + "F6DQ40+sl74=", + "aILq+wL0zJA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "yV7F2HHdhIY=", + "WwQrN7XyWr8=", + "u1FoS8lXD18=", + "pcrqOUhOrPU=", + "f4dvJNr2cYw=", + "w1iPKbHb+ZM=", + "vyh5thrfu+Q=", + "G6drLodnrK4=", + "OOGWBy2VO18=", + "8DKAcroOYVo=", + "/DLjfaVaaEo=", + "SPUCNtIpndk=", + "CJOJLEPtyR8=", + "B1MZRCttCEo=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1006" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "9YF4PsUENZo=", + "Ax1X1tS534k=", + "zO5jKWFkLOE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QtvzWjRNyps=", + "rK4WVA9S2rc=", + "BZSdPpvQzQE=", + "vNz2gVTNnwA=", + "KpraksXYFFA=", + "xE0mAKTVE/Q=", + "BZjRQSsLIlM=", + "iYrMAhI+DYI=", + "l/Jd0wWXq4Q=", + "wE3nWyfMd2M=", + "MmGtHSSY/pk=", + "jEu79aIe2y4=", + "bWo7Ra77or4=", + "SZvBu+HP4hU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1007" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "GNFLpQUK/OE=", + "3u8KjQRyHbI=", + "PC2MRXhpvr4=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WKsO1i0qvM0=", + "32l8pYiZ3mw=", + "uuoJauGZP7k=", + "FhMm/6S88Zw=", + "sIK8N56erVY=", + "9uSiSsk5IcY=", + "4t8CECZj6w4=", + "QQhAmL52wpg=", + "jj6vUQF74VM=", + "rAX7H4BDnio=", + "T46wwytY7l4=", + "CksbEy6bL3w=", + "9uqU6zJ0OBQ=", + "0OoHounEokc=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1008" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "b9VMvhugQSQ=", + "W+zXZQNS2bw=", + "DHkVZwJEmGI=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "4r6m09DEmNQ=", + "aGdl/S82jBc=", + "LM+AMYtTfo4=", + "Y/16m8lCk7k=", + "3avfSqDnbRs=", + "lJ3gNlNPJKw=", + "8zJgrExyf/U=", + "qTyaTUf1wzo=", + "Y2t3mBY6svU=", + "Vkc+QjCCU7Y=", + "EBMywg94nWU=", + "tLenvWIfk0Q=", + "hommyF+kkCQ=", + "iAMLZA9XZ2o=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1009" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "YVcZatfyI+k=", + "6Yse299GGN8=", + "e5QqIk640lw=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "qS3Td8WbvDY=", + "krH7GJh4GZA=", + "jYiKG8QQAq8=", + "lSmWGugpbCA=", + "6zbQD4rgCfo=", + "j5msCJHaEBw=", + "SoliTFakZ2k=", + "GLaTWqJ8xYg=", + "PEOuzxgdgBI=", + "GbeWHP7kiUw=", + "ds8q2jV6fvM=", + "jFa2QGyqE2Q=", + "RNR47XCgJhs=", + "v6t1gfaUbGM=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1010" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "rQAkH41fSSI=", + "u2raXDhM8UQ=", + "cG3OPmDy3XA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "CoVaQnuwzYo=", + "IqWOHV0R6G4=", + "L8eBEgt2uOg=", + "ycIsHKbErJQ=", + "6OZXGnV3770=", + "tGvvL3AYXnw=", + "j3hQU04RIWs=", + "0bX8WYFcZKg=", + "1pLH9Kfgsxg=", + "eq1gGFuXQaU=", + "Gqv8LHaopD0=", + "utTuqbK2G94=", + "9Z00lvCDNZM=", + "/OtOSSHpSp0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1011" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "zfvHIT53uSM=", + "D8gTjk9CMZ8=", + "fcjo+HS8mng=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "DFUcRNgyHlY=", + "Y1Y2v9YcpfA=", + "PKy7I4Zq/YA=", + "dMyWALjg9Lg=", + "BxYUv+Zpifo=", + "gRGnc+KY0jQ=", + "D7mxsSeCn14=", + "QCZi6iIWhkA=", + "Xg+OTorBb2I=", + "KCqY6ZdZjrM=", + "GN8Bu9/vHFE=", + "7x3aIudQkbo=", + "6AGUGdNIl6M=", + "7JTCOFumpcU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1012" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "/4jF7ulo21g=", + "Fe4fkcbcRMY=", + "3JTK0woNY4g=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "v6Bau2Rv8Uc=", + "ITnkXHgd31o=", + "a1cYZ1TYWAs=", + "UG/fkCUjYao=", + "IC5slD36/mo=", + "l4X8jhWpmo8=", + "K8DwRYFZGdg=", + "/Lz8lFNoCJw=", + "Bf3xhTWF4u0=", + "RVyXaG89+s8=", + "RLw4WQEJSXo=", + "W2ROW4LZMwk=", + "XFpC2lBX7vM=", + "/NOjl2SwdE0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1013" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "1cs8o/5lN2g=", + "3+yGcyAN878=", + "Wo7XjYt3pgs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "jSf4Q/d91qQ=", + "fmWQYEfCxrs=", + "WanSh3/LIVQ=", + "yXT/NkoISlY=", + "2eznaCyENnM=", + "p4ULYvzuDxY=", + "cujnkhsZ4HI=", + "gG310bb8e2g=", + "egX4NZuRQCU=", + "QSZenLcXOes=", + "g87QomHDcnI=", + "wIlEN9HpVrU=", + "GsupsiuJCnc=", + "8qx5CqdS0aw=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1014" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "pyBAMcvtTMQ=", + "oTSp543wilw=", + "T/fzU1z6txs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "kjO1IuzaGuQ=", + "U4W9a3+Rc9E=", + "T8cd/9b2u5c=", + "kzi84lxrcg4=", + "A3mYQ8AYnIs=", + "zVJYyUxEQzQ=", + "ZRKmaTqQDKM=", + "kc5RxpDlYEs=", + "FZXOOQL51RY=", + "iNOf0FzHmK4=", + "lMQXWhTudrA=", + "6nRnfkFDSxc=", + "+8cfw74gFOM=", + "GpBFPiL/nzw=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1015" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "lL9f6+MIATk=", + "Mx0b2rPCPlg=", + "BMgptnJdP7M=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "iG/UMnp3PDQ=", + "EFmH/eVp8pg=", + "SOruWYQujOE=", + "mo1Pay/bAyA=", + "D8OFbICav9o=", + "NPAcW7wNiec=", + "d5wguaLWKt8=", + "Ma1aTwvZzzE=", + "EeKw6CGbUhc=", + "es7DT4CIKBY=", + "UbNiaFJi4wk=", + "+PGbNa0qdAc=", + "bsvP1xn29X4=", + "LfkyxUzDS2g=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1016" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Iaa/Y61Je1o=", + "vS+6hfVRb+0=", + "c/9whUMk2Qo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WGLz2587Yj8=", + "PmUs/naNgEI=", + "PLfr1DVL3IE=", + "uCitfbNaRMw=", + "oXfiAC7fpr8=", + "/y32MW4LKYs=", + "cteCHhUPPxg=", + "VEcrSOYNZVs=", + "ftqB0lmSLHI=", + "vZVjgsy6r1Y=", + "Sa8y+E6Xvxg=", + "hhaXTbcbOCE=", + "uOpVNsyqj/Y=", + "MRWokxW+BGo=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1017" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "40PoRjMwA90=", + "4yuNwvJoHtQ=", + "5FCxZQY3HsE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "dkH4JmLFsGA=", + "hbLb4XkqK1k=", + "4PVK956931s=", + "+hTICGsTc/U=", + "MmoeJxt3X/0=", + "fIh9MEhXE6Q=", + "VTsWbSMgRFE=", + "0IU6A3dyEpE=", + "yo6K3bql1ow=", + "nstW36LoMH0=", + "yahILXL8DBI=", + "Cdg0UQcARdw=", + "zx/sIJRrjSI=", + "I8mVxYcOcdE=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1018" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "IvVdsKstucE=", + "o/F2r2LiLY4=", + "wGhtJdr+SDY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "WTHEHuDIOSQ=", + "pZrNEldVp+M=", + "zqORM3GyE4A=", + "gAfteTpqQjE=", + "0l6iVScnSCs=", + "eltkla0KNk0=", + "RGajbpqyyDQ=", + "aBSqXq5be6Y=", + "KPBu3XfMQZ8=", + "YzeIUhzk3RM=", + "/ioVCktafoU=", + "FP51O5+MzuQ=", + "MfzmIuhTbVA=", + "U6BVheX+UdA=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1019" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ZKYmGZN0HDs=", + "GqyOvzRBNhc=", + "tc+XraFigAY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "PlC3D+bGnj4=", + "HOht19xaz+A=", + "7enrDuTtEAM=", + "NvIBQNUL4eA=", + "Wjk755Pn3zE=", + "ScQ61+NtVJo=", + "28yMCf6+N+g=", + "NBVRhQasEBU=", + "gigwrmI5xRQ=", + "fF0q60urSyU=", + "gbg1Zart4N0=", + "Z7eez+Fy8ac=", + "YKKwzp1tjh4=", + "f4GHW0DJpgo=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1020" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Zwxhb+7OjX4=", + "MjrIRCcjTT4=", + "eQc6MV1HvXI=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "H1wfwW5zn0g=", + "W4Nx2FPuUqA=", + "Pl19l1jVrHo=", + "ARJ/L+v+iOI=", + "xUnlU5T6Z5w=", + "qAoiAn3n7Yc=", + "LuFQyhT+GZk=", + "VA1Fu8BoSGE=", + "VulwvtxNrsA=", + "bvkoV0rTT+w=", + "5bUQ/c1DMfE=", + "vUzNSYDj9aA=", + "Eb62/bWgwR4=", + "UTot0TylJ1U=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1021" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "i7vU1ICPlu8=", + "Kl9x4g1Lw1Q=", + "3wIO4vtLCH8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "FBQinfQJofA=", + "WUcZ278RTLo=", + "LkekHf0zsbI=", + "npuJj0JHVi8=", + "cXkjeEpJak8=", + "TPl0GPrT9sQ=", + "SzLN6WGOB+4=", + "Mry25IOvpaY=", + "kpQQBhSN2M0=", + "aQAZCfo5v8w=", + "6Od8dkTwyOI=", + "TCgBjW28qHs=", + "uqJpCYb8XsE=", + "FTmkVKC0Q5Q=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1022" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "9SNTrsaIxkc=", + "hkPhWmu9kFo=", + "8l4KkomIGQo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "lC40lapEKAU=", + "jUzMEmUKxOE=", + "+E5W38JBZrI=", + "cXqh1ykM7WI=", + "sCwbjIp58d0=", + "7JFuCBM+oJc=", + "Kp0xs3n2xpc=", + "idNYRjNkrOI=", + "IBXTDPHMyiM=", + "PfvpiCw3HCQ=", + "xlzs+Bmaqwg=", + "2On63jnYmxI=", + "rLnavBciXsE=", + "xICeUMEQweU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1023" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "HlAnqLU/ZEY=", + "nr4eW+PAUz4=", + "5WI7QrHSrSs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "jlwkcu9tmkg=", + "yy+I+dG9Ous=", + "abDD2VYp/hc=", + "r5zu89G1Mhk=", + "EqMNfZAAgSM=", + "cep++ra2F+8=", + "sKeetENXNEw=", + "WileP+5B/dM=", + "SVcewr4BuWQ=", + "viyQsBAeBkI=", + "eQT7oqMWncU=", + "k+ghW5/U268=", + "nCeTBECszW8=", + "OgWKB0zOeJY=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1024" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Kv2zJdNLNPY=", + "nJlG49hAKnw=", + "IGJiZiplguo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0EK+7NOljf8=", + "QtuPQtAsrnA=", + "hl4fZtHr3LU=", + "ZPC+XB/owWM=", + "OzyDa87GNTE=", + "d5ntoF3yBKY=", + "7EysrSbV4ic=", + "PEZkeBkk80g=", + "pW8zG/YDhnQ=", + "HU7sbTyARB4=", + "EEhfpsdXR9M=", + "rLyXBUBO0fg=", + "18SkYY9VyH0=", + "wq8p1VuDi0Y=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1025" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "JaLoDujzoBk=", + "bXvs47RvIp0=", + "38bxHEpLNp0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "4yC5kYhn598=", + "HlINWQTfZrk=", + "TN5LT9iW1vM=", + "AgTkM7loANY=", + "AkkzrbGcPk0=", + "SJ69npsVjdw=", + "lroWI9kjxSk=", + "D90woIDoY9U=", + "BfyIytd8fwI=", + "xqDzdGv7jLw=", + "b0mP8ZqcNv4=", + "kbma6p+TYI8=", + "36PNEoSSK2E=", + "VUJ3jqx1+Q4=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1026" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "TQ7uOubiH8Q=", + "OIGbVYi+vps=", + "L9W1tvo9IQQ=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "sVEVwW+M9J0=", + "PGbU8P3qfHc=", + "lGdxC9KJRug=", + "5uewMGRBhhk=", + "FFMWOPYv+TQ=", + "PhYxyLHSwNM=", + "PKWrRNhGCtM=", + "MQFCX4+kiUs=", + "66HU7QWsnL4=", + "CQcmuIlT8ZM=", + "3WrIzroMaJ0=", + "bTQDp0nEl0Y=", + "ivG5BikTXpg=", + "161K7D0ylEU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1027" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "3ucGSWDgcIE=", + "67jFXlSzG+s=", + "BM5s8nFNaR4=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QbQZV7G4o9o=", + "4rzYZPch2Sw=", + "IT3h1Hj6dxA=", + "2m4R9nF6RR0=", + "HeS5Qf35wN8=", + "G27JjGXAJxc=", + "yoQqY6wnnOU=", + "aklju40E2P0=", + "u4sU0Mn5xK0=", + "92W2/U3w1Ws=", + "0vZUtUJncPk=", + "D7BwBTi9s1Y=", + "Q1D4/a5ndFQ=", + "yWQmx6powQc=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1028" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "zbl3YuuQPvU=", + "znyBim3TAz8=", + "H7j3XhLZMUo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "R9a7Z2ET5eA=", + "lErDEKTEg0k=", + "XaiafLZOQS4=", + "9pwd1xUl7uc=", + "ZwH/nCrVvvM=", + "I5htP6p4+1s=", + "WUHHfbm1NIQ=", + "W3xC5V3q2VI=", + "7k1vhxX3uLI=", + "rL0KgS+71cQ=", + "SHwwlT9siZQ=", + "zsTPBLmmaiw=", + "hlCKx6MjZ4U=", + "NxXZ7iWOLLo=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1029" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "3kwlwyCnQ/s=", + "Dst3rhkcB8w=", + "phfkPaBqpl0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "37En36xWIJo=", + "DkfIzMbu5QE=", + "6czkgnZaMV8=", + "3teU3ltOC9c=", + "tfna7PsGFDs=", + "JjO+DLKdNpQ=", + "4GF83rEOCrY=", + "ZTJ/cjy8IIU=", + "Z18bTk1hAvE=", + "a0BG3jBTWAw=", + "uCs1p1J5/RU=", + "YRrejynRMhY=", + "67NNijQ3USs=", + "Nqllw7Ypy+E=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1030" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "qGq1bictV34=", + "gsxUKQr0xak=", + "BDc7sa10AVo=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "9DpthlKXkkQ=", + "fJcyaqsbcJs=", + "mY+wSwcIfGY=", + "PIkKYek6SUA=", + "LirzEmoJiOM=", + "+0zViQgq0KI=", + "E8JgvwUKeaU=", + "76c/XyeP5bI=", + "v+gkpvn2H1w=", + "2jS6XfA4iT4=", + "EYwV3UVMyO0=", + "p7Dv0E2ONP0=", + "nuMohuwOUVQ=", + "S+UnIEhG+l8=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1031" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "e6RG6dF5flc=", + "d31YFKri0t0=", + "bRy7/mMqjd0=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "xVGXru6wxJw=", + "+laOcwOjGZA=", + "202phgKg0nc=", + "iiBk2IfrMTA=", + "MMFKjcKRqA4=", + "TnnXB33Ufcg=", + "Ub2KjMCtkbk=", + "K/2uHJSqt5s=", + "uQ5gj8oBqRs=", + "dIFs1S6kVA4=", + "4Gm5+ALBUuQ=", + "9TwMlnz3hjg=", + "zN4TNQfdf08=", + "AJW2Tg1wM6w=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1032" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "PnednxvliLg=", + "w5OGZiM3QYA=", + "oWAsDE5acSM=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "XkMFMWNo8Ec=", + "u7G7ECBh5pM=", + "WryFCpYU0WI=", + "6YCow6SErdo=", + "W+xbufi/ESw=", + "nRSecrxDlM4=", + "4cefO5stPx8=", + "2kdWuMU/Nmg=", + "j1ZKd0jGx3o=", + "GGGh5uVnAuc=", + "e9AL/bXLCEQ=", + "57wBd+7+49Y=", + "ApGwHAH3ziU=", + "H1EUp4XgTC4=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1033" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "P35hP2NOBMw=", + "3dX9viiFHAY=", + "S/xpjy1R8Aw=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0hGX0Xbi6BA=", + "fqM05CAewPo=", + "lOETegqRhcg=", + "wuk0rN78PuY=", + "65kHj2//EKA=", + "JtGkuSWVL3g=", + "o3lZxnvnn6g=", + "vciJNFNCHiA=", + "vB73RIgj81s=", + "ds+QF9u87nE=", + "xumjAfIJoAg=", + "jg7iExM7xP4=", + "NT2OS3b8Yng=", + "aEWc8CFDS5s=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1034" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "CFUiAfko1ng=", + "MJi9JCS+5JQ=", + "lRFXWrTNd+Y=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "Q3h7gZD7iEg=", + "zRrdOxOhPVQ=", + "vomzEpsOtZE=", + "Ud0n3+rP3r4=", + "U0GQlfFaJZ0=", + "sUjJykVRRN0=", + "4tkwdqoPs64=", + "VN6iG+nF7Tw=", + "WBz8tz+ZmL0=", + "dFYCiDxG5kI=", + "V+12tTVFjr4=", + "qcVqZuj0/0k=", + "Carev2GF4vE=", + "jAjMCNgkrS0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1035" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "EPX/eyCZOj4=", + "JiFpxIAW+2A=", + "KxEtnecz1vk=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "lJrvjG2efCE=", + "ZKGcYboqblc=", + "Lv49qGwqVXs=", + "9KV7nuDHbGU=", + "lf49pC7iJzc=", + "u/L0LmYDcI0=", + "GV22TYlAwgM=", + "ZONURRG1Oms=", + "skaOrO5kg6Y=", + "wm9bS9eKuzs=", + "jZOdKh5TY2U=", + "22Ox4t3ziaM=", + "LleJPw3ee3E=", + "jmZmhGYHwB4=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1036" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "HEAYDajiqcQ=", + "2LLNohcXFd8=", + "tumqu8zm3BA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "HbK5Ih1UxgM=", + "snggIDH+XrU=", + "gJbBgJgdM4w=", + "iV+UupZzXuo=", + "138zrz98qfo=", + "Qd7Rx+40lCw=", + "m3Q3qysSR8g=", + "8vY1igF/Af4=", + "PMJwjUibRhc=", + "z+50kiL2Xx4=", + "Y74uvNEgtvY=", + "qc96IsmzO9I=", + "nfIhfuxaGSw=", + "jXEzSGJei+0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1037" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ndazgwezaTI=", + "+sarIWLA0iw=", + "QkXdjJYhOvY=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "hEyMitrZhMg=", + "yrnxRnnrTo4=", + "qdZxkVQV9PE=", + "cNUxME+m/WQ=", + "KBNsciGdRTo=", + "5t63V3tAPho=", + "0mAkDwHaUvE=", + "+99rUQfScic=", + "OR/QSKqew98=", + "rsJymufdULU=", + "BMFl3naspbk=", + "i6n6Xq4SBys=", + "DwI94/W0qmI=", + "AX8HrhyfjZM=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1038" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "YqlYxtk35gw=", + "loB5M7LxOcY=", + "EQMjm63r5Fc=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "Ewu4RDxTbtc=", + "FXn5C1T7XyM=", + "G4+VyONlOV0=", + "mfMdLcJwd4M=", + "6bDrD8+4cAw=", + "L3WHqvdAUOc=", + "yRpv1snKYOo=", + "Ae6hMedb0+8=", + "N2/F0P/SuFc=", + "UnQtMCupjRQ=", + "0bgcAOUtP7U=", + "Qi0l81Z6Ii4=", + "efvyc6thViI=", + "1A61FhE8cb0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1039" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "vkBc89y9Eg8=", + "JdrInXErMKM=", + "6msh8+Pd68Q=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "+iglweNHWas=", + "Dx84GJQ27cw=", + "v8/cWweCe7I=", + "GZqi+wxN6VM=", + "+ZImvTLUpkI=", + "AgpfIupS91Q=", + "Tn3c5nGy4EQ=", + "2v2CJWRixPw=", + "7WDw+Pg0Sxo=", + "RopcjwmGgTM=", + "UmJw2cg/17Y=", + "VtHPv7d1cks=", + "xG+vLi35FAM=", + "AFg5mIDEHaU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1040" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "D0r1Gf3lHc0=", + "rEdctVnqTcA=", + "UROGcsd0jiA=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "SyY72Sn3mq4=", + "t1iqSb+aplU=", + "JYZ/AzkZymc=", + "1UmSxRtWZQ0=", + "zDUKPbBOWCY=", + "H1orHmMxN/8=", + "kPqSs4aG2n4=", + "ELWmAxrwA0A=", + "CwqbyxEdYC8=", + "80qzRfXGDis=", + "9X1js/Kr+sM=", + "6nA8u2K1XN4=", + "0Eayfr2QKBw=", + "B7eyX9A2nik=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1041" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "OU2HKwHSBhc=", + "4zAdEsr3blQ=", + "M1nR34QEMio=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "0v5reNxfOK8=", + "6faNIdDoHrc=", + "73vol8PhrC4=", + "VOw14kmShW4=", + "qYjcYfwnfvo=", + "TMJMhf6uPPE=", + "GE//Y3OraRQ=", + "rlpX9py0Y2Y=", + "iAp8nQH5rRc=", + "99zlb20ut+s=", + "ZNYs9ATni+g=", + "E2pCPQj0PNg=", + "/0moNYrMa5Q=", + "W6Zy6Ct8Lec=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1042" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "nFCnUcdB+Jo=", + "SjComeuYS04=", + "YJKxJgX2uXs=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "EWjFg7uYhFg=", + "rHBiuzDPRRU=", + "Jmok2YYIXj8=", + "j2XdXJE4sf4=", + "7LKVuKzROL4=", + "zHrLzZdkpjM=", + "pdriHWaJ1+g=", + "uBvkC2RUSi4=", + "IyEGpFm6vSk=", + "b2jv5B59qSI=", + "EjqRD8qF+n0=", + "v22QOrr/fdw=", + "FTnK9bxIl/I=", + "0sk1nev6It0=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1043" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "U1ePGX2KguE=", + "FcdRlPlEsGQ=", + "xf0VYnHTakE=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "6kYtThvJTY8=", + "4J6phBPKwDQ=", + "QWjakhJhkF4=", + "EOUjOeS8FIs=", + "+wvo3rTBYas=", + "oqwyspDvVOA=", + "OHqV9dRWej0=", + "zWz2YQO2ZG0=", + "XZpFpNC8mg8=", + "AeMvwQCmUIQ=", + "oIXrjOwVpiI=", + "5aZal3wswBU=", + "3kzrAhrtk2I=", + "64MJLIjqcjw=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1044" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "ydYOhz1prhc=", + "6erfh15ueOQ=", + "hJ6ZT9e8Ps8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "R3zyV+OOyzU=", + "T8IfLyFY1eo=", + "UNzWqxoDA6Y=", + "wuR6elgLH98=", + "ZBg04QPH3oY=", + "5scTjWH7xdU=", + "uAggR9UDb0c=", + "mQwWi8zajy4=", + "BuriI22NNOQ=", + "PpVC+KZOCTU=", + "j6IqvbN3hiw=", + "eb/5nasgk2I=", + "GL0+9/V7imU=", + "haMDd9/ZeMw=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1045" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "Bq7Uc20Vef8=", + "aJWrxkhUlgE=", + "w5PqeUXM1mM=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "b/MosnXmv60=", + "qejjIE6V1R8=", + "9hV7TaM/TzM=", + "fMXgfc5ujDQ=", + "bOCKrlZEr8s=", + "anSNS4uKJiM=", + "Np8Ags4YVws=", + "HkSre1hHrqw=", + "By7Lx4PRenY=", + "5O5Q72PDaN4=", + "bT6TRH78YHU=", + "ynxuz8r2aLo=", + "ZQasWk0LmQ0=", + "GXBgDrfU8vQ=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1046" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "vQTqgqTiCn8=", + "VMniDiHei1E=", + "vJUoMi4E16M=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "PmmCEajWaCw=", + "1jp29f2Qs+U=", + "f/OaKkoVvLo=", + "R4Tg3JlnUxo=", + "j53tzASBXgw=", + "oJOvdYkDjTM=", + "f30/8KetVmI=", + "UMyaZK81M8Y=", + "RkPVvbwf0Bw=", + "a9LscoWqCYU=", + "MD3RlLft1ds=", + "RFN4CE2hw8I=", + "c3Ma8D6+6to=", + "vQA3ZM9yLBU=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1047" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "AHEnAUtaxfo=", + "p/w9zXhgv/Y=", + "H8ufjzkvCE8=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "QupPB1++TzY=", + "D7ZSIe2GqcI=", + "wkyn6Snl71U=", + "wuSMzAJcaDA=", + "XUiTqiAFaxw=", + "EbPop27GR/8=", + "5T367ZOL/W8=", + "+JkwhbJcxSo=", + "bECvqSI5dRU=", + "i55Ad2Zraq4=", + "1JNFVXbIp/U=", + "bzt8ZtHlZBQ=", + "akpfHN4EIVs=", + "qlt1oDPA+Qg=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1048" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "BpLeGJQE+Ag=", + "C2dDlSlMrcQ=", + "r1P6PmtFmgk=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "pQcyPATyIjk=", + "V39m3uSx/rY=", + "Ff0ZIBzp80g=", + "0G0uIB9uMfA=", + "7tKaJwRVlds=", + "uhexqreriCg=", + "t5KRuGQC9Cc=", + "2H+9QkfqnSI=", + "m+oaaiVEC80=", + "bNXiSEI5jXM=", + "bEnLQ+PxNSQ=", + "bMdTyI7cF5s=", + "o8TK5+vB1XA=", + "pSOdZK+VZJA=" + ], + "liquidity pool withdraw|protocol version 27|large deposit/withdraw test|deposit amount = 1049" : + [ + "u9VRzuLqxgg=", + "KQ8OEsXfsqY=", + "dW4ZRqVUH4g=", + "UaPDhM3/b0M=", + "OHkzt3/I7zI=", + "mpRR4LrQ1Rw=", + "Dmv66d53SeU=", + "NaXqzS+TRlU=", + "N+Lp15a8V2c=", + "KcItkxzYJrU=", + "X4twjyauFSI=", + "H7jd0Y3sSSg=", + "nPnU7bCPTw8=", + "VqFeJyhxg6s=", + "FNq509I6nuE=", + "RYeCftgcaCo=", + "7gC9itvUgso=", + "SxI2wVnKcLg=", + "Q0HpCR6Gx70=", + "tCTkCZjs4nM=", + "bjrtN7+yIMM=", + "E9QSFRGJwCU=", + "riHdEyb35Qo=", + "4EOFMftdQcs=" + ], + "liquidity pool withdraw|protocol version 27|line full on native balance" : + [ + "liGKKb9ZNGk=", + "0yWmXC8bHpg=", + "eI5ziCODOlA=", + "ylnSrcEMJ3g=", + "gSe1rKSyHaU=", + "rQro+2Ibehg=", + "cd66r5vmsgY=", + "8sL/A7nus4A=", + "natoretSKDk=" + ], + "liquidity pool withdraw|protocol version 27|malformed" : [ "JalXUAF9b20=", "GJ6Rc2VHP0Q=", "HeihScr6Tyg=" ], + "liquidity pool withdraw|protocol version 27|native asset withdraw is zero" : + [ + "I2iIYR+cu2w=", + "NZJc7DiSGXY=", + "1TNLdSWwsM4=", + "UGNeAi2j5fs=", + "dWbt+4lbYh4=", + "AKO1qOlPL2Y=" + ], + "liquidity pool withdraw|protocol version 27|one non-native issuer deposit and withdraw" : [ "bSl8k7iMyac=", "JNr0i65xn74=", "JpCDuLI1u80=", "/DhkYr01MHo=" ], + "liquidity pool withdraw|protocol version 27|one non-native without liabilities" : + [ + "JalXUAF9b20=", + "Qpa3JrV4pLY=", + "l0IDfLJkBzk=", + "fhkDjsSqrgI=", + "CQszqePQepU=", + "0iEqEJpeZ50=", + "4FwZU0ikZxY=", + "KiPWjA9bQmQ=", + "0j6Ne+t6ykY=", + "CNk0nC757gA=", + "mBJCELO/eFQ=", + "26kYQEE8IEI=", + "TsSNnZOS9LM=", + "48oVIEKawz0=", + "PlBwqOn+/t4=", + "LgRa8XFgs7U=" + ], + "liquidity pool withdraw|protocol version 27|withdraw into account with liabilities" : + [ + "c9sqqp4FuMM=", + "d91AowKrXxo=", + "VW0dXuy+Oag=", + "/fbkyJsiS+A=", + "Ozp68JQ9I/g=", + "8daVV/7fzPA=", + "pYY3wVxDTHw=", + "lqIEookVBfE=", + "R5R7r8pfDfQ=", + "NwUUkeNANpU=", + "tAmczXqjI5M=", + "XRyGRxzGjhw=", + "4isDr+X5NBQ=", + "ZXOCz0P9J2w=" + ], "liquidity pool withdraw|protocol version 2|not supported before version 18" : [ "/lfj8xIFS8I=" ], "liquidity pool withdraw|protocol version 3" : [ "1kTXt7VFL1o=" ], "liquidity pool withdraw|protocol version 3|not supported before version 18" : [ "/lfj8xIFS8I=" ], diff --git a/test-tx-meta-baseline-next/ManageBuyOfferTests.json b/test-tx-meta-baseline-next/ManageBuyOfferTests.json index ea609b0827..c045cef5e2 100644 --- a/test-tx-meta-baseline-next/ManageBuyOfferTests.json +++ b/test-tx-meta-baseline-next/ManageBuyOfferTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "manage buy offer exactly crosses existing offers|protocol version 0" : [ @@ -250,6 +251,18 @@ "+csPLbBQNXA=" ], "manage buy offer exactly crosses existing offers|protocol version 25" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "R/Dhcj3Ognk=", + "feEGCG8xQnA=", + "RJH2yrEZR7g=", + "DbDbNM4jcwU=", + "XLv6OD5dMYk=", + "+csPLbBQNXA=" + ], + "manage buy offer exactly crosses existing offers|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -297,12 +310,12 @@ "XLv6OD5dMYk=", "+csPLbBQNXA=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], - "manage buy offer exactly crosses existing offers|protocol version 25|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], - "manage buy offer exactly crosses existing offers|protocol version 26" : + "manage buy offer exactly crosses existing offers|protocol version 26|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], + "manage buy offer exactly crosses existing offers|protocol version 26|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], + "manage buy offer exactly crosses existing offers|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -350,11 +363,11 @@ "XLv6OD5dMYk=", "+csPLbBQNXA=" ], - "manage buy offer exactly crosses existing offers|protocol version 26|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], - "manage buy offer exactly crosses existing offers|protocol version 26|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], - "manage buy offer exactly crosses existing offers|protocol version 26|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], - "manage buy offer exactly crosses existing offers|protocol version 26|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], - "manage buy offer exactly crosses existing offers|protocol version 26|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], + "manage buy offer exactly crosses existing offers|protocol version 27|buy five for two" : [ "xJuCx4nV1Cc=", "vhgd+0TBdwQ=" ], + "manage buy offer exactly crosses existing offers|protocol version 27|buy one for one" : [ "oAD66q/FMSg=", "Lm28ZzQqjVE=" ], + "manage buy offer exactly crosses existing offers|protocol version 27|buy one for two" : [ "GVKRgPsSK0k=", "e1Kf1MLbP6c=" ], + "manage buy offer exactly crosses existing offers|protocol version 27|buy two for five" : [ "BGMdrHzgD4M=", "neVlgB57cGw=" ], + "manage buy offer exactly crosses existing offers|protocol version 27|buy two for one" : [ "/T7JI+20S1w=", "Yao68LidBWE=" ], "manage buy offer exactly crosses existing offers|protocol version 3" : [ "0V3jr/3FY6U=", @@ -472,7 +485,9 @@ "manage buy offer failure modes|protocol version 23|negative offerID" : [ "yvKt/HIfveM=" ], "manage buy offer failure modes|protocol version 24" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], "manage buy offer failure modes|protocol version 24|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 25" : + "manage buy offer failure modes|protocol version 25" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], + "manage buy offer failure modes|protocol version 25|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 26" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", @@ -515,9 +530,9 @@ "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer" : + "manage buy offer failure modes|protocol version 26|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -528,11 +543,11 @@ "HYUqomaUYCY=", "TP2z2mbq/aY=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check offer valid|sell not authorized" : + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check offer valid|sell not authorized" : [ "dc25tqTZu48=", "AwmjK3/10OE=", @@ -542,14 +557,14 @@ "/aP5f7hCJD4=", "1fMM5Je5E6k=" ], - "manage buy offer failure modes|protocol version 25|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 25|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 25|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|buying liabilities" : + "manage buy offer failure modes|protocol version 26|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 26|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 26|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|buying liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -560,7 +575,7 @@ "R806tTuTVNE=", "nlKy3Zs8rmI=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|reserve" : + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|reserve" : [ "siROrgQ74bc=", "ZdOlOkmdVkE=", @@ -575,7 +590,7 @@ "qkNMg2AOz+k=", "1FFnJoy76j4=" ], - "manage buy offer failure modes|protocol version 25|compute offer exchange parameters|selling liabilities" : + "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|selling liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -585,8 +600,8 @@ "lwCFYyQS0B8=", "WvKSEatXFxI=" ], - "manage buy offer failure modes|protocol version 25|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 25|offer must exist and be owned by source account to modify or delete" : + "manage buy offer failure modes|protocol version 26|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 26|offer must exist and be owned by source account to modify or delete" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -603,7 +618,7 @@ "6DLBf9kAP8U=", "o16tYBoJUAI=" ], - "manage buy offer failure modes|protocol version 26" : + "manage buy offer failure modes|protocol version 27" : [ "Pyr/d+8r+pY=", "w17SUKYtbWc=", @@ -646,9 +661,9 @@ "Pyr/d+8r+pY=", "w17SUKYtbWc=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|no issuer" : + "manage buy offer failure modes|protocol version 27|check offer valid|buy no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|buy not authorized" : [ "6RDQaVmC/lw=", "AwmjK3/10OE=", "BWdl2y+NzRI=", "rdRd/munH4o=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|no issuer" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -659,11 +674,11 @@ "HYUqomaUYCY=", "TP2z2mbq/aY=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check offer valid|sell not authorized" : + "manage buy offer failure modes|protocol version 27|check offer valid|no issuer|buy no issuer" : [ "UNpVboKf8Pw=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|no issuer|sell no issuer" : [ "6l2P74HlkC8=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|sell no balance" : [ "Hcw5dsgGZ0A=", "Z+O3kQ3KEPw=", "aTN3ztXzWRE=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|sell no trust" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check offer valid|sell not authorized" : [ "dc25tqTZu48=", "AwmjK3/10OE=", @@ -673,14 +688,14 @@ "/aP5f7hCJD4=", "1fMM5Je5E6k=" ], - "manage buy offer failure modes|protocol version 26|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 26|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], - "manage buy offer failure modes|protocol version 26|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], - "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|buying liabilities" : + "manage buy offer failure modes|protocol version 27|check valid|buying and selling same asset" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check valid|buying asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check valid|delete and create" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check valid|negative amount" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|check valid|non-positive price denominator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 27|check valid|non-positive price numerator" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=", "6QIwXhkL2Fk=" ], + "manage buy offer failure modes|protocol version 27|check valid|selling asset not valid" : [ "Hcw5dsgGZ0A=", "wZkRuwud5Os=" ], + "manage buy offer failure modes|protocol version 27|compute offer exchange parameters|buying liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -691,7 +706,7 @@ "R806tTuTVNE=", "nlKy3Zs8rmI=" ], - "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|reserve" : + "manage buy offer failure modes|protocol version 27|compute offer exchange parameters|reserve" : [ "siROrgQ74bc=", "ZdOlOkmdVkE=", @@ -706,7 +721,7 @@ "qkNMg2AOz+k=", "1FFnJoy76j4=" ], - "manage buy offer failure modes|protocol version 26|compute offer exchange parameters|selling liabilities" : + "manage buy offer failure modes|protocol version 27|compute offer exchange parameters|selling liabilities" : [ "kCwJyL3CZLk=", "/bp8WrxjDo4=", @@ -716,8 +731,8 @@ "lwCFYyQS0B8=", "WvKSEatXFxI=" ], - "manage buy offer failure modes|protocol version 26|negative offerID" : [ "yvKt/HIfveM=" ], - "manage buy offer failure modes|protocol version 26|offer must exist and be owned by source account to modify or delete" : + "manage buy offer failure modes|protocol version 27|negative offerID" : [ "yvKt/HIfveM=" ], + "manage buy offer failure modes|protocol version 27|offer must exist and be owned by source account to modify or delete" : [ "FMXW3IlI1Zo=", "1mF2geTxpc8=", @@ -886,6 +901,14 @@ "lpBD3TY8r4U=" ], "manage buy offer matches manage sell offer when executing entirely|protocol version 25" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "4OrSi9z+GKo=", + "lpBD3TY8r4U=" + ], + "manage buy offer matches manage sell offer when executing entirely|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -933,7 +956,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -952,7 +975,7 @@ "Si8l8KP2zb8=", "Ih2+vm4DZCQ=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -971,7 +994,7 @@ "9LwahxtBXB4=", "P7iW0J54EZs=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -990,7 +1013,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1009,7 +1032,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1028,7 +1051,7 @@ "nXD0+n+EWQ0=", "VxWvzwnKA9A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1047,7 +1070,7 @@ "Si8l8KP2zb8=", "JXbg50JohVk=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1066,7 +1089,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1085,7 +1108,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1104,7 +1127,7 @@ "nXD0+n+EWQ0=", "rP1qKilDQxY=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1152,7 +1175,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with no rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1171,7 +1194,7 @@ "Si8l8KP2zb8=", "Ih2+vm4DZCQ=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with no rounding|sell one for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1190,7 +1213,7 @@ "9LwahxtBXB4=", "P7iW0J54EZs=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with no rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1209,7 +1232,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with no rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1228,7 +1251,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with no rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1247,7 +1270,7 @@ "nXD0+n+EWQ0=", "VxWvzwnKA9A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with rounding|sell five for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1266,7 +1289,7 @@ "Si8l8KP2zb8=", "JXbg50JohVk=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with rounding|sell one for two" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1285,7 +1308,7 @@ "WdjaQGVLfkE=", "zZjEhuFnn+A=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with rounding|sell two for five" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1304,7 +1327,7 @@ "p++R+y5i86k=", "Mb5EiRTmJe8=" ], - "manage buy offer matches manage sell offer when executing entirely|protocol version 26|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing entirely|protocol version 27|with rounding|sell two for one" : [ "9qw3NARi9Zk=", "sM7hP7pg1a0=", @@ -1524,6 +1547,14 @@ "lpBD3TY8r4U=" ], "manage buy offer matches manage sell offer when executing partially|protocol version 25" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "4OrSi9z+GKo=", + "lpBD3TY8r4U=" + ], + "manage buy offer matches manage sell offer when executing partially|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1571,7 +1602,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1590,7 +1621,7 @@ "ewA0B4P0VwM=", "g21h4bL9KPk=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1609,7 +1640,7 @@ "Sha01cifH5k=", "z2yzf+lUsJE=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1628,7 +1659,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1647,7 +1678,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1666,7 +1697,7 @@ "Ac5A6C1nHwE=", "Hju0hRJNoAg=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1685,7 +1716,7 @@ "ewA0B4P0VwM=", "y06bMgzL924=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1704,7 +1735,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1723,7 +1754,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1742,7 +1773,7 @@ "Ac5A6C1nHwE=", "3Gc1DytluY0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -1790,7 +1821,7 @@ "4OrSi9z+GKo=", "lpBD3TY8r4U=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with no rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1809,7 +1840,7 @@ "ewA0B4P0VwM=", "g21h4bL9KPk=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with no rounding|sell one for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1828,7 +1859,7 @@ "Sha01cifH5k=", "z2yzf+lUsJE=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with no rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1847,7 +1878,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with no rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1866,7 +1897,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with no rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1885,7 +1916,7 @@ "Ac5A6C1nHwE=", "Hju0hRJNoAg=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with rounding|sell five for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1904,7 +1935,7 @@ "ewA0B4P0VwM=", "y06bMgzL924=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with rounding|sell one for two" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1923,7 +1954,7 @@ "xOBa+aJvdd0=", "WHaF7aCkxT0=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with rounding|sell two for five" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -1942,7 +1973,7 @@ "yvxV1S8Dqm8=", "iDUCwgfyEyc=" ], - "manage buy offer matches manage sell offer when executing partially|protocol version 26|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when executing partially|protocol version 27|with rounding|sell two for one" : [ "dUH184Fdtcc=", "sh03wV+rJJc=", @@ -2035,7 +2066,8 @@ "manage buy offer matches manage sell offer when not executing|protocol version 22" : [ "Vazya62AJ3s=", "HXWRSmG+rKE=", "T2T23nzwrC4=" ], "manage buy offer matches manage sell offer when not executing|protocol version 23" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], "manage buy offer matches manage sell offer when not executing|protocol version 24" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25" : + "manage buy offer matches manage sell offer when not executing|protocol version 25" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], + "manage buy offer matches manage sell offer when not executing|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2065,7 +2097,7 @@ "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2076,7 +2108,7 @@ "0A4JreVKLiA=", "a8CqyX+7nf8=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2087,7 +2119,7 @@ "0A4JreVKLiA=", "pr7SQKU6GO0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2098,7 +2130,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2109,7 +2141,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2120,7 +2152,7 @@ "0A4JreVKLiA=", "hHb8T/k28GM=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2131,7 +2163,7 @@ "0A4JreVKLiA=", "TrGur5LvGC0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2142,7 +2174,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2153,7 +2185,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 25|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2164,7 +2196,7 @@ "0A4JreVKLiA=", "poB17duzuw0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26" : + "manage buy offer matches manage sell offer when not executing|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2194,7 +2226,7 @@ "h1Vy0DbEc6A=", "KymCSP0cFAA=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with no rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2205,7 +2237,7 @@ "0A4JreVKLiA=", "a8CqyX+7nf8=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with no rounding|sell one for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2216,7 +2248,7 @@ "0A4JreVKLiA=", "pr7SQKU6GO0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with no rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2227,7 +2259,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with no rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2238,7 +2270,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with no rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with no rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2249,7 +2281,7 @@ "0A4JreVKLiA=", "hHb8T/k28GM=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell five for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with rounding|sell five for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2260,7 +2292,7 @@ "0A4JreVKLiA=", "TrGur5LvGC0=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell one for two" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with rounding|sell one for two" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2271,7 +2303,7 @@ "0A4JreVKLiA=", "hODMNE1MLjs=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for five" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with rounding|sell two for five" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2282,7 +2314,7 @@ "0A4JreVKLiA=", "TLZXDVfnWrw=" ], - "manage buy offer matches manage sell offer when not executing|protocol version 26|with rounding|sell two for one" : + "manage buy offer matches manage sell offer when not executing|protocol version 27|with rounding|sell two for one" : [ "dmU0zDhOpkY=", "KRGajCKCuZY=", @@ -2445,6 +2477,14 @@ "Kp44x9HwAyw=" ], "manage buy offer releases liabilities before modify|protocol version 25" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "6O3ED6Csu7U=", + "gJvu7dUL/Pw=", + "Kp44x9HwAyw=" + ], + "manage buy offer releases liabilities before modify|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2457,9 +2497,9 @@ "gJvu7dUL/Pw=", "Kp44x9HwAyw=" ], - "manage buy offer releases liabilities before modify|protocol version 25|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 25|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 26" : + "manage buy offer releases liabilities before modify|protocol version 26|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 26|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2472,8 +2512,8 @@ "gJvu7dUL/Pw=", "Kp44x9HwAyw=" ], - "manage buy offer releases liabilities before modify|protocol version 26|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], - "manage buy offer releases liabilities before modify|protocol version 26|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 27|change amount" : [ "IvVQoOCP5tU=", "Qn18slLjWv4=", "HQWaA94RBTI=" ], + "manage buy offer releases liabilities before modify|protocol version 27|change price" : [ "2n0mCMOc1zo=", "bYJTzNKPNEw=", "HQWaA94RBTI=" ], "manage buy offer releases liabilities before modify|protocol version 3" : [ "0V3jr/3FY6U=", @@ -2747,6 +2787,18 @@ "W5/GHvJp4RA=" ], "manage buy offer with zero liabilities|protocol version 25" : + [ + "yQ9zB1dUj1E=", + "h1Vy0DbEc6A=", + "KymCSP0cFAA=", + "dmU0zDhOpkY=", + "KRGajCKCuZY=", + "sYQ0bUdhZKA=", + "Vgyx0jvcc6k=", + "BYFbJiQDgw0=", + "W5/GHvJp4RA=" + ], + "manage buy offer with zero liabilities|protocol version 26" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2767,9 +2819,9 @@ "BYFbJiQDgw0=", "W5/GHvJp4RA=" ], - "manage buy offer with zero liabilities|protocol version 25|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], - "manage buy offer with zero liabilities|protocol version 25|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], - "manage buy offer with zero liabilities|protocol version 26" : + "manage buy offer with zero liabilities|protocol version 26|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], + "manage buy offer with zero liabilities|protocol version 26|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], + "manage buy offer with zero liabilities|protocol version 27" : [ "yQ9zB1dUj1E=", "h1Vy0DbEc6A=", @@ -2790,8 +2842,8 @@ "BYFbJiQDgw0=", "W5/GHvJp4RA=" ], - "manage buy offer with zero liabilities|protocol version 26|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], - "manage buy offer with zero liabilities|protocol version 26|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], + "manage buy offer with zero liabilities|protocol version 27|offer had zero liabilities after executing partially" : [ "e2pGdRdH89s=", "5eUl3gIAyuQ=" ], + "manage buy offer with zero liabilities|protocol version 27|offer initially had zero liabilities and does not execute" : [ "bGy1uv8u3JY=" ], "manage buy offer with zero liabilities|protocol version 3" : [ "0V3jr/3FY6U=", diff --git a/test-tx-meta-baseline-next/ManageDataTests.json b/test-tx-meta-baseline-next/ManageDataTests.json index b82e9688cf..d0d92d875e 100644 --- a/test-tx-meta-baseline-next/ManageDataTests.json +++ b/test-tx-meta-baseline-next/ManageDataTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "manage data|protocol version 0" : [ @@ -1219,6 +1220,69 @@ "manage data|protocol version 26|sponsorship" : [ "Nxc1wCMphbc=", "Q/Dc+hiCDls=", "Nxc1wCMphbc=", "Q/Dc+hiCDls=" ], "manage data|protocol version 26|sponsorship|create, modify, and remove sponsored entry" : [ "pqClGK5j2ws=" ], "manage data|protocol version 26|too many subentries" : [ "/MwafQLVTVY=", "VYl/z2T+lco=", "/MwafQLVTVY=", "VYl/z2T+lco=" ], + "manage data|protocol version 27" : + [ + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=", + "aOx4bIFUt0o=", + "oO/+1pwID2o=", + "BYjAjdO9QXo=", + "yT5lu4bhxIU=", + "6K0WkO3AMxI=", + "0y+eCGGtEU0=", + "5irlFRbPDfo=", + "BY4H3I/eGpE=" + ], + "manage data|protocol version 27|create data with native buying liabilities" : [ "+UuZn22VTR0=", "mXXwh1WHTiY=", "NZZl1uFhgvE=" ], + "manage data|protocol version 27|create data with native selling liabilities" : + [ + "+UuZn22VTR0=", + "X3XyNCCIBWc=", + "3KrfexL0wJ4=", + "lHEs/qReu4Y=", + "p0uwSHnLadw=" + ], + "manage data|protocol version 27|sponsorship" : [ "Nxc1wCMphbc=", "Q/Dc+hiCDls=", "Nxc1wCMphbc=", "Q/Dc+hiCDls=" ], + "manage data|protocol version 27|sponsorship|create, modify, and remove sponsored entry" : [ "pqClGK5j2ws=" ], + "manage data|protocol version 27|too many subentries" : [ "/MwafQLVTVY=", "VYl/z2T+lco=", "/MwafQLVTVY=", "VYl/z2T+lco=" ], "manage data|protocol version 2|create data with native buying liabilities" : [ "qCwjFNJMBnw=", "SKX1KAqXh00=", "rRWd2ki0jOc=" ], "manage data|protocol version 2|create data with native selling liabilities" : [ "qCwjFNJMBnw=", "53GEXRQ7pjE=", "rRWd2ki0jOc=" ], "manage data|protocol version 2|sponsorship" : [ "WgWa5IeywWM=", "Ic4hzQF8UuA=", "WgWa5IeywWM=", "Ic4hzQF8UuA=" ], diff --git a/test-tx-meta-baseline-next/MergeTests.json b/test-tx-meta-baseline-next/MergeTests.json index 43a33f774e..9481c295b1 100644 --- a/test-tx-meta-baseline-next/MergeTests.json +++ b/test-tx-meta-baseline-next/MergeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,35 +31,37 @@ 23, 24, 25, - 26 - ], - "merge event reconciler|protocol version 0" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 1" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 10" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 11" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 12" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 13" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 14" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 15" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 16" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 17" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 18" : [ "oPqXUREPP0I=", "mFxs3XoJDDQ=" ], - "merge event reconciler|protocol version 19" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 2" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 20" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 21" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 22" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 23" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 24" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 25" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 26" : [ "UCOtY8cTmUk=", "9ybx6LwBPPk=" ], - "merge event reconciler|protocol version 3" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 4" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 5" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 6" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 7" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 8" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], - "merge event reconciler|protocol version 9" : [ "aY6ZUVwD+3E=", "mhjKguWAhB0=" ], + 26, + 27 + ], + "merge event reconciler|protocol version 0" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 1" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 10" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 11" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 12" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 13" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 14" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 15" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 16" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 17" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 18" : [ "946Gw7a/SZc=", "SpcCjBDzYtE=" ], + "merge event reconciler|protocol version 19" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 2" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 20" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 21" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 22" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 23" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 24" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 25" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 26" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 27" : [ "s2o2xioje00=", "ddvBDIjxtEI=" ], + "merge event reconciler|protocol version 3" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 4" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 5" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 6" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 7" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 8" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], + "merge event reconciler|protocol version 9" : [ "8zlUmsxtkkA=", "aw+ESnScQMo=" ], "merge|protocol version 0" : [ "Z97ih4XRAb8=", @@ -917,14 +919,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 14|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "Fq2c8yQBLn0=" ], - "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "hDXdvyC4Fes=" ], + "merge|protocol version 14|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 14|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "JmvR8bH5qF0=" ], + "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 14|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "RmPoe6vRz30=" ], "merge|protocol version 14|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 14|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 14|sponsorships|with sponsored signers|into sponsoring account" : [ "gX3QhwjCqEY=" ], + "merge|protocol version 14|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 14|sponsorships|with sponsored signers|into sponsoring account" : [ "ihnMK2cyRtA=" ], "merge|protocol version 14|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 14|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 15" : @@ -1086,14 +1088,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 15|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "Fq2c8yQBLn0=" ], - "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "hDXdvyC4Fes=" ], + "merge|protocol version 15|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 15|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "JmvR8bH5qF0=" ], + "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 15|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "RmPoe6vRz30=" ], "merge|protocol version 15|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 15|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 15|sponsorships|with sponsored signers|into sponsoring account" : [ "gX3QhwjCqEY=" ], + "merge|protocol version 15|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 15|sponsorships|with sponsored signers|into sponsoring account" : [ "ihnMK2cyRtA=" ], "merge|protocol version 15|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 15|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 16" : @@ -1255,14 +1257,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 16|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 16|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 16|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 16|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 16|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 16|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 16|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 16|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 16|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 16|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 16|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 17" : @@ -1424,14 +1426,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 17|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 17|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 17|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 17|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 17|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 17|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 17|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 17|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 17|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 17|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 17|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 18" : @@ -1593,14 +1595,14 @@ "q7U5/WkUg9g=", "q7U5/WkUg9g=" ], - "merge|protocol version 18|sponsorships|is sponsor error|is sponsoring reserve" : [ "zF71FMGxS34=" ], - "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer" : [ "79deF65Ecas=" ], - "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "eAez8xOZ+xQ=" ], - "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer" : [ "xaMswztu06U=" ], - "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "x/kN1tKCRbg=" ], + "merge|protocol version 18|sponsorships|is sponsor error|is sponsoring reserve" : [ "SDCCV6zZfFs=" ], + "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer" : [ "DDzhvgmvoqg=" ], + "merge|protocol version 18|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "isuXpr49rbk=" ], + "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer" : [ "1U+QcJ+APlM=" ], + "merge|protocol version 18|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "165deIN+7Cc=" ], "merge|protocol version 18|sponsorships|with sponsored signers" : [ "XM49/M1a3W8=", "XM49/M1a3W8=" ], - "merge|protocol version 18|sponsorships|with sponsored signers|into non-sponsoring account" : [ "MueZKz0Bhfc=" ], - "merge|protocol version 18|sponsorships|with sponsored signers|into sponsoring account" : [ "F8dT1zg7H1E=" ], + "merge|protocol version 18|sponsorships|with sponsored signers|into non-sponsoring account" : [ "FiM0zHdi6HY=" ], + "merge|protocol version 18|sponsorships|with sponsored signers|into sponsoring account" : [ "aSn+c/215Bs=" ], "merge|protocol version 18|success|success - basic" : [ "ElvNHA9swMc=" ], "merge|protocol version 18|with create" : [ "T4g5mt2Qyr0=" ], "merge|protocol version 19" : @@ -1768,14 +1770,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 19|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 19|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 19|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 19|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 19|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 19|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 19|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 19|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 19|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 19|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 19|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 1|Account has static auth flag set" : [ "DH8wilAcZes=", "R6/tPSYNWDY=" ], @@ -2059,14 +2061,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 20|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 20|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 20|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 20|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 20|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 20|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 20|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 20|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 20|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 20|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 20|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 21" : @@ -2234,14 +2236,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 21|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 21|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 21|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 21|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 21|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 21|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 21|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 21|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 21|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 21|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 21|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 22" : @@ -2409,14 +2411,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 22|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 22|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 22|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 22|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 22|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 22|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 22|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 22|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 22|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 22|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 22|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 23" : @@ -2584,14 +2586,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 23|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 23|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 23|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 23|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 23|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 23|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 23|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 23|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 23|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 23|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 23|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 24" : @@ -2759,14 +2761,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 24|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 24|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 24|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 24|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 24|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 24|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 24|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 24|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 24|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 24|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 24|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 25" : @@ -2934,14 +2936,14 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 25|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 25|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 25|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 25|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 25|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 25|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 25|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 25|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 25|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 25|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 25|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 26" : @@ -3109,16 +3111,191 @@ "CwI8AfU7+Xc=", "CwI8AfU7+Xc=" ], - "merge|protocol version 26|sponsorships|is sponsor error|is sponsoring reserve" : [ "mjOOMuuETvk=" ], - "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer" : [ "wScmpNBc3rE=" ], - "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "fl+QPMQtc5k=" ], - "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer" : [ "Zx2z9owd7O8=" ], - "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EIjAfTtRvfU=" ], + "merge|protocol version 26|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 26|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 26|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], "merge|protocol version 26|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], - "merge|protocol version 26|sponsorships|with sponsored signers|into non-sponsoring account" : [ "Ljhni6g2D7U=" ], - "merge|protocol version 26|sponsorships|with sponsored signers|into sponsoring account" : [ "ehmOOijZg28=" ], + "merge|protocol version 26|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 26|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], "merge|protocol version 26|success|success - basic" : [ "TeBkT0wCpMo=" ], "merge|protocol version 26|with create" : [ "zKyJfQIorUY=" ], + "merge|protocol version 27" : + [ + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=", + "0YqFGbs0hR4=", + "Lh6mNq7+fzQ=", + "A2IL/qlmZQU=" + ], + "merge|protocol version 27|Account has static auth flag set" : [ "1U499PvTlHs=", "YZJAzGEP3ko=" ], + "merge|protocol version 27|With sub entries|account has data" : [ "zjgW8Jfzn40=", "Q43hpkPZ2x8=" ], + "merge|protocol version 27|With sub entries|account has signer" : [ "KQVxfIosim4=", "x/61dcZnEXs=" ], + "merge|protocol version 27|With sub entries|with trustline" : [ "O5uZEchwQEg=", "O5uZEchwQEg=" ], + "merge|protocol version 27|With sub entries|with trustline|account has offer" : + [ + "q1QR2McHDX0=", + "EMGUjScmiC0=", + "KgAt5UNq788=", + "545JQLQHdmE=", + "fX3f7SMNOGw=", + "sUbdy04L16M=" + ], + "merge|protocol version 27|With sub entries|with trustline|account has trust line" : [ "Q43hpkPZ2x8=" ], + "merge|protocol version 27|account has only base reserve" : [ "OVfYZoFrA7k=", "Ao6n0zrZKug=" ], + "merge|protocol version 27|account has only base reserve + one operation fee" : [ "beRc/55COqA=", "hEX8+qLql7o=" ], + "merge|protocol version 27|account has only base reserve + one operation fee + one stroop" : [ "ukFQmqrJzWw=", "9KMjlR1hbFU=" ], + "merge|protocol version 27|account has only base reserve + one operation fee - one stroop" : [ "Yd//3V9VIs4=", "zCf+3+CzXyE=" ], + "merge|protocol version 27|account has only base reserve + one stroop" : [ "17bpaMB3N+w=", "CDzct1YRvcg=" ], + "merge|protocol version 27|account has only base reserve + two operation fees" : [ "jhJdi00ew0k=", "ulUTwrgKKYk=" ], + "merge|protocol version 27|account has only base reserve + two operation fees - one stroop" : [ "n+tYG8Dkdy0=", "ISd63KPuaqU=" ], + "merge|protocol version 27|create, merge, create" : [ "zKyJfQIorUY=" ], + "merge|protocol version 27|destination with native buying liabilities" : + [ + "joVc5JdE7TQ=", + "I1V2eny1cDU=", + "CrODblM6ngc=", + "0fH4zn9tu/c=", + "IcHqJuoy2SE=", + "fZKlldTLLMs=" + ], + "merge|protocol version 27|merge account twice" : [ "hf3MnqNclDQ=" ], + "merge|protocol version 27|merge account twice to non existing account" : [ "hf3MnqNclDQ=" ], + "merge|protocol version 27|merge into non existent account" : [ "nk9cf8La5oQ=" ], + "merge|protocol version 27|merge into self" : [ "nk9cf8La5oQ=" ], + "merge|protocol version 27|merge too far|at max = success" : [ "3NZBFImk70o=", "YwNXLRJ3Chk=" ], + "merge|protocol version 27|merge too far|passed max = failure" : [ "8EbIzn1aeuw=", "ik+DaOcjIWs=" ], + "merge|protocol version 27|merge, create different, merge into the same" : [ "zKyJfQIorUY=" ], + "merge|protocol version 27|merge, create, merge back" : [ "Hr8sfoaK+Yc=" ], + "merge|protocol version 27|merge, create, merge into the same" : [ "zKyJfQIorUY=" ], + "merge|protocol version 27|sponsorships" : + [ + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=", + "CwI8AfU7+Xc=" + ], + "merge|protocol version 27|sponsorships|is sponsor error|is sponsoring reserve" : [ "V4Xc0a/cbLI=" ], + "merge|protocol version 27|sponsorships|with sponsored account|with sponsored signer" : [ "6yvBkVmpclI=" ], + "merge|protocol version 27|sponsorships|with sponsored account|with sponsored signer into sponsoring account" : [ "vXjtcYIddQA=" ], + "merge|protocol version 27|sponsorships|with sponsored account|without sponsored signer" : [ "WzIaBwLwigo=" ], + "merge|protocol version 27|sponsorships|with sponsored account|without sponsored signer into sponsoring account" : [ "EdGI9WLXnKw=" ], + "merge|protocol version 27|sponsorships|with sponsored signers" : [ "/JhFn374dzg=", "/JhFn374dzg=" ], + "merge|protocol version 27|sponsorships|with sponsored signers|into non-sponsoring account" : [ "QfC+A30MEk0=" ], + "merge|protocol version 27|sponsorships|with sponsored signers|into sponsoring account" : [ "aaRV6jC5SsQ=" ], + "merge|protocol version 27|success|success - basic" : [ "TeBkT0wCpMo=" ], + "merge|protocol version 27|with create" : [ "zKyJfQIorUY=" ], "merge|protocol version 2|Account has static auth flag set" : [ "DH8wilAcZes=", "R6/tPSYNWDY=" ], "merge|protocol version 2|With sub entries|account has data" : [ "/V2F8Zok2J8=", "R6/tPSYNWDY=" ], "merge|protocol version 2|With sub entries|account has signer" : [ "4TxVqBANtaY=", "D0MsJYVHews=" ], diff --git a/test-tx-meta-baseline-next/OfferTests.json b/test-tx-meta-baseline-next/OfferTests.json index 46d88d5b47..c74936b29f 100644 --- a/test-tx-meta-baseline-next/OfferTests.json +++ b/test-tx-meta-baseline-next/OfferTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "create offer|protocol version 0" : [ @@ -9758,13 +9759,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -9929,13 +9930,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -10100,13 +10101,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -11255,13 +11256,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -11426,13 +11427,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -11597,13 +11598,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 14|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -12597,7 +12598,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 14|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 14|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -12610,7 +12611,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 14|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -14211,13 +14212,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -14382,13 +14383,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -14553,13 +14554,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -15708,13 +15709,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -15879,13 +15880,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -16050,13 +16051,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 15|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -17050,7 +17051,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 15|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 15|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -17063,7 +17064,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 15|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -18664,13 +18665,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -18835,13 +18836,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -19006,13 +19007,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -20161,13 +20162,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -20332,13 +20333,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -20503,13 +20504,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 16|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -21503,7 +21504,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 16|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 16|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -21516,7 +21517,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 16|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -23128,13 +23129,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -23299,13 +23300,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -23470,13 +23471,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -24625,13 +24626,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -24796,13 +24797,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -24967,13 +24968,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 17|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -25967,7 +25968,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -25979,7 +25980,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -25992,7 +25993,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 17|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -26004,7 +26005,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 17|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -27616,13 +27617,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "+TuaxH4pHrU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "iNqds+vzjyQ=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "9G89F4KFb48=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "djDoQt2ap6o=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "CxHZ3bB6hpM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "w7A07+Psr1k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "x+fZYHcogIM=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "XL/1NC7m4Ok=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "Sx1OMS5cf9o=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "rFCWBF4+vWs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "4CvMUC+1zyU=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "6SEoZCtZ/60=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "H9lPXIlEgr0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "IwYf/Q8kQ3w=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "BrrE67VA1CU=", @@ -27787,13 +27788,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "nSmarm39WCU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "bYQ5Nyf4jLs=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "WfaweOoHbr8=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "7H5Ir2zVSHk=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "apgBH101d1E=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "HyrUePb7t7Q=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "GqFE8NpzwSg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "k3WK3r+uTVw=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "I3gED9mGKdo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "ot3l/ajMsik=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PqGQMR6SjEg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "BHx5R7i0GdM=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "021fawCRHc0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "2pchXB0pSX8=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -27958,13 +27959,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "BEuaZyOiBjs=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "4iBWRA8ADOM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "7hF1fC9fD3E=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "/W3htXxPL74=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "0exxx3TUNY8=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "UnPDutoTr5g=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "JJD8mIZCjgo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "cF+z9LPNbmE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "MZ/JYgk6ZNE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "oJQjdzUVh/I=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4X98qqS8mOo=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "7ZL+8r+WwTE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "YRAWOanF8cs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iMwLNXpl2mw=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -29113,13 +29114,13 @@ "/C2FaWc4aX8=", "L4JnXOiSFJU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "hVi78hxS6gM=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "i13I+YpfN3w=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "pEWX3awKXJg=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "hdK6/6rMUo0=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "FTMX64bdD6g=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ZqZf/6fOc2k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "tTPgiABMrBE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "TTle0g9Ui3Q=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "N3zMVbaCWTY=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "B8lqjnpGCXE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "opaTt51j0h8=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "PfSdgoBsQEQ=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9TZRGOJ+QVc=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "Zwqjf4xRLsA=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "BrrE67VA1CU=", @@ -29284,13 +29285,13 @@ "AV5gm2DQ2z4=", "zJSgA6FQn5U=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "BolzLhcBtns=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qRlgLBP1ybo=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "5f6CFTacY9k=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "wOv8RkG+3i4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "4XrRJnDONx0=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "xh+H8bwdd1w=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "ix5/r5qLigA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "AZ4OrxgOtN0=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "O2UyxHw2WB4=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6iAFJ3W1/Sk=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "qnbXIqT//uA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "rMS98BZ/uMY=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "3PXhjoHCHeE=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "n97QRWlVwM0=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "BrrE67VA1CU=", @@ -29455,13 +29456,13 @@ "9paUVzm4n0k=", "MItwosca4Ds=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "a2q1okIF/Wc=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "wAVA2HyWR70=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "jEv8+ddqJQg=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "V8D1Uxwkvd4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "bKtG79gYTWU=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "6x67qpt2aF4=" ], - "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "JdXQDt+3W2A=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "JW+EzAw3fYA=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "6Uv/HbslfMg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "lJhAkV1/1iI=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "+Xqg9XwYgXg=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "KyoI/WAsh4g=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "PCTILpZpsIs=" ], + "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "PQDtA4H8M1Y=" ], "create offer|protocol version 18|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "BrrE67VA1CU=", @@ -30455,7 +30456,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -30467,7 +30468,7 @@ "KN0O9Mwm9dg=", "gIoQa9dP0QI=", "UfJTQ/2gw3Y=", - "cDERqM5FdzE=" + "A0pW0Y1wckQ=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "y8djeIHXR8Y=", "y8djeIHXR8Y=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -30480,7 +30481,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 18|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -30492,7 +30493,7 @@ "Cdk0kmZp8oo=", "OJQzTMWxV3A=", "E8UE5j9s/NQ=", - "IkTMdxkWshI=" + "PeMGBxrz0tI=" ], "create offer|protocol version 18|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -32104,13 +32105,13 @@ "jEi/oDgMYTw=", "zQZnPZHP1+4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "uHmjY4zDD2c=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "EMtaGdvCxvg=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "M+ooT5wqn/M=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Q5TbT9AfRVA=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "NxMm0z6AEl0=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4Q3ZJTMesvQ=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Q8yQJ78/D0c=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "ld8dzi6CBz0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "yrBkfWB0eo8=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "4FWGMURbRO0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "d/nxWjB1zoM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "xux24VYPfds=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "HUWaiBHMRgs=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "GC+EDDK7GDo=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "AoNHCcYoPKk=", @@ -32275,13 +32276,13 @@ "r+ywmAxw/AY=", "0wJE93BslBI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "MEupXemQue0=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "PN7pZjrM2/w=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "0o0QijLiKaw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "xngxhFTQ1No=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "6CopCTT35nI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "N/G0xnk/M8c=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "kKlC+swAEEE=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "h3YA0jIySfQ=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Smt9j6hDJEg=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "AdMjXK21GVc=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "IRgYEMMq0fo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "Lexh4wdCr50=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "JVUZFyidNJo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "glK8GrMd3rk=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "AoNHCcYoPKk=", @@ -32446,13 +32447,13 @@ "old2Zl1sG3A=", "NAZJaGU3yNo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "hRuyazaAwww=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "oLwJdGCISzg=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "Feh+CBYMnco=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "q1dUNzxXFpA=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "MtLeS2hIDTw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "qs/wEDtF7MI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "Xkb954/BILk=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "DZhSBu0oqvI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "G6CaPXcpOjo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "JVj8XHaMNzg=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "Xr1Gkg0VVQY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "qCbUyx30jnY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "x9giCFTQuyI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "q13x3qDWIrI=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "AoNHCcYoPKk=", @@ -33601,13 +33602,13 @@ "jEi/oDgMYTw=", "zQZnPZHP1+4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "Jz46JCpWQ1k=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "6IdBlR8/ozM=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "Z46iC83UVrE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "A7+KHeHgaYY=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "h9fMQr980Yk=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "9zZ4adH+hfs=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "mtId1LPsXqo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "ryjRgzh0IXI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "pjKM9dyOhR4=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "Hb1MGgqGsLo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "IItDyLXtqfQ=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "njjy3MxIRRI=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "vNu6r9wS4Go=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "rY7iXm8OyMo=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "AoNHCcYoPKk=", @@ -33772,13 +33773,13 @@ "r+ywmAxw/AY=", "0wJE93BslBI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "pNH5L8O6wmM=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "ePC7/qUbMWs=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "dSKh6oRn0Nk=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RI2lm4juTps=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "H0sNkma6qRE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "yz420C1ggMw=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "rL9oNM1lBEo=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "MKgeodq4d1g=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "isxPENkzBtY=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "66D6WHjzsgA=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "E1cmcYP2+uU=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "IpSAsTorIaM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "kdTX7QboO4A=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "iHzAiwB06+4=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "AoNHCcYoPKk=", @@ -33943,13 +33944,13 @@ "old2Zl1sG3A=", "NAZJaGU3yNo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "O2BlaOvGmJo=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "g03dKmxeLJE=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "OWE/P1TA1VI=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "3UzYH7nBAH4=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "mb8IP2dHr+U=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "NHS2gvwOj78=" ], - "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "dYK1L6NrRGw=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "Zc3ZMi1P72E=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "1tmJWTeaPb0=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "8wgeedu6HTM=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "C5NjAxfFp7A=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "lwkVEhFxf/k=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "ugFjJoaGlH4=" ], + "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "FfUwXLzWR5o=" ], "create offer|protocol version 19|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "AoNHCcYoPKk=", @@ -34943,7 +34944,7 @@ "BbLK9YJrn5A=", "zzbX2podNyQ=", "4FbINmzBIBA=", - "u+0yKubT8ZI=" + "0M4jbR07Hyo=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -34955,7 +34956,7 @@ "BbLK9YJrn5A=", "zzbX2podNyQ=", "4FbINmzBIBA=", - "u+0yKubT8ZI=" + "0M4jbR07Hyo=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "D5amKeoTQrU=", "D5amKeoTQrU=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -34968,7 +34969,7 @@ "ZF9n5UpDFGU=", "LPmGBC5MPlU=", "UrWxEkoTuRE=", - "NUUHleQt54w=" + "K4M4ktmiXRw=" ], "create offer|protocol version 19|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -34980,7 +34981,7 @@ "ZF9n5UpDFGU=", "LPmGBC5MPlU=", "UrWxEkoTuRE=", - "NUUHleQt54w=" + "K4M4ktmiXRw=" ], "create offer|protocol version 19|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -37881,13 +37882,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -38052,13 +38053,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -38223,13 +38224,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -39378,13 +39379,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -39549,13 +39550,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -39720,13 +39721,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 20|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -40720,7 +40721,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -40732,7 +40733,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -40745,7 +40746,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 20|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -40757,7 +40758,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 20|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -42369,13 +42370,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -42540,13 +42541,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -42711,13 +42712,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -43866,13 +43867,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -44037,13 +44038,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -44208,13 +44209,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 21|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -45208,7 +45209,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -45220,7 +45221,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -45233,7 +45234,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 21|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -45245,7 +45246,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 21|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -46857,13 +46858,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8kwKesjeiVU=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "xnfrcOtROWY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "id8XpGZjUng=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "gsRlGURMr5A=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "ZvxX/MgYzAA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "b6gIHdV52+k=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Dm9HxFcsdVg=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "Iu8LUp1XezA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "lXUgNfKWVys=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "6BNYhYNdWRA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "Sl38yillMis=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "lNF8f0AFLns=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "1ncKVrL2muI=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "5Xg8Nes34Ts=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "xkdySnV8IpA=", @@ -47028,13 +47029,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "g7tslWlqhrE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Xg9brYuj6Ak=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "DdfYXwtrodk=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "2HKMnjp9SWc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "jCZEzwWyX5w=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "G3IVyZjw6eQ=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "OvWYNLsMi7I=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KOr6SiIOfrI=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "Rftrzqq/XyU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "8Myr1m7zNnk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "PN1KCC21xz4=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "HVAdrR2pA4E=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "auwfYQKZhac=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "ZuGp49ij6EI=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -47199,13 +47200,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "SFMGi0jCgIY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "+7VXhnHyvQA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "+wsTgcje3xg=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "4x49QQjP6QE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "fRAmnNlGJk0=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "XWEfKCDaN5A=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "VWpEYsavPjo=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "lD/wbANdXaE=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "Xcm7T/5YdC0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pKskPeBUl3A=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "3728I8u2tVU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "ZrpYt5NxS8Y=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "Zb7k4/cVfVY=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "lZ4rcWL1gJk=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -48354,13 +48355,13 @@ "klTpLNtQ0kE=", "sjhnPsYGjjc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "KfRwzxqnWgo=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "c7zEpO/VO8Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "AFSsjOgH4UY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "GtPu26PojH4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "YWqvgrnqm3I=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "2p4DlWcvVQc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "s0476ebFY6g=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "WkouV0AQaNQ=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "VJQ7cl0wg/Q=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "4sQngncajJ0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "rqEP1raQXM8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "+WwkW9D8xk4=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "uImfHVLQ0Sk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "dOh3978gEHo=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "xkdySnV8IpA=", @@ -48525,13 +48526,13 @@ "fOHDAA2m8U4=", "I1lTQ+a5S0Y=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "NLsF2x1WnIM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "qvpMlfF/454=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "Ho6HbDSVwc4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "vhnXLLtK3yg=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "mtrqy6Dk/Tc=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "pwSpdXKnapM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "WdNxmaQnzS8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "jKiqR3QsjIA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NA/Uq9tofp8=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "4x6Mnmcc/Do=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "zRXwDjXueTs=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "VsIwE9iC3Mk=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "41n5fMzZgmg=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "95blcWFC+us=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "xkdySnV8IpA=", @@ -48696,13 +48697,13 @@ "ednjPU1cCcE=", "PhNjMeHNBAw=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "G7qapCIdQ3U=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "mHpNUSaRtwA=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "2WW8Xu3Y8SE=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "Omx/JeNWAW4=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "44I7BPl++tY=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "juh4S6keKfM=" ], - "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "rzQbUms8Qk0=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "E/hm81rQ5qU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "oz438QHHAbY=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "yjqce7Cj0dA=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "1UxTsDRfrIc=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "VheFq0dogkU=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "d2Eupmnhg3E=" ], + "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "/7ZBSRWPYqk=" ], "create offer|protocol version 22|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "xkdySnV8IpA=", @@ -49696,7 +49697,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -49708,7 +49709,7 @@ "dRffIgJwkAA=", "iVkS7J/I7Rk=", "ymBM4O/XDQQ=", - "Q0Xdvos+QOw=" + "6be6+mZEUvY=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9qmr7vBag9s=", "9qmr7vBag9s=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -49721,7 +49722,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 22|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -49733,7 +49734,7 @@ "qWM+ESKO+kY=", "0GYpyPhqS28=", "gRLl9AW45Zs=", - "rXWJCITNXEg=" + "+OHt6Seo6lg=" ], "create offer|protocol version 22|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -51345,13 +51346,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -51516,13 +51517,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -51687,13 +51688,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -52842,13 +52843,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -53013,13 +53014,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -53184,13 +53185,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 23|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -54184,7 +54185,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -54196,7 +54197,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -54209,7 +54210,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 23|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -54221,7 +54222,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 23|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -55833,13 +55834,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -56004,13 +56005,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -56175,13 +56176,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -57330,13 +57331,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -57501,13 +57502,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -57672,13 +57673,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 24|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -58672,7 +58673,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -58684,7 +58685,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -58697,7 +58698,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 24|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -58709,7 +58710,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 24|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -60321,13 +60322,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -60492,13 +60493,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -60663,13 +60664,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -61818,13 +61819,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -61989,13 +61990,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -62160,13 +62161,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 25|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -63160,7 +63161,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -63172,7 +63173,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -63185,7 +63186,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 25|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -63197,7 +63198,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 25|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -64809,13 +64810,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8NRQtB5+HYE=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "RCcvN1XeXyc=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "p/5WxQqH0mM=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "sT1SlGsXV0g=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "f9XLmfgfswg=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "8FjOkOzV4Cc=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "ScVEzZk/KMQ=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "8RIGon3TLU0=", @@ -64980,13 +64981,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "SsyntkNU+N4=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "RzcAXYwf33g=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "cNmqIWYL04I=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "qeEeuhYw/Aw=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "kIJHBmi2xLw=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "4sU4Vsf+nvk=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "Wd+tg+LGV/Q=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -65151,13 +65152,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "Efh+HBYfuXY=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "AX5zLIrPjXw=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "05bKuFtvyIY=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "y8uaPYjhJno=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "jenlmolp1Z8=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "bXYGy75rYS4=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "iWkUOMdmQgI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -66306,13 +66307,13 @@ "iZz2+LJX2yc=", "L8oWrz8q0Bs=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "MTQ0yrANbz4=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "vqjzj+WIKUc=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "fw5Qo0ZMfXg=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "FtsVFoIUB5s=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "Cy8MZjpj/hs=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "ajMm+QA8bp4=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "XD6proZo820=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native" : [ "8RIGon3TLU0=", @@ -66477,13 +66478,13 @@ "Vl3rvyG97p4=", "Qsa6crcEvk8=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "s1oBI2fKHos=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "NTpJmlF/ROg=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "HJmICRktrC0=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "z2MU3m2+G78=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "fBQFvg3paXQ=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "4h9RnX+OGeE=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "Wz+5eIS6TYc=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : [ "8RIGon3TLU0=", @@ -66648,13 +66649,13 @@ "k4ceera8eqA=", "95+fNRpbLGk=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "UlANeBYtf0c=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "+3ajjMK7CXo=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "HVFWrGDvG68=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "RAml8nag/lw=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "Jk930yXQmtU=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "y5PjNN9lYOg=" ], - "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "jhItl1lmTAU=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], "create offer|protocol version 26|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : [ "8RIGon3TLU0=", @@ -67648,7 +67649,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : [ @@ -67660,7 +67661,7 @@ "NuR0j7eX2eE=", "forTcGol0rQ=", "mEo7fK0TRuo=", - "ZhO2suQCYxc=" + "PnKS1C85mJw=" ], "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : @@ -67673,7 +67674,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 26|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : [ @@ -67685,7 +67686,7 @@ "L0Diqa4i41c=", "fEhXL/cAXX8=", "9yZIZSpYTs0=", - "2cSReB7kLRo=" + "qRduamYzL9Q=" ], "create offer|protocol version 26|reserve and liabilities checks|when creating an offer|buying native" : [ @@ -67906,6 +67907,4494 @@ "hiJ2B0okUrQ=", "g/DPny6DRMs=" ], + "create offer|protocol version 27" : + [ + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=", + "8DkBIPhVwaY=" + ], + "create offer|protocol version 27|cannot create offer that would lead to excess liabilities|native buying liabilities" : + [ + "cdx9sXUdAsM=", + "lkQrDje8Tbc=", + "ldTJh9v0SfY=", + "VfGVmWS4s2Y=", + "/zYBi1Ww41g=", + "18J1s/8oKjg=", + "hkXgu5TUO9I=", + "SgFUBd4pxdo=", + "A1um9SR+i4E=", + "144GsFI44Uk=", + "UNm1vlBsZjw=", + "WOhFu94ASjg=" + ], + "create offer|protocol version 27|cannot create offer that would lead to excess liabilities|native selling liabilities" : + [ + "TpbtCUm7fvs=", + "6H1BgbsMh3I=", + "8LLdl+NRa0E=", + "vNfuva16tUA=", + "hymMKqtWtb0=", + "CB/ijLs1Euk=", + "h5/+BesVuew=", + "ypUXpmkh3/o=", + "jTbWBy3+gtk=", + "0kEhfVBhpuQ=" + ], + "create offer|protocol version 27|cannot create offer that would lead to excess liabilities|non-native buying liabilities" : + [ + "3GvVv4IuXeg=", + "pv13qalnq+g=", + "BlZXnCcFhSc=", + "QL5gZ8vtk/I=", + "Q7GdQX5bMcQ=", + "Yad09Sx2DEE=", + "DENPOds7NcQ=", + "EQ7qHaZGkbc=" + ], + "create offer|protocol version 27|cannot create offer that would lead to excess liabilities|non-native selling liabilities" : + [ + "3GvVv4IuXeg=", + "Caj3pLBn1i8=", + "N8SyLZb7y6A=", + "QL5gZ8vtk/I=", + "u7yqQYlKEbk=", + "A8arn5pzEXo=", + "SLySKIF+lHk=", + "5buJDWM1z0Q=" + ], + "create offer|protocol version 27|cannot create unauthorized offer|allow trust" : + [ + "I+8qq0t8CQk=", + "Xge+5pLaTYA=", + "prBE5Ub8KzM=", + "2NvfnXl4dFY=", + "/pFfRwei3hQ=", + "+EISFUAHZT0=", + "KiIWn8PRFeE=", + "ZupADRRggFk=" + ], + "create offer|protocol version 27|cannot create unauthorized offer|set trustline flags" : + [ + "I+8qq0t8CQk=", + "Xge+5pLaTYA=", + "prBE5Ub8KzM=", + "2NvfnXl4dFY=", + "/pFfRwei3hQ=", + "+EISFUAHZT0=", + "KiIWn8PRFeE=", + "ZupADRRggFk=" + ], + "create offer|protocol version 27|cannot modify offer that would lead to excess liabilities|native buying liabilities" : + [ + "cdx9sXUdAsM=", + "lkQrDje8Tbc=", + "ldTJh9v0SfY=", + "CmZwLDjCabE=", + "5xXEvm1lGgo=", + "snZTifbtnTc=", + "BdHTUMO516w=", + "7Z+gaP2v36o=", + "99auBHjXqiI=", + "mS0j7gp5EBY=", + "eLN1WcT4dTM=", + "tG6KZoeWgnk=", + "w22hAQg52Z0=", + "uISn8aF5bP0=", + "QtCZiA3eJAk=", + "LX0ihE2U+Yo=" + ], + "create offer|protocol version 27|cannot modify offer that would lead to excess liabilities|native selling liabilities" : + [ + "TpbtCUm7fvs=", + "6H1BgbsMh3I=", + "8LLdl+NRa0E=", + "PinFuw7sOY8=", + "bUZSJBtMuy0=", + "L45GQ818WYs=", + "57zPrBA4Dyo=", + "dbbr6nXISXs=", + "LmdMLj/0e6Y=", + "5LJqmzXWo3k=", + "tEDDdk2AL8c=", + "fTTA9HhrjsQ=", + "2b75EzDvgdI=", + "uR+4d9PTOrI=" + ], + "create offer|protocol version 27|cannot modify offer that would lead to excess liabilities|non-native buying liabilities" : + [ + "3GvVv4IuXeg=", + "pv13qalnq+g=", + "BlZXnCcFhSc=", + "WZEuXBdbjJY=", + "nhYZXq0gCSQ=", + "HmGdl5yx42k=", + "g77Azpm4Nmg=", + "aKGs8St/tAI=", + "9n31IC74pY8=", + "V8lJOm3deR8=" + ], + "create offer|protocol version 27|cannot modify offer that would lead to excess liabilities|non-native selling liabilities" : + [ + "3GvVv4IuXeg=", + "Caj3pLBn1i8=", + "N8SyLZb7y6A=", + "2d/GKR3mVs4=", + "g5bYUlp7PgI=", + "DaGf+qI9PcQ=", + "eTcJyMbl+Cw=", + "cnZq+T+92VU=", + "1P3u0UM7bYE=", + "0PnaSbS5uq4=" + ], + "create offer|protocol version 27|create offer" : + [ + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=", + "vJz1+bmJiGQ=", + "NcBDP44yCpE=", + "eZBgZnX8eyA=", + "Qm8Qsw7Kw7A=" + ], + "create offer|protocol version 27|create offer errors|create offer with amount 0" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "nFcaIqjnkMo=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 27|create offer errors|create offer with invalid prices" : + [ + "TduHde2iHmg=", + "kLdTQSsnWU4=", + "m5n9nsLNMaY=", + "0Ok6SxRrGR0=", + "ehm+8ayTp2M=", + "RdgrA1SdQzw=", + "dnicyr78wKc=", + "uyPYStzcIjM=", + "ox4sYMwWLII=", + "2fw0j//bItg=" + ], + "create offer|protocol version 27|create offer errors|create offer with trustline filled up" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "nFcaIqjnkMo=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 27|create offer errors|create offer with trustline filled up to INT64_MAX" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "LTxe8kcDRcg=", + "o+vsh9+4vjM=", + "/S9Ll+qP8KE=", + "HPOItNF5ViM=", + "UMvaHUUMq6A=" + ], + "create offer|protocol version 27|create offer errors|create offer without XLM to make for reserve" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "yUcLGytPZVA=", + "o+vsh9+4vjM=", + "tD7+50CJxD4=" + ], + "create offer|protocol version 27|create offer errors|create offer without account" : [ "R6/tPSYNWDY=" ], + "create offer|protocol version 27|create offer errors|create offer without having any amount of asset" : [ "gtWbZb+BzI4=", "t5veyk9epYo=", "OPl5DSNzLgE=" ], + "create offer|protocol version 27|create offer errors|create offer without issuer for buying" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "Y9NuNOe899E=", + "saP+bkFFruM=", + "E9EXeSjP+qk=" + ], + "create offer|protocol version 27|create offer errors|create offer without issuer for selling" : + [ + "gtWbZb+BzI4=", + "t5veyk9epYo=", + "4vsxQY/8qxs=", + "saP+bkFFruM=", + "PqaAm1A88SA=" + ], + "create offer|protocol version 27|create offer errors|create offer without trustline for buying" : [ "gtWbZb+BzI4=", "t5veyk9epYo=", "4vsxQY/8qxs=", "DNTypdsjvJs=" ], + "create offer|protocol version 27|create offer errors|create offer without trustline for selling" : [ "gtWbZb+BzI4=", "A2JZa+wbHLQ=" ], + "create offer|protocol version 27|create offer|idr -> xlm" : [ "5wW4tGamaUs=" ], + "create offer|protocol version 27|create offer|issuer offers" : [ "HTSSlz3tj5M=", "HTSSlz3tj5M=" ], + "create offer|protocol version 27|create offer|issuer offers|issuer claims an offer from somebody else" : [ "xKX+wrJbovM=" ], + "create offer|protocol version 27|create offer|issuer offers|issuer creates an offer, claimed by somebody else" : [ "LjFWaBDy6Vk=", "xsQzSRmzlzo=", "5UCQtJsuw+U=" ], + "create offer|protocol version 27|create offer|multiple offers" : + [ + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "McQcoP3Hen8=", + "d2iFgmnVy1c=", + "VUQ65F+2o/0=", + "0uifSIpXnKw=", + "KG+GzOq4a9o=", + "jvXFQEYAbew=", + "8HN+iSKLDyg=", + "zGi0NzKIaW4=", + "y0wJjbh1CS0=", + "b6V20iHZpD0=", + "IqDNY0Z3gYw=", + "tcS5lZXpzB0=", + "li7+N2dsXMY=", + "4N34+8xNJSw=", + "ZfhUUnhHVSc=", + "vn7N28fQB24=", + "N/JCYhW+H8g=", + "m0bysEp8StU=", + "3WqwqpFBncY=", + "0ujqisVshoU=", + "6nKQBUYguMQ=" + ], + "create offer|protocol version 27|create offer|multiple offers|authorized|multiple offers with small amount crosses" : + [ + "eDqyEqV6bgM=", + "x6hXsqriF2E=", + "AXeJPXc4JqM=", + "ujNuc4fWgX4=", + "pNr3+wNG7ns=", + "cmX2xkdOOH4=", + "qknNuQHeRAA=", + "G7JfYbf09QQ=", + "wNCjwdRnD3s=", + "Jivde3Mb2FQ=", + "GoNx0g6KoxE=" + ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer crosses and removes first" : [ "eDqyEqV6bgM=", "GhLrKY4r7g0=" ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer crosses, removes all offers, and remains" : [ "eDqyEqV6bgM=", "ynmF6LKBn+I=" ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer crosses, removes first six and changes seventh" : [ "eDqyEqV6bgM=", "yk3XEMqVruM=" ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer crosses, removes first six and removes seventh by adjustment" : [ "eDqyEqV6bgM=", "oQMpLfBIG4A=" ], + "create offer|protocol version 27|create offer|multiple offers|authorized|offer does not cross" : [ "eDqyEqV6bgM=", "BmAWapQvpJc=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|multiple offers with small amount crosses" : + [ + "ux/M43lvKnA=", + "4sl7NkHB70s=", + "3bmnSFiJyLg=", + "39ndYX+hYys=", + "r8vPjvmrx9M=", + "NoB8JOIlCFs=", + "MdD7mCz/2eU=", + "ySh22OnMLMk=", + "+ZjinSYre2g=", + "3BKiqyBeppU=", + "L5hAzMZF5jY=", + "p5jTcJ9HYjw=", + "BVyqkL1FVi4=" + ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses and removes first" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "6WifU9vBAxA=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes all offers, and remains" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "shfaaKzg/vY=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes first six and changes seventh" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "FL1fc/Qld/s=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer crosses, removes first six and removes seventh by adjustment" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "EHbXY/+ZhGU=" ], + "create offer|protocol version 27|create offer|multiple offers|buy authorized to maintain liabilities|offer does not cross" : [ "ux/M43lvKnA=", "4sl7NkHB70s=", "3bmnSFiJyLg=", "1vzKlVseBLg=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|multiple offers with small amount crosses" : + [ + "ux/M43lvKnA=", + "S4FgTbDbFcc=", + "3bmnSFiJyLg=", + "oINzJvkRyfc=", + "v8VFXcQXFfM=", + "B4aNgYgAajY=", + "YD3nFbAavIc=", + "08cYGDB8h6I=", + "D85YxjeeG8E=", + "6esArL0jeR4=", + "d3KROGvYdeI=", + "vDUaO7x+POc=", + "i280WSrs/VY=" + ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses and removes first" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "mjerHq6T8WI=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses own" : [ "NLdFiFEEpnc=", "VtVnrATL8mg=", "Cdmbk4Pwxxk=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes all offers, and remains" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "4TNv513kubY=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes first six and changes seventh" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "9lVwv21QKA8=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer crosses, removes first six and removes seventh by adjustment" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "hEuc6vTedDQ=" ], + "create offer|protocol version 27|create offer|multiple offers|sell authorized to maintain liabilities|offer does not cross" : [ "ux/M43lvKnA=", "S4FgTbDbFcc=", "3bmnSFiJyLg=", "1vzKlVseBLg=" ], + "create offer|protocol version 27|create offer|offers with limit when buying" : + [ + "rtv4NP6/SfU=", + "7T5TOndu1Dk=", + "7ITTnsOOO7I=", + "67NARNPBvkg=", + "lF1tGsCoxrA=", + "k4LDu8nJI1o=", + "cAbvuKMHaPU=", + "sA1e5OlnGvo=", + "DJT2Gd+6EHk=", + "sdsdVVXOKxE=", + "rtv4NP6/SfU=", + "7T5TOndu1Dk=", + "7ITTnsOOO7I=", + "67NARNPBvkg=", + "lF1tGsCoxrA=", + "k4LDu8nJI1o=", + "cAbvuKMHaPU=", + "sA1e5OlnGvo=", + "DJT2Gd+6EHk=", + "sdsdVVXOKxE=" + ], + "create offer|protocol version 27|create offer|offers with limit when buying|Source account limit" : [ "NuhnPlMJJTQ=" ], + "create offer|protocol version 27|create offer|offers with limits" : + [ + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=", + "7r9CKU642Hw=", + "wWtxyHbGev4=", + "MKYTrpPm8aQ=", + "u2eacD+OKXg=", + "jF7Ew9cA4Jw=", + "hj5oWFRwUUQ=", + "un3k93ckUkg=", + "4CAliLNtyWY=", + "cYUwyukQ5LE=", + "bwtJpGfoT00=" + ], + "create offer|protocol version 27|create offer|xlm -> idr|create" : [ "gk4zDxN50KY=" ], + "create offer|protocol version 27|create offer|xlm -> idr|crossing + create" : [ "Z1GdApZ7O54=", "Z1GdApZ7O54=" ], + "create offer|protocol version 27|create offer|xlm -> idr|crossing + create|large amount (oversell) - cross & create" : + [ + "fv4EOrltvdA=", + "6E1zKJkbmSQ=", + "k8PeEI+Pyvw=", + "JV9pSVVZJJ8=", + "3AWx823Lp9Q=" + ], + "create offer|protocol version 27|create offer|xlm -> idr|crossing + create|small offer amount - cross only" : [ "lF0rRjrHFlI=", "C5nBWSjJ9QE=", "EmWNbn5lEu4=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "jRfOa7m5iPs=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "r+Cv3xzYMDU=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "UHVbnFPuy88=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "iP4KiGqtWWU=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully with residual" : [ "42FFzoOm6fs=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "7ONsL4LySpA=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "Ugfb3cSWIUg=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "90U/ROPvm2I=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "HpvWqBukll8=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "m8WZ0qdABtM=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "pHDYQnaUdPI=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully with residual" : [ "yHiM7kyry5c=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "Wl/kD7VxDZQ=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "NPQJl8yV6FE=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "qYrIoIy9H7c=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "gSo5OF/MTBw=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "POQUvO8jDWQ=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "WOvMTYfr4zE=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully with residual" : [ "OVQl5PuxS/Q=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "gnwRyXBeYxg=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "eIAtrSrd0is=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account sponsor|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully" : [ "nEpiZEzVDkU=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer fully and one partially" : [ "Y68ok/1bHuY=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross one offer partially" : [ "0lNCcbuo9Ac=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully" : [ "9UjKoKEbrJw=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross three offers fully with residual" : [ "52We9rg0D8o=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully" : [ "Ce/NJdEX0bY=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|native for non-native|cross two offers fully and one partially" : [ "nTsKYNYP0k0=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully" : [ "x7+Dz2H1sjU=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer fully and one partially" : [ "aAKVQMq/0x0=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross one offer partially" : [ "6JS6q3g4L14=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully" : [ "RaLLn7ogxig=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross three offers fully with residual" : [ "xksxhOn59sI=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully" : [ "9DAc36GPvgc=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for native|cross two offers fully and one partially" : [ "zkBdftSeCBI=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully" : [ "p1TJC5DYNfc=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer fully and one partially" : [ "51pGHcGDAZ0=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross one offer partially" : [ "BIVC4vs4lnY=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully" : [ "r0UBMJbii8I=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross three offers fully with residual" : [ "WFx47hmdH/k=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully" : [ "kZTyA9BHraM=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|non-native for non-native|cross two offers fully and one partially" : [ "YQPNw0qANvI=" ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|sponsored, native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "G5Ku4X1uyvk=", + "iZz2+LJX2yc=", + "L8oWrz8q0Bs=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|sponsored, non-native for native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "o9yhQ81YoRw=", + "Vl3rvyG97p4=", + "Qsa6crcEvk8=" + ], + "create offer|protocol version 27|crossed sponsored offers|offer sponsor is source account|sponsored, non-native for non-native" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=", + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "+BZAhNOyJKY=", + "qsTaJ6IEHSA=", + "QZe5IkGsxbk=", + "JUzjDDmscKQ=", + "AwU/QQa19IM=", + "sRLFaxvUXG4=", + "Q8ncxtQq9zc=", + "Nv0xgxcnwNc=", + "lqTVaIbYI30=", + "rLKiJLkIgKs=", + "Oh/Ne7uQ5eI=", + "k4ceera8eqA=", + "95+fNRpbLGk=" + ], + "create offer|protocol version 27|crossing offers with rounding" : + [ + "rZWQi2rdOhw=", + "1zoEpg+I/vI=", + "Z2qEW4jm/0c=", + "HCrZ/W1EZK0=", + "RPSb1pgwf1w=", + "rZWQi2rdOhw=", + "1zoEpg+I/vI=", + "Z2qEW4jm/0c=", + "HCrZ/W1EZK0=", + "RPSb1pgwf1w=" + ], + "create offer|protocol version 27|crossing offers with rounding|ask before bid uses ask price" : [ "8U+42RXP+uw=", "vmJ6mQLQ10Q=" ], + "create offer|protocol version 27|crossing offers with rounding|bid before ask uses bid price" : [ "lF/pfIuAXps=", "YWM9maRQpjk=" ], + "create offer|protocol version 27|issuer offers|issuer offers contribute buying liabilities to other assets" : [ "3GvVv4IuXeg=", "8mg1a6qFdcs=", "BOnCUDANbzY=", "jSKbIBqTGJ0=" ], + "create offer|protocol version 27|issuer offers|issuer offers contribute selling liabilities to other assets" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "ldTJh9v0SfY=", + "vAM1L00uv7M=", + "iw7Ek6Ip5KU=" + ], + "create offer|protocol version 27|issuer offers|issuer offers do not overflow buying liabilities" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "ldTJh9v0SfY=", + "/uorqYeEyII=", + "H2uTj+cYFFM=" + ], + "create offer|protocol version 27|issuer offers|issuer offers do not overflow selling liabilities" : [ "3GvVv4IuXeg=", "8mg1a6qFdcs=", "iFtZk/E8xxw=", "CFzWWmhWFNI=" ], + "create offer|protocol version 27|large offer id|erase" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "waW0tEoMvso=", + "PU2PBOTsLZs=", + "zsVxyD+zl/E=", + "k7HrycW3erw=" + ], + "create offer|protocol version 27|large offer id|modify" : + [ + "3GvVv4IuXeg=", + "8mg1a6qFdcs=", + "waW0tEoMvso=", + "PU2PBOTsLZs=", + "zsVxyD+zl/E=", + "k7HrycW3erw=" + ], + "create offer|protocol version 27|max liabilities|buying non-native" : + [ + "I+8qq0t8CQk=", + "CC9+ZKviQJs=", + "iPDVE/wNf74=", + "s7ppZHmtInU=", + "sFCOo/eL+HU=", + "bDyfyQeaZYM=", + "CLugErteCIY=" + ], + "create offer|protocol version 27|max liabilities|selling non-native" : + [ + "I+8qq0t8CQk=", + "CC9+ZKviQJs=", + "iPDVE/wNf74=", + "s7ppZHmtInU=", + "sFCOo/eL+HU=", + "tMvUEgNke28=", + "/33LwYX6t2w=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|buying native change both assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "UJfxwbH5Aeo=", + "tpPOF4y1XtY=", + "N8NBMgL+IYc=", + "XQOwhl+NqEM=", + "O3c9GDizLuk=", + "9cQy+4hWbWk=", + "mLI101sHiQI=", + "yTrJsuJsT0Y=", + "Vsym25toRuo=", + "Ef+FPPoUg40=", + "1rwwNMgOy5E=", + "YHQ8+8qRl8g=", + "fYRm1E+ApJw=", + "8290h5gxeh4=", + "Z3y5m1zhn9k=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|buying native change buying asset" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "7AhVLkjP25E=", + "86Ma/qSRnAo=", + "uzmBRd+8zs8=", + "UoETjUIpZVk=", + "m0Z7cwww/14=", + "JN8oTg7AKOo=", + "5IACqtmzOC4=", + "2qjDKnJ7LdQ=", + "Z9Qd+JxOd+o=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|buying native change selling asset" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "vPaJ49UMLOU=", + "UJfxwbH5Aeo=", + "tpPOF4y1XtY=", + "N8NBMgL+IYc=", + "pAH2DJjeLsY=", + "GtcxVR+LY8c=", + "HMzW8LUbkzY=", + "A3a7UJmW52U=", + "Xz4VVlu/rfs=", + "J1i6THnDlUU=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|buying native swap assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "v4tSfH1gpFM=", + "TgJJ64EZdSo=", + "OHtgSNB6KTY=", + "nsLFT1O2F3g=", + "oS+dntdckzw=", + "uBLxbVAZjhk=", + "8uaM4h4eZNQ=", + "g861flXOOow=", + "PkPq0tArJM4=", + "UGrBOMAI3/w=", + "ClwRtFG3h2c=", + "bu7DAYVGGgY=", + "jMCWLSEcySY=", + "LS+bJjgZ2C0=", + "pYdau/ZYH2w=", + "lfd+o7CTWU8=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native change both assets non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "XYpVK7Cd/Dc=", + "hIXPaBAqTU0=", + "WMTgA+WXUU8=", + "cuzb1MIMb3Q=", + "AA7m/Dv0Km0=", + "OtOyIvc0axY=", + "ydVIMF5Ip6U=", + "6DGnLQal1w4=", + "rdHxahR/qro=", + "EG+eOiF9pIE=", + "/86HXwHTjzs=", + "tMT9bnfGVWY=", + "2Y7lvrNa1ic=", + "4+pNZQASUdg=", + "iu22Ib5UH4M=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native change buying asset native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "oXyBhx1c88E=", + "6pOug+ACCb0=", + "voBB9TcvUKY=", + "pbAEPovvO80=", + "8xJ/dEVK/Kg=", + "A2JUrvylrHY=", + "R57z1wNkHAk=", + "Z2YWh0uWRNU=", + "mE/NwUNIO+s=", + "/fv40CwR0Ks=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native change buying asset non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "5gaGVVwg6PU=", + "YdtLYmYOAEM=", + "Z6iMF3+XE3E=", + "2HL8xhUpLpM=", + "1CvUjnhoyCc=", + "ialsfffok54=", + "jpEQ3xGuLkw=", + "BEJacrFDIHU=", + "66apAsurOgI=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native change selling asset native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "xjgR8rRWfrU=", + "7Iu6MmRep4k=", + "HxldriCBgiU=", + "6qPsK99hJoU=", + "0/KaC1fsUeU=", + "owdx9qUyXjg=", + "PYWImtknRFg=", + "MatRcYAk/wk=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native change selling asset non-native" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "86Ma/qSRnAo=", + "XYpVK7Cd/Dc=", + "hIXPaBAqTU0=", + "WMTgA+WXUU8=", + "tSkHug76cU4=", + "y/LafS8TT00=", + "E3tz7nSj4+I=", + "XMhA4e9auWg=", + "TSYoMznvj3A=", + "oEPL4aGrRcs=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|non-native swap assets" : + [ + "xAYxchneXOw=", + "iUkAHAFiRnc=", + "xSalzsN2PlY=", + "I8lS9FADNgI=", + "vPaJ49UMLOU=", + "b5wW+5dtYhk=", + "N79WNJNwWw0=", + "tMo9sDTj7LU=", + "cv06DGr91gE=", + "P+ZF9tiJbV0=", + "fA/xuIX4/S8=", + "GN52TROdg0E=", + "ErozaquR4uw=", + "epHXiw1JJR4=", + "JdrlRfdLjCg=", + "korvat428oI=", + "iszsCKyuNYE=", + "i7d7LbPn2wI=", + "5tZS+Vcc0ZA=", + "J8u/vRwlol4=", + "VZ4mgMu8P5k=", + "Rw9+1rpwc5g=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|selling native change both assets" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "MrsOAdZzYMw=", + "k+26FoNNUjQ=", + "CQPCPYR2adw=", + "J+ydHBB/X0U=", + "0j7SdD4wsgw=", + "9h3hLFfHqcE=", + "pMsHOWmTuFE=", + "uMrUGNV+nXg=", + "WAJTck9a6Jg=", + "EK3RDtfEobw=", + "q77j2qzf5uQ=", + "NM29mTs6zKE=", + "CGVDObDz4YI=", + "7BGrB6J8WtY=", + "jgBRHzYQBnY=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|selling native change buying asset" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "Q/D5GuNXYB0=", + "+o4UKxB8TwM=", + "Yuv4WEWRHf8=", + "3bQSLJCFnD0=", + "c3cHMS+ISnQ=", + "frVG1MU2keo=", + "06ifK6Eks8A=", + "SaIlMiDK500=", + "XXXiFbXKs6c=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|selling native change selling asset" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j7DnHpLPEqQ=", + "MrsOAdZzYMw=", + "k+26FoNNUjQ=", + "CQPCPYR2adw=", + "OSjwSBl2PTw=", + "MGZL4WLtcek=", + "MY+a/M+wvW0=", + "XHKbRS0qRhE=", + "Ktuxj3ocd7U=", + "DjFy/x/1ciA=" + ], + "create offer|protocol version 27|modify offer assets with liabilities|selling native swap assets" : + [ + "xAYxchneXOw=", + "Fl9d1va2jJE=", + "nMgzlV/QSJQ=", + "M9554H+DPjU=", + "j+YPwQ+XaCM=", + "5b2ELKn+zps=", + "FNGYv/8RF18=", + "1L9YwyQoBws=", + "BslEPIPs5YU=", + "eVmJlwJSAho=", + "LHlQsIca8zo=", + "3zehzGnWFgY=", + "7+GV/BAHLGk=", + "4np7A+28tEw=", + "ISi07jZ/+wA=", + "R4w1cjwU2hQ=", + "VXgD6H1jz58=", + "6sM5mAhu1PM=", + "Q4HKoqEBK5U=", + "ZvM9XVrUeI8=", + "hla5hnHmE4w=" + ], + "create offer|protocol version 27|modify offer in sponsorship sandwich" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "DGjkFkZPtxo=" + ], + "create offer|protocol version 27|modify offer price with liabilities|buying native" : + [ + "t9wslB3jy3g=", + "4l17/q9lY1Q=", + "eSG2OghANjk=", + "1Mil8nzAFjw=", + "2fex/gJhIes=", + "nUquFdNas3Q=", + "t9wslB3jy3g=", + "4l17/q9lY1Q=", + "eSG2OghANjk=", + "1Mil8nzAFjw=", + "2fex/gJhIes=", + "nUquFdNas3Q=" + ], + "create offer|protocol version 27|modify offer price with liabilities|buying native|decrease price" : [ "7yYpsMrW4H0=", "1qx5bJBpuqI=", "7WnR359mcT8=" ], + "create offer|protocol version 27|modify offer price with liabilities|buying native|increase price" : + [ + "SmOJNZrNb14=", + "MANB7B0xoq8=", + "UyVGf+o0AqQ=", + "3UIALvgjYl8=", + "6MQb5zIgENo=", + "FVsULnESFn4=" + ], + "create offer|protocol version 27|modify offer price with liabilities|non-native" : + [ + "3GvVv4IuXeg=", + "58I3yfK8Gcs=", + "jy5ewRh7RfE=", + "1Mil8nzAFjw=", + "w7GUUyCARrM=", + "3GvVv4IuXeg=", + "58I3yfK8Gcs=", + "jy5ewRh7RfE=", + "1Mil8nzAFjw=", + "w7GUUyCARrM=" + ], + "create offer|protocol version 27|modify offer price with liabilities|non-native|decrease price" : [ "Kz1cVfRj4eo=" ], + "create offer|protocol version 27|modify offer price with liabilities|non-native|increase price" : [ "g0ZSWd3wkag=", "GzZ5YEWeYug=", "6JNidy0iMP8=", "b8yAbyXoJIM=" ], + "create offer|protocol version 27|modify offer price with liabilities|selling native" : + [ + "I+8qq0t8CQk=", + "K4k15lDDrJI=", + "f0F0TI3uuKM=", + "I+8qq0t8CQk=", + "K4k15lDDrJI=", + "f0F0TI3uuKM=" + ], + "create offer|protocol version 27|modify offer price with liabilities|selling native|decrease price" : [ "EUe2j3saCWg=" ], + "create offer|protocol version 27|modify offer price with liabilities|selling native|increase price" : [ "lTjk+VgqstM=", "L+kdFckap9Q=", "TKT/wJsDmgA=", "jum+FBgAVYw=" ], + "create offer|protocol version 27|negative offerID" : [ "kT6/Ph+MhsY=" ], + "create offer|protocol version 27|new offer is not created if it does not satisfy thresholds" : + [ + "lCrqNKY0rpc=", + "+1fqnir1hrc=", + "7UOAnFvzwao=", + "Jg4y9W5Xeps=", + "xGitDe7rjZQ=" + ], + "create offer|protocol version 27|offer with excess liabilities that does not meet thresholds|create fails" : + [ + "3GvVv4IuXeg=", + "l8GBi+52NHQ=", + "vDd8Rk82EsQ=", + "Fui0ppcpiUE=", + "rzyR3LFuv+U=" + ], + "create offer|protocol version 27|offer with excess liabilities that does not meet thresholds|modify fails" : + [ + "3GvVv4IuXeg=", + "041Ik7bCMNc=", + "QmBY3u7TM/0=", + "mavDS9aTsSA=", + "4cssGG2DQSg=", + "ldFfajLtJQU=" + ], + "create offer|protocol version 27|partially fill resting offer where owner is in a sponsorship sandwich" : + [ + "8RIGon3TLU0=", + "xXxH6xglXtA=", + "UmWucKl7miM=", + "r8y7aUk6QrI=", + "n1WkkJv+Gy4=", + "RncbdFLXKLA=", + "XWYHpd7R7HU=", + "HL8o+FCVfKI=", + "ODPwbRlQ/HI=", + "F+8bnYHh/8Y=", + "x13UziPsQIs=" + ], + "create offer|protocol version 27|passive offer" : + [ + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=", + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=", + "TduHde2iHmg=", + "s3XRBE7WjAc=", + "+UJAlWUI1MQ=", + "L9moIHexGI0=", + "ZHEJc85zN2w=", + "PsBAEgvtGkA=", + "1Pmhle6bl7E=", + "nPaZcZjPXYs=", + "z7QezCIUEqg=", + "rFpcuJOatYI=" + ], + "create offer|protocol version 27|passive offer|create a passive offer with a better price" : [ "vC/bHIEHA/I=" ], + "create offer|protocol version 27|passive offer|modify existing passive offer with higher price" : [ "xG6hNkmN6+A=" ], + "create offer|protocol version 27|passive offer|modify existing passive offer with lower price" : [ "q8plCqUIdRQ=" ], + "create offer|protocol version 27|pull sponsored offers when authorization is revoked|sponsor is issuer|allow trust" : + [ + "WpkugzwroZQ=", + "Xge+5pLaTYA=", + "4wmzhcPFeb8=", + "prBSA0tfqOk=", + "jzk8Uk94IF4=", + "NuR0j7eX2eE=", + "forTcGol0rQ=", + "mEo7fK0TRuo=", + "PnKS1C85mJw=" + ], + "create offer|protocol version 27|pull sponsored offers when authorization is revoked|sponsor is issuer|set trustline flags" : + [ + "WpkugzwroZQ=", + "Xge+5pLaTYA=", + "4wmzhcPFeb8=", + "prBSA0tfqOk=", + "jzk8Uk94IF4=", + "NuR0j7eX2eE=", + "forTcGol0rQ=", + "mEo7fK0TRuo=", + "PnKS1C85mJw=" + ], + "create offer|protocol version 27|pull sponsored offers when authorization is revoked|sponsor is not issuer" : [ "9wKZ0cUHqRQ=", "9wKZ0cUHqRQ=" ], + "create offer|protocol version 27|pull sponsored offers when authorization is revoked|sponsor is not issuer|allow trust" : + [ + "ub7/2Gn9rd8=", + "ihWbJRp3ryg=", + "XzTnWVv8mh8=", + "L9AHoWjoo0k=", + "A0v1tWjRwFY=", + "L0Diqa4i41c=", + "fEhXL/cAXX8=", + "9yZIZSpYTs0=", + "qRduamYzL9Q=" + ], + "create offer|protocol version 27|pull sponsored offers when authorization is revoked|sponsor is not issuer|set trustline flags" : + [ + "ub7/2Gn9rd8=", + "ihWbJRp3ryg=", + "XzTnWVv8mh8=", + "L9AHoWjoo0k=", + "A0v1tWjRwFY=", + "L0Diqa4i41c=", + "fEhXL/cAXX8=", + "9yZIZSpYTs0=", + "qRduamYzL9Q=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when creating an offer|buying native" : + [ + "xAvD0TZipvc=", + "f8kthORN37Y=", + "+S8QzEufkxI=", + "3KTGL7fDeU0=", + "2fex/gJhIes=", + "l8dTP9BrMYw=", + "mmLCfoBwzIQ=", + "7eYq36QVpJs=", + "8SLLuc218U4=", + "tD9RFiHlKnE=", + "Yjkd08oyFXo=", + "b9fugvKNmDw=", + "V6WnoGLfBWk=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when creating an offer|non-native" : + [ + "+Be0HDePjzQ=", + "3qE0cu2HoDE=", + "mjGLCwCKess=", + "k5jw6yM5hyg=", + "MBhxnDMK1GM=", + "gyON4ibQKUc=", + "/1kAM897eaU=", + "R3V5nFVf+VY=", + "OPogFL3AN5Y=", + "Jzbfm5w2elQ=", + "9EwM3KBrW2o=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when creating an offer|selling native" : + [ + "WicRwdM+fXM=", + "wbtiXZ17QgE=", + "r2HXW2exUfw=", + "ySinAHCOgBE=", + "VGzJovS7UIU=", + "/0ErblHrwc4=", + "MSDjMYok3AY=", + "jf7R6ATX45Y=", + "rQ2RjOzminU=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when modifying an offer|buying native" : + [ + "zEOe5WV2dEA=", + "qGiGvpKqVmo=", + "41XdmxjQVBM=", + "3KTGL7fDeU0=", + "2fex/gJhIes=", + "PK9wxLQkOYo=", + "UfYLCU/bctA=", + "gM18T0FBYAQ=", + "/TewJTWcWpM=", + "J6qtOIkUIbI=", + "WguGEzxoyL4=", + "QvB9fprkWqg=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when modifying an offer|non-native" : + [ + "xAvD0TZipvc=", + "ivRarEKAAJE=", + "ORCFmvDyO+k=", + "k5jw6yM5hyg=", + "dcKJ0xDLE84=", + "ngdeBwdqJR8=", + "xIKNsatkliU=", + "HCOedWosRTs=", + "prXubuIxG28=", + "eZ6e5DKllX4=" + ], + "create offer|protocol version 27|reserve and liabilities checks|when modifying an offer|selling native" : + [ + "bhXmI6BHKtI=", + "MynsoDPQwQA=", + "S4Gypz8b934=", + "zw30qMRllco=", + "WgCQRdwPIUw=", + "lQCQhCAzez8=", + "KWgxfApRXJI=", + "NF12aVlcelY=" + ], + "create offer|protocol version 27|sponsorship" : + [ + "+hujFcq0xXU=", + "SC2FCLsSAng=", + "j3qtdofcO3g=", + "XDE5A0UmY5o=", + "s8X4ficQr3M=", + "+PaEZ+b9wkQ=", + "+hujFcq0xXU=", + "SC2FCLsSAng=", + "j3qtdofcO3g=", + "XDE5A0UmY5o=", + "s8X4ficQr3M=", + "+PaEZ+b9wkQ=" + ], + "create offer|protocol version 27|sponsorship|create, modify, and remove sponsored entry" : [ "MZgdaTE6q6E=" ], + "create offer|protocol version 27|too many sponsoring" : + [ + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=", + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=", + "+iq//LYb58Y=", + "t10gSe7iW4s=", + "qXbN5oLV0kE=" + ], + "create offer|protocol version 27|update offer" : + [ + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=", + "1pEXuoKojtQ=", + "WS2E5L2hdg8=", + "D4NyuAZwy/w=", + "Qm8Qsw7Kw7A=", + "HJ7pQ5qzP3k=" + ], + "create offer|protocol version 27|update offer|cancel offer" : [ "G7WyWa+4bx4=" ], + "create offer|protocol version 27|update offer|cancel offer with full buying trust line" : [ "FJEN+AfX60Y=", "asJi7UUxL30=", "tjnenxAikiU=" ], + "create offer|protocol version 27|update offer|delete non existent offer" : [ "UhbEV/tmcfQ=" ], + "create offer|protocol version 27|update offer|update amount" : [ "9Cu8GqanY6o=" ], + "create offer|protocol version 27|update offer|update non existent offer" : [ "UhbEV/tmcfQ=" ], + "create offer|protocol version 27|update offer|update price" : [ "WKqpWkqTI08=" ], + "create offer|protocol version 27|update offer|update selling/buying assets" : [ "ksz63AtplDw=", "UAkrvdrUUXE=" ], + "create offer|protocol version 27|updated offers respect reserve" : [ "iHeo277KA20=", "noNuzWVx7Kg=", "3MkaVSq8Gyk=", "67XE/LMBAXA=" ], + "create offer|protocol version 27|wheat stays or sheep stays" : + [ + "lCrqNKY0rpc=", + "jGjvznRvg6Q=", + "cUGfAAQ4upg=", + "cJvwxXqdous=", + "S6WrbjPLxfA=", + "M3ckMEt8H80=", + "amCYkb+7TR0=", + "uHdpXiLIXjI=", + "Knz78W5onZ8=", + "cu+hKpUAEKI=", + "n0yqovl5Nbs=", + "Chp/u1D619E=", + "sJ5ErHXvwIU=", + "AAOUu5xsjZI=", + "oE7fDgmAs6I=", + "RIHYkyU5AWs=", + "HcARNkT8PKo=", + "6DkbObnvEwM=", + "jfMqqSZrgDA=", + "0UokfQrwgLs=", + "jYtcxs7ONcM=", + "V2kXhxFexU4=", + "ZQJcY57VZWE=", + "nwuIX+iobU8=", + "0AQ2ZG0HvsQ=", + "D5QW474YsLw=", + "lrRkyQ1tgGA=", + "tezcxh1+SwU=", + "j3HXXb+kGyM=", + "8Me7PQhnmrE=", + "3DwikgIjuKo=", + "EHbT8imQhKQ=", + "NnVn87IoKHk=", + "+TI53G34BFk=", + "bfZz+inh33o=", + "EUtnBInQuHE=", + "SQvl0sSLm5M=", + "oakzj167XII=", + "XM7TfruhcA0=", + "3tbHJ3KNVXY=", + "0FEWdXaeWM8=", + "X2hS8B1eJq8=", + "wLj3TgLXarQ=", + "u98nT0ipqtY=", + "hiJ2B0okUrQ=", + "g/DPny6DRMs=" + ], "create offer|protocol version 2|cannot create unauthorized offer|allow trust" : [ "o9zmojucnjo=", @@ -83228,6 +87717,307 @@ "89WDwf97Dg4=", "3A5HTsAPOCY=" ], + "liabilities match created offer|protocol version 27" : [ "9r4mSEOjc5E=", "9r4mSEOjc5E=" ], + "liabilities match created offer|protocol version 27|maximum limits" : + [ + "VhPlKytne9U=", + "CwG7Gy8dyJA=", + "sYTvan8wXb4=", + "1SlsdMmX1w8=", + "M3B729CZSq8=", + "eC7bVofY1Ug=", + "CG5zG+F079I=", + "9RGRoiIlCKM=", + "UY+Br3Z1r+M=", + "xNbUWZAEOFw=", + "C0JDOVaEG6w=", + "awV7Ur/GL0k=", + "ZP+U7NQPSd0=", + "Q+YMjHhFIlU=", + "72IasQWWoHs=", + "QDndUuEdUiM=", + "lUoSeVORUSk=", + "OzNnfUBJwfk=", + "2QZX/oKbYl4=", + "WSBtntmXHNE=", + "Ij2y01jv16k=", + "x3JioHxwEHM=", + "vedY93kod64=", + "IOWHd63QmHo=", + "UhoRiAln8fc=", + "5oQC6tG55dw=", + "oVtrNHZFwLo=", + "fFO4AO6SSog=", + "8543gc0jR9Q=", + "eThs8Gbz+h4=", + "zUPXrL4Peeo=", + "5ZtFz7izCrQ=", + "STs09V2gWX0=", + "qfU42o/plq0=", + "DHv8YVi92Rc=", + "sTBAsMs4Wdk=", + "dCRxJ1HOqtQ=", + "S1SHFY63jcs=", + "Ilw+1Q7mY1Y=", + "D/AumoITyFg=", + "u9ZZThnfEdA=", + "zJN678HIWfk=", + "sShpIebUq8U=", + "R7GGf7rjugw=", + "ChicB1KWvZo=", + "eEzWAjqj0KE=", + "i8RddxC3dVw=", + "jit7OkQmWuo=", + "iDd9XRq7Eo0=", + "se0TtNy6PJw=", + "eiRrvGp7aK8=", + "i0y3PEJqkYQ=", + "d+f9xv3YaWs=", + "d/7CPl0b3pc=", + "5J7Ss7ZNASM=", + "LKLwW9zfQXs=", + "PFbZIF+bja4=", + "MWyQvS5yDok=", + "RwetNPBIKco=", + "6loloKbV1uM=", + "XHgc8vDslvk=", + "dhegrpbbNio=", + "NPYu/S8S2MQ=", + "AfOWWuTTYr8=", + "4w2T8J6olvs=", + "/+DePEqwF60=", + "BcxdfS1d2JQ=", + "jTX4BYs3xR0=", + "WypMpc8u0MU=", + "C5d3OQx9g+s=", + "wdAMDFgPqPU=", + "821lXfgaZjw=", + "o9KFQ8ZF4hY=", + "MgEIqEVkgFM=", + "n6OyvC3V7qg=", + "BgR5VbNX7OI=", + "hwQMCHwJOg4=", + "LGk8C/CZvWo=", + "4ZccHBp0aDw=", + "6QSdjDXOI/o=", + "s4il/UgMFBE=", + "g/0L/MWojiE=", + "/ly1WWwna44=", + "vQ2i3qRMMto=", + "T+obZrZz1kk=", + "r9kZ2gL/Uhw=", + "GJLbxcwAkZ8=", + "OmKARCfs9h4=", + "Q0RWDEuJWLc=", + "sMGTCRN7q0Q=", + "4NThx1tJojg=", + "3pGURkOM578=", + "YQ+kWi8Qdls=", + "K9ASCiqCmao=", + "bQ6pwwAQCl8=", + "GZhgN6s2r+E=", + "9jzmJV9V6CQ=", + "BMHDBuqnag0=", + "fkYBAcHxvp4=", + "tMU8XstWUfw=", + "4/hjrkieQLA=", + "eSG9XYmlrEo=", + "LKhRoTUg7HE=", + "UJUijp/10rw=", + "OzHxlz7MV0U=", + "RP+jE2WJRsU=", + "3ODXgqkcrf0=", + "5f53cvKJ8zI=", + "pnbLIKocalI=", + "4cAjPcEeBvg=", + "myxDz+JUlKw=", + "eMRzhtod4Nk=", + "qPup6hh/RcA=", + "99iYAHbil0s=", + "s//D3u/QF4Y=", + "ywpGBZxAwuA=", + "6Mo0d2hg5bI=", + "xBKSYQDLzcc=", + "FD9jaOXjI28=", + "k9E3o8kTuIY=", + "9Ul0sASqmBQ=", + "py6LeRwwb1Q=", + "DVIA0gG5cGU=", + "uMrEASH9LgE=", + "20KlKRAY3Ms=", + "FPSOw5L4RqE=", + "xCheTlSzzDM=", + "dL96iZveoiA=", + "MC/OZ3WDlZw=", + "2Rq0Mhtl+Oc=", + "muhAGIRBtgc=", + "BD+Zza1Cbjk=", + "w2pRD9YgUas=", + "lAK1raxilrc=", + "ZrPbkwhcmgo=", + "tofFdubNJZ8=", + "Hxdl/iW4jqA=", + "XpJFQBUtkeM=", + "3Thi15AuFpU=", + "TX1CZGdAdps=", + "KfxL74AI6Mw=", + "Z1s9Age6m0w=", + "TrVa0Otmw3c=", + "cm4Kk0u6j/w=", + "QPPSSSkmYis=", + "axu0dXwE0+o=", + "7yN9GxLoEb4=", + "8Hf0Y1SCtrM=", + "THaKFbcTPRk=", + "kwByhMBuvZ0=", + "h3nV+wNCapM=", + "pwkVTDG3eQg=", + "9xoy0w4C198=", + "urQ1oMUszwU=", + "tFbfOgFcWYs=", + "fuWqT1QvnQs=", + "Rrpz0YpZx0o=", + "kxHPGuPjAzA=", + "MjHoAMCZXos=", + "P1SFl4otHIY=" + ], + "liabilities match created offer|protocol version 27|minimum limits" : + [ + "VhPlKytne9U=", + "CwG7Gy8dyJA=", + "kkdWa5bsNMc=", + "hPZyNBUfkS4=", + "wSt3McAJjg4=", + "eC7bVofY1Ug=", + "CG5zG+F079I=", + "9RGRoiIlCKM=", + "UY+Br3Z1r+M=", + "V/6xuXKxcuo=", + "C0JDOVaEG6w=", + "+EGZekCCFfc=", + "FktI8+6fhdM=", + "d3yB9/gEWWQ=", + "rJAVVOg1lSc=", + "IUxKf3Pb4+I=", + "Vd5b6nDr6fQ=", + "Ct1h6kQMl0s=", + "eaiRlSAN0kI=", + "8PS7IpbnJ/U=", + "ccgj9uFKTxA=", + "U4EEd6zG1mo=", + "r9pcbK4qY/E=", + "B+sHmpjNGBk=", + "gn0DsVVgbao=", + "vgsHcZwkq5k=", + "hIc+oIe9dto=", + "KB2p2Mb5nSw=", + "7e19JIBJzcI=", + "+eBXaSD3710=", + "RnFpIH5lZi8=", + "DhXLC1f7FpU=", + "Lot5YL1rCME=", + "aSAXhKUbefs=", + "NLjhpZJ0CXA=", + "4i9AMkHay5s=", + "L/1684/Qnoc=", + "g9IbNxJZgiw=", + "aXxFeSygzK8=", + "88EPjuUdtxA=", + "GkIkCW+wVaA=", + "OUpWpBbSNEw=", + "DjDat+xjC5Y=", + "5wkEWgXyXoM=", + "Y+RWniKI4WM=", + "C7roX5lE3kU=", + "t9A1mAs5duQ=", + "2VALztyfJh4=", + "qZwg5UW8Yoo=", + "iUz9bYRtSD4=", + "0JvG6hkxGKY=", + "0KwdOGNdPsA=", + "M9NBQ5V2Jr8=", + "dFsDrUfepjI=", + "Ubsko4pzeKE=", + "X5GW5pApFPo=", + "UOqryy2ZhXY=", + "tOBXC2WCkGc=", + "KV2BvfmEYNo=", + "a68whrfDfNI=", + "Xf6X7RDkroM=", + "6erVQ8h1b/s=", + "OlL+qBqlQEw=", + "YfEra1PEBzU=", + "42VL8dQOQHA=", + "NKPtP6EHz1A=", + "oEts3Z4Pm10=", + "DsZPcrfvCts=", + "pfJp5gliSe4=", + "SHOBX1zXIco=", + "DFrpIAEpup8=", + "XetAt3Ci+j4=", + "SjMNMU1CuWM=", + "52ihrU5yfbg=", + "Mo64OJIbBBs=", + "SDKJu7eyBOs=", + "MsLrp6HbxP8=", + "/jVB/VUiJ9Y=", + "F8kRsILDWE8=", + "60uJv2pJXwA=", + "vZlxY05mEY8=", + "vewpRbpeZqE=", + "lwMmHyPNjn0=", + "TjUqUgf8n9s=", + "L1IcUQjBUcI=", + "HeLKOf27ywY=", + "xlJRXCnsMTw=", + "qffWSsQLcKY=", + "VfwldV2IPuk=", + "KDrRKw5ldxA=", + "S6PT14hbHpc=", + "Pnhynu45tmY=", + "4uW7blwjizU=", + "jy2dhFkIz5A=", + "a6ePFe9lCRY=", + "Kocd+8SaOFU=", + "3j6ohWk/9fE=", + "Nn6TiZWG7bg=", + "8CEIh2QlKMQ=", + "9bHTywoLTfY=", + "LnLPzhBQ+lA=", + "uYLyB7bPdrA=", + "qn62opwXDIY=", + "ppnDZkrq6to=", + "IxVop1JghDE=", + "ykdRVTYbIiM=", + "Pne7y5GvQHQ=", + "lVVbnKX9fwE=", + "ahn14eElYU4=", + "mWOjs2QpozA=", + "AZ5TR3Jo7Dk=", + "hJxSGs7dJyk=", + "sQC24mfQKeA=", + "FCg87nN/6UU=", + "MaYNMG+O8f8=", + "z4ch1UufI/U=", + "LFLJc0WXvgY=", + "N29fEePOtFI=", + "svR41U/S0/k=", + "/Tya0KwZyeE=", + "5sDeRMZfGn4=", + "LkcRDumo9Dw=", + "DRtF4VKL894=", + "OwAaYLyJ95Q=", + "MlXA/ZxoXWw=", + "WkdCxoSymJE=", + "/mw42vBi50w=", + "X3ldQvXMhxI=", + "iEA5p+uAEo4=", + "JNLhBkj3AGg=", + "O6g4p8BEQ3o=", + "+MpczFL4wcU=", + "89WDwf97Dg4=", + "3A5HTsAPOCY=" + ], "liabilities match created offer|protocol version 3" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], "liabilities match created offer|protocol version 4" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], "liabilities match created offer|protocol version 5" : [ "b5C50yVNh3U=", "b5C50yVNh3U=" ], diff --git a/test-tx-meta-baseline-next/PathPaymentStrictSendTests.json b/test-tx-meta-baseline-next/PathPaymentStrictSendTests.json index b359cd9b82..87bd6086ac 100644 --- a/test-tx-meta-baseline-next/PathPaymentStrictSendTests.json +++ b/test-tx-meta-baseline-next/PathPaymentStrictSendTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "pathpayment strict send uses all offers in a loop|protocol version 0" : [ @@ -1321,6 +1322,89 @@ "fwqbRGxHKf8=", "AOnjm6LdgWQ=" ], + "pathpayment strict send uses all offers in a loop|protocol version 27" : + [ + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 27|inside issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "xCfA3gN5lDs=", + "AOnjm6LdgWQ=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 27|no issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "QwWP3woUGO0=" + ], + "pathpayment strict send uses all offers in a loop|protocol version 27|outside issuers missing" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "kNZAoVZi79s=", + "llZku888G9U=", + "dN0B7uenGBk=", + "z1pE5RvpmX4=", + "+ZLllvPkQ+w=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "SpH0IrYdwRE=", + "2u1abf1Mg6E=", + "KX7GRLxmNMk=", + "4d+1oWEV6uw=", + "5/WHHBkl31A=", + "KI0kcURzsnk=", + "5wd5kyQ7Sjk=", + "vJkDjNTLl/g=", + "qW/S+biWtqE=", + "fwqbRGxHKf8=", + "AOnjm6LdgWQ=" + ], "pathpayment strict send uses all offers in a loop|protocol version 3" : [ "jorMmKFYJ0c=", @@ -21416,6 +21500,1142 @@ "ie6GldQ1XEs=", "cCG+dBmDtIw=" ], + "pathpayment strict send|protocol version 27" : + [ + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=", + "Obfj3ZmD34M=", + "8VivBczT7XQ=" + ], + "pathpayment strict send|protocol version 27|crosses destination offer for first exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "E612cIHjzxU=", + "RAO4SFKH9jg=", + "Qo0e9YSXFRA=", + "fU33vV2S2BU=", + "AacAIQaK9HI=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "4bdyIU9y16Y=", + "+2/q1Jibp0M=", + "6vhgBkZkSFc=", + "fBqHZFKah9Q=", + "DiehcE4qMos=", + "4H16U5KJG9Y=", + "c22BVl4k4cw=", + "FlNjYlj+i7w=", + "R+kPHfaexCs=", + "eM6EfdRtAxQ=", + "swpi2W7lkjk=" + ], + "pathpayment strict send|protocol version 27|crosses destination offer for last exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "Qo0e9YSXFRA=", + "GV7J00VLEvo=", + "lHlcHbPB5qo=", + "jqPAVWl1StE=", + "nhHP8Sfy3k8=", + "RytwHSzzBVQ=", + "/+7KoVvfZUU=", + "JwONZyXFHr4=", + "7fCCXeYLXhw=", + "xj7eCR2OF44=", + "ri84V5bLwwE=", + "6mm6DAcwMAg=", + "Zno1DANr358=", + "QF9yUfxuR1E=", + "x9LUYP3LgqA=" + ], + "pathpayment strict send|protocol version 27|crosses destination offer for middle exchange" : + [ + "eLnko7bphqc=", + "89ojGbXxTn4=", + "M1qaWHOx3k0=", + "RAO4SFKH9jg=", + "Qo0e9YSXFRA=", + "GV7J00VLEvo=", + "lHlcHbPB5qo=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "CTAH0FhhGa8=", + "KTR+g8pZqdw=", + "6vhgBkZkSFc=", + "fBqHZFKah9Q=", + "rI55F1HLWLI=", + "oUEG3Lt0uoo=", + "c22BVl4k4cw=", + "QzyP0in7dC8=", + "wouV0/qHFcw=", + "eM6EfdRtAxQ=", + "5ZBwXOXuct8=" + ], + "pathpayment strict send|protocol version 27|crosses own offer for first exchange" : + [ + "qmQxLyCpOBc=", + "6xDa6BT1WP8=", + "rUZEEtM0Hps=", + "1H8kxG7KwlM=", + "PW25R1rfCEs=", + "pDPfJxIFBzc=", + "1y41+fz472g=", + "RxQ+H+td5io=", + "o+32QNYuWMI=", + "/auR3DyJamA=", + "RsvlkFCdMfQ=", + "JwONZyXFHr4=", + "mgvn0Uo56pI=", + "Ng/MK0e60B8=", + "KZfPSW3MmyM=", + "IMv9KdI6t5Y=", + "UKa3/jcLNTo=", + "TZgoqjbP/mg=", + "zdv2cP5T1F8=" + ], + "pathpayment strict send|protocol version 27|crosses own offer for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "GJzqcuFrprY=", + "Qfc9DZh5K6k=", + "bJkCU3rOT4Q=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "Q3oUTrsmRfk=", + "SV89dl1JRmw=", + "M74si97PonU=", + "fBqHZFKah9Q=", + "aOKnz8s8bts=", + "HJzJG4gMqBM=", + "fRc9g9ZSd1I=", + "e4HkLKoGsJE=", + "iHqyeo9TLvs=", + "vPnvVFdjuzU=", + "4R+Ytq7eRYk=" + ], + "pathpayment strict send|protocol version 27|crosses own offer for middle exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "RAO4SFKH9jg=", + "GJzqcuFrprY=", + "nZlOiQ+LDW0=", + "HYBRSoWu/bo=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "d8wEGj9jWrg=", + "uZwQhV2v5ZA=", + "M74si97PonU=", + "fBqHZFKah9Q=", + "aOKnz8s8bts=", + "K59JpWTwv8U=", + "4rVKh6osn1o=", + "e4HkLKoGsJE=", + "tXXYBuf/ViI=", + "HpH1buzQvSA=", + "lAHs/LaSaT8=" + ], + "pathpayment strict send|protocol version 27|currency invalid" : + [ + "eLnko7bphqc=", + "Tg2dnTcND/8=", + "UeEUfbgy3DA=", + "FAGaMo6BMVM=", + "DtOPgoW8b0Y=" + ], + "pathpayment strict send|protocol version 27|destination does not exist" : [ "eLnko7bphqc=", "YzED6NxAqic=", "i2SPbWGHktM=", "Ndf9JTDMTJo=" ], + "pathpayment strict send|protocol version 27|destination does not have trustline" : + [ + "eLnko7bphqc=", + "p/qFinNNAu0=", + "RRyNinInfko=", + "TJjfqt7ryuA=", + "QSlMvh4aNkA=", + "PKQzd8AM3+w=" + ], + "pathpayment strict send|protocol version 27|destination is issuer and does not exist for complex paths" : + [ + "eLnko7bphqc=", + "YzED6NxAqic=", + "i2SPbWGHktM=", + "zKSTT8c5Uns=", + "d7qzlts02Go=" + ], + "pathpayment strict send|protocol version 27|destination is issuer and does not exist for simple paths" : + [ + "eLnko7bphqc=", + "YzED6NxAqic=", + "i2SPbWGHktM=", + "zKSTT8c5Uns=", + "4XZbjPN7MZU=" + ], + "pathpayment strict send|protocol version 27|destination is not authorized" : + [ + "eLnko7bphqc=", + "F+9wQXlthNc=", + "RRyNinInfko=", + "TJjfqt7ryuA=", + "i50UmARnzUg=", + "brfAb7Oy1oo=", + "BGsLI7G63f4=", + "EH085gzhZY0=", + "WoAheSPym9g=" + ], + "pathpayment strict send|protocol version 27|destination line full" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "BI9+z12v+Bo=", + "Ng992V09pYo=", + "3cS2XMJrv0A=", + "VVbeS3DLqAQ=", + "UQFJuq1KcUo=" + ], + "pathpayment strict send|protocol version 27|destination line overflow" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "VdwNLuBPT1k=", + "Ng992V09pYo=", + "o7q3qHn4ryw=", + "VVbeS3DLqAQ=", + "UQFJuq1KcUo=" + ], + "pathpayment strict send|protocol version 27|destination minimum constraints" : [ "eLnko7bphqc=", "Tg2dnTcND/8=", "UeEUfbgy3DA=", "FAGaMo6BMVM=" ], + "pathpayment strict send|protocol version 27|does not cross own offer if better is available for first exchange" : + [ + "qmQxLyCpOBc=", + "6xDa6BT1WP8=", + "fSiXqg+O9Wk=", + "2/jZYIPb6c4=", + "8U+IOY/evAM=", + "5VaSgWySpCU=", + "UXvAf9fHNBE=", + "anCL4pNzwuM=", + "j9DOW+Lgkxc=", + "Q3oUTrsmRfk=", + "SV89dl1JRmw=", + "/sMNGHMkZuM=", + "KnY5gKGoj4c=", + "9uKerPLaCto=", + "WMIMEAzVDOE=", + "EE8SYOQTmgs=", + "aChp8DE0/e8=", + "Km3xhfJPlU8=", + "pgX90Gyrhns=", + "jkISldrCf3c=", + "iCGgrC8KPPM=", + "dd903rxWV/U=", + "K7kmfza4PoY=", + "O79HdH5snqY=" + ], + "pathpayment strict send|protocol version 27|does not cross own offer if better is available for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "+g1jt0F5h/I=", + "vCeYYMPmjnQ=", + "W2guZyWd17Q=", + "ZFd5vdC9kc8=", + "45JeMtb9m0o=", + "ieHxkQI4TnU=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "NNS+L87ttKs=", + "Alb3ZSagshE=", + "kH/nzpUYPc4=", + "O/JRri3GxjQ=", + "bBztDsGgH5A=", + "okESQT6i9JE=", + "Iyhz8Mok+ek=", + "7faMiG+eUjg=", + "+y+avhcnp2Q=", + "b6JpImbi4Ho=" + ], + "pathpayment strict send|protocol version 27|does not cross own offer if better is available for middle exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "+g1jt0F5h/I=", + "2cLeFcWlfwM=", + "bR5uoR59ZFo=", + "ZFd5vdC9kc8=", + "45JeMtb9m0o=", + "ieHxkQI4TnU=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "NNS+L87ttKs=", + "Alb3ZSagshE=", + "5STeAp2Ci/E=", + "SVvUPdN+98w=", + "bBztDsGgH5A=", + "okESQT6i9JE=", + "QsPBAUtjoEk=", + "UmiR7Lt8D/8=", + "w+wcVmI1duA=", + "tsJknRH/wUw=" + ], + "pathpayment strict send|protocol version 27|issuer missing" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=", + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=", + "eLnko7bphqc=", + "v8lZeIsToOA=", + "RRyNinInfko=", + "uHUSG517pL4=", + "cYavsBus95o=" + ], + "pathpayment strict send|protocol version 27|issuer missing|path payment last issuer missing" : [ "+e+59OOXpzo=", "tmSLmoNz1mw=" ], + "pathpayment strict send|protocol version 27|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment strict send|protocol version 27|issuer missing|path payment send issuer missing" : [ "N7nC2GbBfNg=", "tmSLmoNz1mw=" ], + "pathpayment strict send|protocol version 27|liabilities|cannot pay balance below selling liabilities" : + [ + "0Q71IdJSh6E=", + "chd7Nk1rvrs=", + "fSiXqg+O9Wk=", + "+lh4blqYbCo=", + "d21D8W/rFr4=", + "lZYWcEFy2II=", + "jLeh4MO0nzA=", + "+CQCZckrtCc=", + "es8Bx0Wzoys=", + "I1LS8giv3Kc=", + "LEipdkXRPBU=", + "9BleSWWLEbs=", + "YSuv9O/sjso=" + ], + "pathpayment strict send|protocol version 27|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + [ + "0Q71IdJSh6E=", + "chd7Nk1rvrs=", + "fSiXqg+O9Wk=", + "+lh4blqYbCo=", + "d21D8W/rFr4=", + "lZYWcEFy2II=", + "jLeh4MO0nzA=", + "+CQCZckrtCc=", + "es8Bx0Wzoys=", + "f2aKrcB8kbA=", + "MVygScVHgAI=", + "+3g0ewFJ9ic=", + "s+C4Hvq10zI=", + "Cwz3Z4ry+/o=" + ], + "pathpayment strict send|protocol version 27|not enough offers for first exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "e8gJL8zgCw8=", + "JmClDtbz6r0=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 27|not enough offers for last exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "QeeSV0NrlQ8=", + "JmClDtbz6r0=", + "t0W/GzdUKUU=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 27|not enough offers for middle exchange" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "QHOELbxGha8=", + "MjpK8D54ud0=", + "k0bfOUomIN0=", + "jpEyCiLjupo=", + "8PdFPbZbEQI=", + "TXG4+4OVRas=", + "t597fFQdqRs=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "ACWGE0QyehY=", + "tMP8pTBJKs8=", + "TKqAnEBt8Sw=", + "1WfFoVcFmE4=", + "QeeSV0NrlQ8=", + "xZH6bFaTZds=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment strict send|protocol version 27|rounding" : + [ + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=", + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=", + "eLnko7bphqc=", + "mM4H5bKlja8=", + "c0akAUODTRw=" + ], + "pathpayment strict send|protocol version 27|rounding|exchangeV10 recalculate sheepValue: 1 offer" : + [ + "Ni072QGUW4M=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "DwC3xzhMG08=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "RRgUN1cgbG0=" + ], + "pathpayment strict send|protocol version 27|rounding|exchangeV10 recalculate sheepValue: 2 offers" : + [ + "z71xApXGK3I=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "cSDTFS0jfT8=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "7+o+VIi9NpQ=", + "g6le2AYAA90=" + ], + "pathpayment strict send|protocol version 27|rounding|send some, receive nothing" : + [ + "z71xApXGK3I=", + "LiyXOTeo1Zc=", + "EjOa9+Ezv78=", + "llGurxUm+rI=", + "cSDTFS0jfT8=", + "08GjnAxVCio=", + "TcgHbMXNjI4=", + "7+o+VIi9NpQ=", + "tRkqHjwReeE=" + ], + "pathpayment strict send|protocol version 27|send amount constraints" : [ "eLnko7bphqc=", "Tg2dnTcND/8=", "UeEUfbgy3DA=", "FAGaMo6BMVM=" ], + "pathpayment strict send|protocol version 27|send amount too big" : + [ + "TSReZgxlUww=", + "v8lZeIsToOA=", + "Uugo9rWwEC8=", + "VdwNLuBPT1k=", + "p7Tt5FPaAvQ=", + "qtXyCPhJrGM=", + "1+IyZyv9p2o=" + ], + "pathpayment strict send|protocol version 27|source does not have trustline" : + [ + "B8eZLlA3QAI=", + "ktuzHMv/IqE=", + "UgUOTk3nN4Q=", + "OqDuU0KyT7o=", + "wGJirSRxKX8=" + ], + "pathpayment strict send|protocol version 27|source is not authorized" : + [ + "iL7u6PcSRVw=", + "v8lZeIsToOA=", + "1/2Ln+3WcAE=", + "7QbZUATnwz0=", + "mG1KuE9WmZA=", + "brfAb7Oy1oo=", + "YugIPkEfzdA=", + "wVY49x+3UuQ=", + "0ALYHmpB0zs=" + ], + "pathpayment strict send|protocol version 27|takes all offers, multiple offers per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "Cbtn3AwpknY=", + "pSJXiLYA2bs=", + "36ea2+rYDmg=", + "8hfOhPjUiFk=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "us9Zn+LajCU=", + "/NGCwysP624=", + "7dvjoLH3fNM=", + "n8473ts2oSg=", + "aRPSOqSfbV8=", + "RWMoABAXBMk=", + "JF2S26KCNY8=", + "SzLN4OAaEQY=", + "EIg0rJWZBUw=", + "fPXB/OassXg=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "sPGlsjsBh0g=" + ], + "pathpayment strict send|protocol version 27|takes all offers, one offer per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "Cbtn3AwpknY=", + "jYWaVEYTegE=", + "zqkasp3Mvbc=", + "xCQEWiZnR5o=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "feenXo1lw/k=", + "dy6y9VG5KRE=", + "ZUUU7LBxlVw=", + "c1ZT3I0Ii7Q=", + "ES1h8cBIQv8=", + "4egIznvcDQQ=", + "1ilChofvrNA=", + "ArKxSO7HgN0=" + ], + "pathpayment strict send|protocol version 27|takes best offers, multiple offers per exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "Cbtn3AwpknY=", + "pSJXiLYA2bs=", + "36ea2+rYDmg=", + "8hfOhPjUiFk=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "aOFsvW9G8u8=", + "/NGCwysP624=", + "7dvjoLH3fNM=", + "n8473ts2oSg=", + "aRPSOqSfbV8=", + "RWMoABAXBMk=", + "JF2S26KCNY8=", + "SzLN4OAaEQY=", + "EIg0rJWZBUw=", + "fPXB/OassXg=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "L81alYqPfk4=" + ], + "pathpayment strict send|protocol version 27|takes best offers, multiple offers per exchange, last offer sends 0 but adjusts to be deleted" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "y5BnMuIK/Fw=", + "k/CxDr3YGIk=", + "BBKTXhzkBiM=", + "7Tfr2k3iRpw=", + "6BVtxmMlM/0=", + "aAqYy6EdIeI=", + "FeRqpqzZwoc=", + "6Hc2KKc8oQA=", + "wCh+A/APpTk=", + "4SVZF+Xg7o4=", + "w1GajO6JYoE=", + "X4dDun75Xos=", + "HtzboJFiw2I=", + "3yudarmBDhU=", + "KJocMEhnB30=", + "k8rndXh5OpE=", + "FWbwQR+fxmA=", + "XrIBZiSLajE=", + "p969QjwbG8U=", + "73wqULn0E2U=", + "tfG/wAzWQaM=", + "PGiVslQykeg=", + "4Fgjr9tVi2U=", + "imDJ+p4hSV8=", + "gxF4FFm0dHc=", + "msNdztj9TUQ=", + "NacizF9AvdM=", + "h3X9uTVIb5g=", + "dLAGtxhPr94=" + ], + "pathpayment strict send|protocol version 27|to self XLM" : [ "eUyY+GwKPe4=", "aJv4cTpj+pI=" ], + "pathpayment strict send|protocol version 27|to self asset" : [ "9iYB5CZvuZI=", "49V3t+zLBXE=", "/9wdKo2wkeU=", "0fxyFB5E7Ro=" ], + "pathpayment strict send|protocol version 27|to self asset over the limit" : [ "9iYB5CZvuZI=", "49V3t+zLBXE=", "GrX/eCNRfhs=", "b2DBB04e7Jo=" ], + "pathpayment strict send|protocol version 27|under destination minimum XLM" : [ "VO1L5Rt2MK8=", "/2haRV0n3to=", "jqDTZZ/yqZQ=" ], + "pathpayment strict send|protocol version 27|under destination minimum asset" : + [ + "eLnko7bphqc=", + "v8lZeIsToOA=", + "fR3t7ar0bT0=", + "fs4CP0lni9s=", + "TBwb2Ll+iQg=", + "PKQzd8AM3+w=" + ], + "pathpayment strict send|protocol version 27|under destination minimum with real path" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "M1qaWHOx3k0=", + "xUQIczSM+mY=", + "aR6AiwdkjWo=", + "Cbtn3AwpknY=", + "jYWaVEYTegE=", + "zqkasp3Mvbc=", + "xCQEWiZnR5o=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "feenXo1lw/k=", + "dy6y9VG5KRE=", + "ZUUU7LBxlVw=", + "c1ZT3I0Ii7Q=", + "ES1h8cBIQv8=", + "4egIznvcDQQ=", + "1ilChofvrNA=", + "QqdQAouaiYQ=" + ], + "pathpayment strict send|protocol version 27|uses whole best offer for first exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "kZUlKzirNAc=", + "1xoPcCaGSmg=", + "EbXKKOlrEuw=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "Qpp4dZpx0Uw=", + "tkikUzbTBd4=", + "THUfBcrTApE=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "MC8qJX3U6pw=", + "UEFIyg/2+7w=", + "MjJx0q+8GVw=", + "pRywSg4lOZQ=", + "sHSmM/YKJho=", + "KlVUelwrCD4=", + "Na43vaX6XIY=", + "sJpCg7f3nEk=" + ], + "pathpayment strict send|protocol version 27|uses whole best offer for last exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "xUQIczSM+mY=", + "hEyTf1iDmRQ=", + "Hpjo9o3NiWs=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "nKQD3rlV59Q=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "d+ESnHG3Ohg=", + "tlam7OrKwrI=", + "U5fZg1SZhUo=", + "+SeRBDZK+o0=", + "gjELMm/rbhw=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "nB5yFvtyh0o=" + ], + "pathpayment strict send|protocol version 27|uses whole best offer for second exchange" : + [ + "wwvzto3Euec=", + "KYZNUL3XrUw=", + "OCU9yTMlO/4=", + "25iX2Aoax6Q=", + "Cnp6N3tmZeo=", + "EbXKKOlrEuw=", + "6BVtxmMlM/0=", + "xVKwlbLGn5U=", + "3AzN446GGNo=", + "PAx4objgdqw=", + "+l7d7ARQqfQ=", + "dzEV7USP3TU=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "nO0RX6GD8Ck=", + "s8BjOSVT9OI=", + "IGW0VcEpTMc=", + "wx8DithpYh8=", + "RlPeiYZEEdc=", + "+SeRBDZK+o0=", + "rSHllhfRUa0=", + "l9rPFYGB2jk=", + "Na43vaX6XIY=", + "9HD9Vfu6GqU=" + ], + "pathpayment strict send|protocol version 27|with cycle" : + [ + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=", + "J89Gtt+wkis=", + "x1iOF6dVHSY=", + "Wo3tRuwFTlg=", + "DlDanurL2vU=", + "FMmG7wtWowk=", + "XqYpQolKMik=", + "AGFbovRoYUg=", + "yJBSOIU+P4E=", + "zmPhw+lL1FY=", + "yneanXfrJIc=", + "J5bgyPIIkAs=", + "x7i5PLwD+wU=", + "UA/N2697P2o=", + "qCVvEKCrx1I=", + "QO3h04MPeOI=", + "QwuX9uBVNc4=", + "QlqQL3Rk1dI=", + "beRR23Ft1qY=", + "VB7fxcbzShY=", + "UNav1yStsZM=", + "6bOrHDF6WwA=", + "vLeHDr5clMA=", + "DkqT4nPOug8=", + "omXlTfceBR8=", + "BQArFCBA848=" + ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage" : + [ + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=" + ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage with low destmin" : + [ + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=", + "knF6ej/1V20=", + "v58CDG56uBY=", + "CULq94lsTCk=" + ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage with low destmin|send with path (IDR -> USD -> XLM -> IDR)" : [ "czvEgr+Q+WM=" ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage with low destmin|send with path (USD -> XLM -> IDR -> USD)" : [ "KTCkw3ugk9Q=" ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage with low destmin|send with path (XLM -> IDR -> USD -> XLM)" : [ "Kz3oaR7d3aE=" ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 27|with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "FojqQot+13Q=" ], + "pathpayment strict send|protocol version 27|with cycle|arbitrage" : + [ + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=", + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=", + "0Z0G3ZX8cNo=", + "yRkYBxCvhN0=", + "LNBVN6FzZkc=" + ], + "pathpayment strict send|protocol version 27|with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "lplcRTVGH1s=" ], + "pathpayment strict send|protocol version 27|with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "M3Xi0ZqKnAI=" ], + "pathpayment strict send|protocol version 27|with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "KdS6oneesgI=" ], + "pathpayment strict send|protocol version 27|with rounding errors" : + [ + "MeWjcmO9354=", + "XSwxdxt5i4U=", + "7zNelG1uQPI=", + "6/rSTJIzxrU=", + "cMkNLyLs4i8=", + "0d0d6KiblyQ=", + "tRzj2ksncFg=", + "ie6GldQ1XEs=", + "cCG+dBmDtIw=" + ], "pathpayment strict send|protocol version 2|crosses destination offer for first exchange" : [ "xC426YWBjUs=", diff --git a/test-tx-meta-baseline-next/PathPaymentTests.json b/test-tx-meta-baseline-next/PathPaymentTests.json index 52dd95ac6d..c0430f6654 100644 --- a/test-tx-meta-baseline-next/PathPaymentTests.json +++ b/test-tx-meta-baseline-next/PathPaymentTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "path payment uses all offers in a loop|protocol version 0" : [ @@ -1537,6 +1538,89 @@ "K6bmaDg5KcQ=", "r88bD+Drst4=" ], + "path payment uses all offers in a loop|protocol version 27" : + [ + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=", + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=", + "8v9QoTOlWXM=", + "Rkm46Eh/yzk=" + ], + "path payment uses all offers in a loop|protocol version 27|inside issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "WSo5mYbpzIE=", + "r88bD+Drst4=" + ], + "path payment uses all offers in a loop|protocol version 27|no issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "2nduu/0zlEs=" + ], + "path payment uses all offers in a loop|protocol version 27|outside issuers missing" : + [ + "DaTWBlwBL+Y=", + "5e4V/YpIhIY=", + "7RW/0sqAfb8=", + "MlgfFFjsvB4=", + "/Iyes9JSj94=", + "bvh3jBpW8dk=", + "bDfwf4atzsU=", + "H+FfJt+cqNc=", + "Kw9Hjok5TuE=", + "w7hrWnZDkjw=", + "+VQV6FZbkiY=", + "aKvck/mW4x0=", + "lR8H290TR08=", + "ZUOwM6VXkdM=", + "rjXdM3tNge0=", + "02FirdJLPpw=", + "aT6AhSwQtEI=", + "ZKlp1C1lNg0=", + "gzLxxAQj36M=", + "7LsS/qMI7t8=", + "K6bmaDg5KcQ=", + "r88bD+Drst4=" + ], "path payment uses all offers in a loop|protocol version 2|inside issuers missing" : [ "znU103OdJm8=", @@ -12334,10 +12418,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -12480,12 +12564,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -12627,12 +12711,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -12774,12 +12858,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -12921,12 +13005,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -13068,12 +13152,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -13215,12 +13299,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -13362,12 +13446,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -13509,12 +13593,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -13656,12 +13740,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 14|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 14|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 14|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 14|issuer missing" : @@ -15777,10 +15861,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -15923,12 +16007,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -16070,12 +16154,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -16217,12 +16301,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -16364,12 +16448,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -16511,12 +16595,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -16658,12 +16742,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -16805,12 +16889,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -16952,12 +17036,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -17099,12 +17183,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 15|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 15|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 15|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 15|issuer missing" : @@ -19220,10 +19304,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -19366,12 +19450,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -19513,12 +19597,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -19660,12 +19744,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -19807,12 +19891,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -19954,12 +20038,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -20101,12 +20185,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -20248,12 +20332,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -20395,12 +20479,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -20542,12 +20626,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 16|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 16|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 16|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 16|issuer missing" : @@ -22663,10 +22747,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -22809,12 +22893,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -22956,12 +23040,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -23103,12 +23187,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -23250,12 +23334,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -23397,12 +23481,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -23544,12 +23628,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -23691,12 +23775,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -23838,12 +23922,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -23985,12 +24069,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 17|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 17|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 17|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 17|issuer missing" : @@ -26106,10 +26190,10 @@ "PPR4p4AHA8o=", "TMSx7frL92w=", "sxA81FYvaBo=", - "jPL0KyO/eKg=", - "1gqZESjFp/0=", - "Xx8GSEpSgzY=", - "YDmMyBZ0ov4=" + "2jrv+qxpVzg=", + "/puEDJLcirE=", + "yuRmiviH0OE=", + "xDHSN+JXFx8=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -26252,12 +26336,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QF1IPRLoyc0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "OSVLpWl31Nw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "S/GXwNWCfYk=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "a4+HlSR0d3I=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "4eICLDPTgY8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "0PmtTwwUC20=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "QCpWmt+REFQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "qdLugd6zbnU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "TaGJ71gIh68=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "cH2hhBkhVlU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "mpA9v6i54ww=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "VvPQkrHcGcU=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "XW2K8kqJofs=", @@ -26399,12 +26483,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "i8pIBHax7JE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "UMvpVYDRvM0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "vqV/MRX86g4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "+vlNCUkkUBE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+5tXJuKujGI=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "EZAbUH+m8Ko=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "6HH5pcKQoB8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "lzipZqewV6M=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "uFrGh60e6tw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "uw786xjHqqw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "+lQv1J66uA4=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "n+ykPHwJJYA=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "XW2K8kqJofs=", @@ -26546,12 +26630,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "PG2yVctUbWM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "07N+gi9y1Ds=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "FxrRmOf/QTE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "ZR93ckPvwjQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "930aoJBVhtE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "z38RYJAKFdw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "yAug6xeJzHs=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "SP+nDKR6eCE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "QS5jlI/tlDw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "FsIqZHv8Z/c=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "+kNvadsgi2s=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "3/KEHCg9O/E=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "XW2K8kqJofs=", @@ -26693,12 +26777,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "YG5wAS91w8g=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "no1bzkYTXDQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "97YcHbdMCPc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "tE6aaYX6es8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "F5xAirbuKsM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "X/uXwpuABiU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "yXc1u6xsnek=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "D1obmSAtu+8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "1zWdjlt7aZk=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "pfLkuwtNzb0=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "iR0j65zoO1U=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "vpZxq8VRPFo=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "XW2K8kqJofs=", @@ -26840,12 +26924,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "oo4u+6t/4Pc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "6WUlXmcKG4s=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "8kyjRP3fy1k=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "H7fYjhJ1Dgc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "IGNg2wNd8qM=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "0AHNEnWVd1A=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0zvQB3wQrNE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "eW+CZJ2qFzo=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "OCwHqDxoNuw=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "vGr8L/i9VSc=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "L0XEt/feex8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "tcBOcboVoYs=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "XW2K8kqJofs=", @@ -26987,12 +27071,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "DdanEUyZ+nE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rxPXjqVTSSY=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "NrR5ihUR5K8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "VZoz9FNyaiA=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "8HDqcfdSc54=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "RuCIbeMnSRE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "NxOhEM2hWWE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "mgoeywkpx+k=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "InvnZZ+D/4U=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "nrGj7N/ii7g=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "ZHjlKOaiehM=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "6q/Qmntk61Q=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "XW2K8kqJofs=", @@ -27134,12 +27218,12 @@ "4gQAmbyInIg=", "N+AkR9fXtP0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "ojLowK9KvEU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "TKdviGb+oF8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "qvQ3p40SgFU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "KqCQiCLZVGw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "tKr/wIZ7C4o=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "5J9QgtjazO4=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "OMA1OuuKU5s=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "wA298zyrds8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "J6hFWlUg4V8=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "YVgqWOV+F6c=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "1IpSveDJyIU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "zMdVm5QlO6M=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "XW2K8kqJofs=", @@ -27281,12 +27365,12 @@ "zDXWL4ebeTk=", "ikzX8m584q4=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "QbHLXRPtdvE=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "KPcetLncbAc=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "mFZZvpwlic8=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "fXhvetUk4D0=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "2RZ5re49TRg=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "qlJnoSQOEFA=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "OAbNwB5Ry0M=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rqfwrZSkWYQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "KpUYccndDBI=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "iW7/GsYYOFU=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "c/5PzZgeHXk=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "AOvPmIBICXg=" ], "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "XW2K8kqJofs=", @@ -27428,12 +27512,12 @@ "8g26KwWq07c=", "AoghfiNCKCQ=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "h9r5rVMxYUs=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "WGsVmQ8Hbiw=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "6+XjwkqtJQU=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "awuI0+qkPWY=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "dmPZ2IGG0fA=" ], - "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "6/AON+VnPME=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "tMziTSh6JVM=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "aJp/xYQgndQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "SoYHju7A1mQ=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "PqdWU1SboDE=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "GSQfhdhOukY=" ], + "pathpayment|protocol version 18|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "kANmSKZRBcc=" ], "pathpayment|protocol version 18|dest amount too big for XLM" : [ "ffpzsl3xrBo=", "U0/3+yjhOAM=" ], "pathpayment|protocol version 18|dest amount too big for asset" : [ "ffpzsl3xrBo=", "0hRlqOo6txg=", "tcbP0zzvd9U=", "UbYsr7uVmt8=" ], "pathpayment|protocol version 18|issuer missing" : @@ -29549,10 +29633,10 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -29695,12 +29779,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", @@ -29842,12 +29926,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", @@ -29989,12 +30073,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", @@ -30136,12 +30220,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", @@ -30283,12 +30367,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -30430,12 +30514,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", @@ -30577,12 +30661,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", @@ -30724,12 +30808,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -30871,12 +30955,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 19|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], "pathpayment|protocol version 19|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], "pathpayment|protocol version 19|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], "pathpayment|protocol version 19|issuer missing" : @@ -34975,10 +35059,10 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ @@ -35121,12 +35205,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", @@ -35268,12 +35352,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", @@ -35415,12 +35499,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", @@ -35562,12 +35646,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", @@ -35709,12 +35793,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -35856,12 +35940,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", @@ -36003,12 +36087,12 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", @@ -36150,12 +36234,12 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", @@ -36297,12 +36381,12 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 20|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], "pathpayment|protocol version 20|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], "pathpayment|protocol version 20|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], "pathpayment|protocol version 20|issuer missing" : @@ -37386,7 +37470,3450 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 20|path payment rounding" : + "pathpayment|protocol version 20|path payment rounding" : + [ + "84dB2CkjYMM=", + "l/kHyURS/+M=", + "5ZlFxJBFyFA=", + "84dB2CkjYMM=", + "l/kHyURS/+M=", + "5ZlFxJBFyFA=" + ], + "pathpayment|protocol version 20|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + [ + "+b87FRsGcjk=", + "B62pF6s6HKU=", + "vPwHMotDGCI=", + "EmcOgYB0lek=", + "fmXAq43skHE=", + "tsWDmFYJBJo=", + "XZYDIIGqDC4=", + "LT0l0KObt6I=" + ], + "pathpayment|protocol version 20|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + [ + "73A0UNKWLKo=", + "7j9cSBVYs4U=", + "/X+4TW7bq/w=", + "ZGmkBVKAHG4=", + "tzuGa6BQ3ng=", + "8MWooxhr5DY=", + "3F2ZL+28hHg=", + "RP+CXGlIDMQ=", + "tpaGwWKft3Q=" + ], + "pathpayment|protocol version 20|path payment send currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 20|path payment send max 0" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 20|path payment send max negative" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 20|path payment source does not have trustline" : + [ + "/EmyOnCtLmA=", + "c1gCoedj8uQ=", + "EJfgn0W2N3g=", + "OqDuU0KyT7o=", + "wGJirSRxKX8=" + ], + "pathpayment|protocol version 20|path payment source is not authorized" : + [ + "zPS+2W6schE=", + "Pazy8CJDr+A=", + "xH9z1nN2Eqc=", + "aknfXCAKshM=", + "bZ3gPtw91cM=", + "QIzPbnwaNIk=", + "zPS+2W6schE=", + "Pazy8CJDr+A=", + "xH9z1nN2Eqc=", + "aknfXCAKshM=", + "bZ3gPtw91cM=", + "QIzPbnwaNIk=" + ], + "pathpayment|protocol version 20|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 20|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 20|path payment takes all offers, multiple offers per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "kpI9oAm3T6k=", + "zvcCyZ/1O6Y=", + "pVDK6uoLmbc=", + "fDEHOy8/1A4=" + ], + "pathpayment|protocol version 20|path payment takes all offers, multiple offers per exchange V10" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "OstPSQr5pYg=", + "IkuW9noe4CQ=", + "hYAVjmIyBx4=", + "KBvD3Ho2FOY=", + "Que30dRKLks=", + "zDt//pqKMGE=", + "1DYvE3KMLHg=", + "E5FJovY32mE=", + "HQ94upzMa70=", + "5wmXiCqVv6A=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "YELQlc6wi88=" + ], + "pathpayment|protocol version 20|path payment takes all offers, one offer per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "QRFmz0cab/8=", + "4ZoPOW0YsX8=", + "3OB5Fz1NH7E=", + "i3+doKhg3yQ=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "x3HdUNvOpYE=", + "6izvAMPQXMw=", + "ecA6Ns1r+qs=", + "fDEHOy8/1A4=", + "m9y9Q17P010=", + "Tt4DLLMC+Tg=", + "1ilChofvrNA=", + "r/vKK+R+E9I=" + ], + "pathpayment|protocol version 20|path payment takes best offers, multiple offers per exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "kpI9oAm3T6k=", + "zvcCyZ/1O6Y=", + "pVDK6uoLmbc=", + "fDEHOy8/1A4=" + ], + "pathpayment|protocol version 20|path payment takes best offers, multiple offers per exchange V10" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "DWbP9b4rr7A=", + "EvVXXLhim7c=", + "pecJc0wzcWw=", + "QRFmz0cab/8=", + "7C0yV5xHHAU=", + "/R+8vyV/wkg=", + "no2K7x2lowI=", + "OQOMW+Pa/ME=", + "iv73i1SDwN4=", + "buN1Rj6jc+o=", + "+yjWAC25ffc=", + "qkbz0C0TO6U=", + "IkuW9noe4CQ=", + "hYAVjmIyBx4=", + "KBvD3Ho2FOY=", + "Que30dRKLks=", + "zDt//pqKMGE=", + "1DYvE3KMLHg=", + "E5FJovY32mE=", + "HQ94upzMa70=", + "5wmXiCqVv6A=", + "fDlFI046bgI=", + "sW8+8ZeSQ6I=", + "LThcgZ1yLp8=", + "86cuf/GS4O0=" + ], + "pathpayment|protocol version 20|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 20|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 20|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 20|path payment with cycle" : + [ + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=", + "JYHFotZe0+U=", + "N1g7eei+n5c=", + "+M9mw6ibkMQ=", + "dlahN2o/Yv8=", + "/BLRlKuc4SM=", + "XOO7UP+iA38=", + "rGHO3J+Juvo=", + "5yqXer+krDI=", + "IFsGMvqgMcw=", + "UJM6yPaw2mk=", + "+q0ssuT6Nk0=", + "KglWig63aM4=", + "woPxsVTuY98=", + "aHmeQ5TI2Eo=", + "brzqvGgLg2U=", + "0RhzmVCz61Q=", + "tcr2fDB0Vdw=", + "+VPtNYhM/Ow=", + "rFY1hE/p3+Q=", + "eg8C6Ea7yco=", + "rPBuQmzAg2Q=", + "j9hIV9mcYiM=", + "z+Lk59Lp+LI=", + "n6eVjEMVsNg=", + "HyzF/1NelYw=" + ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage" : + [ + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=" + ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax" : + [ + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=", + "1ZOgoaqGpjQ=", + "q16uoSCziIA=", + "jps0yhLPa+A=" + ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage" : + [ + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=", + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=", + "J+JvuyL47Yo=", + "RuMySzr96po=", + "BLAuQHYo3oo=" + ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 20|path payment with rounding errors" : + [ + "pjSG6TKYsG8=", + "gFz8o0HBkqg=", + "iUtpyh6XtB8=", + "evKjP49/7BA=", + "cMkNLyLs4i8=", + "0d0d6KiblyQ=", + "LGcQnfOiS8I=", + "ie6GldQ1XEs=", + "7Hut65U4jf4=" + ], + "pathpayment|protocol version 20|path with bogus offer, bogus offer shows on offers trail" : + [ + "wcgpbmaVjBA=", + "yuIxOHPBaBQ=", + "ouMyZziMl+g=", + "bjXaXyNKPcI=", + "bSUTAXViYqw=", + "az5l08eNYQk=", + "v1B8VCiHaW4=", + "U+Qp6/NERxc=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment" : + [ + "GMFz9Wcm7H4=", + "EdmTGwx/oHw=", + "+vurEkbV2us=", + "FGzIAIxeofc=", + "cZ6cjjGSL4E=", + "QQvofI3avDM=", + "qSH7D3AVmZc=", + "kGyhvJYqEGQ=", + "GMFz9Wcm7H4=", + "EdmTGwx/oHw=", + "+vurEkbV2us=", + "FGzIAIxeofc=", + "cZ6cjjGSL4E=", + "QQvofI3avDM=", + "qSH7D3AVmZc=", + "kGyhvJYqEGQ=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + [ + "SDA54a1FCn8=", + "fx8/uj8pMZU=", + "OzvRDBvfSXc=", + "S5Z2fdVXXRk=", + "JQJDHlGGuKw=", + "LXrcsR8fhTA=" + ], + "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + [ + "sko66XB6VKM=", + "cGePF4sBpUc=", + "SjhpCyV17y4=", + "EIf85MlHri0=", + "0xu9qM5H9OE=", + "D49JXrZm99c=" + ], + "pathpayment|protocol version 21" : + [ + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=", + "FoRcm9E0hVg=", + "Nx/RMV1UcHg=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "HJ0uCpmZfFY=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "mmDCjvx/7/g=", + "CZOj2X2cD9s=", + "k53WMYqD7Ws=", + "XU8W/j21sRg=", + "c8ws/vjWMV4=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "/GoNfkLutro=", + "Rkr/txmhP5o=", + "i1N4O/+6s7Y=", + "DwLmc41DrZ4=", + "7ihkpYi9Ht4=" + ], + "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "aPGKW/yEGD0=", + "9+gjVh2AOLk=", + "Na43vaX6XIY=", + "/GoNfkLutro=", + "z3eQpNa3XBw=", + "i1N4O/+6s7Y=", + "gRfBVI6+TYs=", + "G2N6OlTf81g=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "HJ0uCpmZfFY=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "pa2DQqS4bwU=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "VvpvCD+Fo+s=", + "ib3O7WVfZIM=", + "j81qhaFS5ss=" + ], + "pathpayment|protocol version 21|authorized|path payment uses whole best offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "aPGKW/yEGD0=", + "9+gjVh2AOLk=", + "Na43vaX6XIY=", + "7RAttFPon9g=" + ], + "pathpayment|protocol version 21|crossed offers release sponsorships allowing payment to succeed for source" : + [ + "/zcorm87qHQ=", + "8dtY9HNqTlc=", + "mkA8dReKyjw=", + "olo/Vu1jSK0=", + "OStx/5DtX2A=", + "2XR9oqinR1k=", + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "VhqiKg68Xn8=", + "WFApHnVS7hE=", + "5T0SosrOIbs=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "mzZeW+gZn1U=", + "F41SzZGotsg=", + "QeI1wQal0fc=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + [ + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=", + "VcYiG9y4WsM=", + "T6TQDkiEL9I=", + "Zt/HWa680zg=", + "eW/jZgvlYNk=", + "OikjfHEcSr0=", + "s5efqfBIXf0=", + "P0pjVxP73mo=", + "/in4m+rDuc8=", + "RaqdxiEwphY=", + "RN/NG2nhY8Q=", + "M1Hg5hoEu5I=", + "3fjhFpeX+KM=", + "SuNhCSiFr3Q=", + "07giPIFtnCA=", + "VzZ6XT4M8ok=", + "XaBBAJeZ00g=", + "tGGKP4zHS6Y=", + "lEYjsXE1ilw=", + "XXXhOOZzN7E=", + "P4RC/LjXqyI=", + "ikXHTSf+okg=", + "8eKRh+k1Wug=", + "+DnE2NEWoa4=" + ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 21|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 21|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 21|issuer missing" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=", + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=", + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "uHUSG517pL4=", + "Ytvp7CGAD7o=" + ], + "pathpayment|protocol version 21|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 21|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 21|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 21|liabilities|cannot pay balance below selling liabilities" : + [ + "SDtbjftEI1s=", + "N69CP8LhY0g=", + "URxBC5KX89k=", + "Z2hE3ikMbn4=", + "fLp07s34sG0=", + "9Drp+/Sj+Fk=", + "j70sBkhgkTA=", + "mdVbgPUqqno=", + "NQMxf0Zhm6U=", + "Itq8GcPd5Ps=", + "H3qWFpwqtQ0=", + "9BleSWWLEbs=", + "JdItP/blvhE=" + ], + "pathpayment|protocol version 21|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + [ + "SDtbjftEI1s=", + "N69CP8LhY0g=", + "URxBC5KX89k=", + "Z2hE3ikMbn4=", + "fLp07s34sG0=", + "9Drp+/Sj+Fk=", + "j70sBkhgkTA=", + "mdVbgPUqqno=", + "NQMxf0Zhm6U=", + "bQN/5HdxBh4=", + "AqNWxxYVZMg=", + "QjOLIrqYux0=", + "s+C4Hvq10zI=", + "nRtt0mTyl68=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "QQ4h8tqZT9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ulHyT4b2SBU=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "0giVoX99Wmg=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 21|path payment asset with not enough funds" : + [ + "5nC6xsgmxLs=", + "Pazy8CJDr+A=", + "nLtG3yq8b9Y=", + "0oDctYWMTa8=", + "bEDektKfRZM=", + "kpKqsIKNDMM=", + "oHB6DhbBacU=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for first exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "J3mnwWP/C9A=", + "kACOdqjy7RI=", + "bSZpZEyPzqs=", + "+f1LARl9w9Y=", + "AacAIQaK9HI=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "iIQgcvlFuJY=", + "jAFCeDoPL+U=", + "6vhgBkZkSFc=", + "zmSU1Yo209s=", + "zUxBAfGjTjE=", + "0fQwPycepNs=", + "IlRspbbYCyo=", + "R9Z5XuIfOdw=", + "dXFqJZD8GQQ=", + "eM6EfdRtAxQ=", + "lXDT7LiGnEA=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for last exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "bSZpZEyPzqs=", + "MjywsTnTWCE=", + "oicfAtgu+do=", + "utu+aZ3+r/8=", + "nhHP8Sfy3k8=", + "RytwHSzzBVQ=", + "/+7KoVvfZUU=", + "vLhVwrtxaho=", + "tVQc46G3K4A=", + "8hy+NSvWQOs=", + "L+D1oLrg8VU=", + "Z3S0P+IzZgE=", + "HrgtrgyMVkw=", + "QF9yUfxuR1E=", + "j07bC7ehxMM=" + ], + "pathpayment|protocol version 21|path payment crosses destination offer for middle exchange" : + [ + "84dB2CkjYMM=", + "YCxyeiUksg4=", + "lCSRAX4I974=", + "kACOdqjy7RI=", + "bSZpZEyPzqs=", + "MjywsTnTWCE=", + "oicfAtgu+do=", + "e7FsWqDugT4=", + "Ev2+DAhWAVk=", + "kxtAqLUzWgg=", + "KTR+g8pZqdw=", + "6vhgBkZkSFc=", + "zmSU1Yo209s=", + "1M2jAGWqH0c=", + "PI771/Z0JR0=", + "IlRspbbYCyo=", + "RUQjv4d5AsU=", + "XpSg+d4cgxo=", + "eM6EfdRtAxQ=", + "qV2c+/ls7xQ=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for first exchange" : + [ + "5c6UBHiI+wk=", + "kaTyzoqxCVo=", + "qo74s1HZB5k=", + "jgx9R5zyZv8=", + "V8UufGgWimw=", + "dJWLYZfR6eU=", + "cJYQzeFYkOE=", + "RxQ+H+td5io=", + "o+32QNYuWMI=", + "/auR3DyJamA=", + "RsvlkFCdMfQ=", + "vLhVwrtxaho=", + "gAm6EgCGLFk=", + "SNySMZPdFWE=", + "jvxPwGJLhVI=", + "ZFJ0HsG7cLY=", + "Yr9FHebsDVw=", + "TZgoqjbP/mg=", + "zdv2cP5T1F8=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "SZ40vD1VBBE=", + "Qfc9DZh5K6k=", + "bJkCU3rOT4Q=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "XQrdw4Rz49I=", + "SV89dl1JRmw=", + "M74si97PonU=", + "zmSU1Yo209s=", + "c+b5Ye7Rtik=", + "0ESdc41k8cM=", + "CrAVA3FR8ww=", + "sXqFrezTNdc=", + "deuoQBlxE20=", + "vPnvVFdjuzU=", + "4R+Ytq7eRYk=" + ], + "pathpayment|protocol version 21|path payment crosses own offer for middle exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "kACOdqjy7RI=", + "SZ40vD1VBBE=", + "86unpK6HXKY=", + "HYBRSoWu/bo=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "d8wEGj9jWrg=", + "uZwQhV2v5ZA=", + "M74si97PonU=", + "zmSU1Yo209s=", + "c+b5Ye7Rtik=", + "HTKsAcMyUuI=", + "iwDqLXKdQz8=", + "sXqFrezTNdc=", + "2KKdy+18V3s=", + "HpH1buzQvSA=", + "lAHs/LaSaT8=" + ], + "pathpayment|protocol version 21|path payment destination amount 0" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination amount negative" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 21|path payment destination does not have trustline" : + [ + "84dB2CkjYMM=", + "FG3IhmTARzU=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "eCrqSgEANyk=", + "PKQzd8AM3+w=" + ], + "pathpayment|protocol version 21|path payment destination is issuer and does not exists for complex paths" : + [ + "84dB2CkjYMM=", + "xJSnVFa38aM=", + "7bnR/v25q6s=", + "Wg+fgElw2FQ=", + "d7qzlts02Go=" + ], + "pathpayment|protocol version 21|path payment destination is issuer and does not exists for simple paths" : + [ + "84dB2CkjYMM=", + "xJSnVFa38aM=", + "7bnR/v25q6s=", + "Wg+fgElw2FQ=", + "Vyqf60paCOQ=" + ], + "pathpayment|protocol version 21|path payment destination is not authorized" : + [ + "84dB2CkjYMM=", + "seAkOSbJ9bg=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "0kY0b30fQuM=", + "QIzPbnwaNIk=", + "84dB2CkjYMM=", + "seAkOSbJ9bg=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "0kY0b30fQuM=", + "QIzPbnwaNIk=" + ], + "pathpayment|protocol version 21|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 21|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 21|path payment destination line full" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "0oDctYWMTa8=", + "Ytvp7CGAD7o=", + "tWsBDuGfYb8=", + "oUB9G6vyaKk=", + "UQFJuq1KcUo=" + ], + "pathpayment|protocol version 21|path payment destination line overflow" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "DMHqrBhgQO4=", + "rBbWm25IsyI=", + "Ytvp7CGAD7o=", + "J5RF9+JTsKg=", + "oUB9G6vyaKk=", + "UQFJuq1KcUo=" + ], + "pathpayment|protocol version 21|path payment destination path currency invalid" : + [ + "84dB2CkjYMM=", + "FPBRed6XlTI=", + "DMHqrBhgQO4=", + "NvPpapviECA=", + "wRCHIbN/oaI=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for first exchange" : + [ + "5c6UBHiI+wk=", + "kaTyzoqxCVo=", + "URxBC5KX89k=", + "lgbAKRlAgn4=", + "7Sbjr+0M8s4=", + "IXQBdJFRAwU=", + "iG1Fr0YfhKg=", + "qF9+bKPbEjc=", + "n5swopYMEhI=", + "XQrdw4Rz49I=", + "SV89dl1JRmw=", + "/sMNGHMkZuM=", + "KnY5gKGoj4c=", + "9uKerPLaCto=", + "5kk6NeOSQso=", + "9gV2104FoKI=", + "4Wp+RBpa0wo=", + "wbQlZ/Kz12w=", + "Z+Ux51YfSi0=", + "iVA1jGzq09o=", + "MtSPVHot0Zw=", + "4XI7ZXXsHfk=", + "K7kmfza4PoY=", + "vDQe3tVDJF0=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "TDwjyCnP9jg=", + "vCeYYMPmjnQ=", + "W2guZyWd17Q=", + "cE03bzbS8F4=", + "3+k3RCZgkVQ=", + "oRmqj3SvYAk=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "2R5jxMFk57U=", + "8Jbnznpoes0=", + "mBtoT5d8Vxo=", + "tEb923m0538=", + "G8ELlauZFuQ=", + "0VNnV1pndcY=", + "J0pA48YUiuA=", + "7faMiG+eUjg=", + "+y+avhcnp2Q=", + "WLCzeX9QUTs=" + ], + "pathpayment|protocol version 21|path payment does not cross own offer if better is available for middle exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "TDwjyCnP9jg=", + "B7F6+feQLpY=", + "bR5uoR59ZFo=", + "cE03bzbS8F4=", + "3+k3RCZgkVQ=", + "oRmqj3SvYAk=", + "vQ69FS2ZGnE=", + "oNdmLLW3zKU=", + "GQ8PxFhGpRQ=", + "nQOgK5GRKcs=", + "2R5jxMFk57U=", + "8Jbnznpoes0=", + "XD8CUYLPGrU=", + "pvNY87GOF94=", + "G8ELlauZFuQ=", + "0VNnV1pndcY=", + "23abQzcabPE=", + "sH9/Ma37y3U=", + "w+wcVmI1duA=", + "l3moHflzmvk=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "QdukIQmH1jY=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "JDiWIwO+zP4=" + ], + "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "wu+z/Bm5lK4=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "k8mDHsdDtFk=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "lwUoYf4lvKg=" + ], + "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "vidJs2P/+V4=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=" + ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 21|path payment not enough offers for first exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "DrAZT3phwvs=", + "Ou2y26AkVUw=", + "t0W/GzdUKUU=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment not enough offers for last exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "svO9nEk0AVk=", + "Ou2y26AkVUw=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment not enough offers for middle exchange" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "GIH8hnoOiN0=", + "gtjrCay+1NY=", + "nvRHXoHxVic=", + "99RptXZthRE=", + "OadSe/2/Rsc=", + "o79ivBVNiLs=", + "JCQkM5d6z80=", + "eufQ931LaBs=", + "tVICI3+Z6Vc=", + "ZKRdZ/gyG8U=", + "F2M9NAC58d0=", + "V+idJOcFwzg=", + "fvuiFIsOvQM=", + "okJmPL1D220=", + "T7h5s1Oa/zE=", + "DrAZT3phwvs=", + "qnPjqedGbTM=", + "C3pGWc84i3E=", + "hMieieeAoGg=" + ], + "pathpayment|protocol version 21|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 21|path payment over send max asset" : + [ + "84dB2CkjYMM=", + "Pazy8CJDr+A=", + "sYj+c9aFJbo=", + "yjeLdT4QJJw=", + "JajBi4B9QYo=", + "PKQzd8AM3+w=" + ], + "pathpayment|protocol version 21|path payment over send max with real path" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "lCSRAX4I974=", + "KYtMrdAM+/k=", + "ho5EEMaxIWc=", + "QRFmz0cab/8=", + "4ZoPOW0YsX8=", + "3OB5Fz1NH7E=", + "i3+doKhg3yQ=", + "s01SN39WtzU=", + "JuY8lhjdxL8=", + "FwbjX0ZT3as=", + "+yjWAC25ffc=", + "x3HdUNvOpYE=", + "6izvAMPQXMw=", + "ecA6Ns1r+qs=", + "fDEHOy8/1A4=", + "m9y9Q17P010=", + "Tt4DLLMC+Tg=", + "1ilChofvrNA=", + "QqdQAouaiYQ=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for first exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "UVq9GYXLP4g=", + "y7KCt1jKjXY=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uim6jY5Ry/0=", + "YKPYuSkVJv4=", + "pZ4g8u23XXY=", + "OgO+E1PeuIA=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "X8bdcVDify8=", + "TlhTWsk93D4=", + "M3kOIt5rPpw=", + "+jxQsl2aq9k=", + "fcrNGAxZkhc=", + "dWAGy249LC8=", + "Na43vaX6XIY=", + "QdukIQmH1jY=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for last exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "KYtMrdAM+/k=", + "qOMtPr7V/V4=", + "eh0v9por5FI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "Uo5oixtDT3M=", + "2ALk0P/kzC4=", + "qbLRkWDmZoU=", + "hXfbw7Ua6+I=", + "20iZJP0BPO8=", + "wi9XVnIRjsU=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "P3h4Sopr/IA=", + "IheVLXxKJkg=", + "eDwRvUGs6og=", + "+jxQsl2aq9k=", + "tPM0NxCpBho=", + "ozVr4RmmCTQ=", + "ib3O7WVfZIM=", + "JDiWIwO+zP4=" + ], + "pathpayment|protocol version 21|path payment reaches limit for offer for second exchange" : + [ + "LWjx9i6CNpU=", + "xuKoj+hSPkw=", + "HgE98Fs7km8=", + "iv1YirSrZsw=", + "32k9MtiTKw0=", + "E/vz+IINYXI=", + "g8wOWw3xCds=", + "1t9WuD8pbqY=", + "wyX4kT3c11Q=", + "fHNhpOne8bw=", + "+l7d7ARQqfQ=", + "CcKom09kN10=", + "M0AhNsbPoDU=", + "DbmC3uvKAJM=", + "00nHmctE62Y=", + "3yudarmBDhU=", + "4UkbRkt+Bqs=", + "4/X87FqY33U=", + "TSCEk9hp8Es=", + "kZW7HeqYFow=", + "ihLgBO9LPfY=", + "+jxQsl2aq9k=", + "vZp5TsVrE6o=", + "bUjwxuDTKYA=", + "Na43vaX6XIY=", + "wu+z/Bm5lK4=" + ], + "pathpayment|protocol version 21|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -37395,7 +40922,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 20|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -37406,7 +40933,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 20|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -37418,7 +40945,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 20|path payment send currency invalid" : + "pathpayment|protocol version 21|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -37426,7 +40953,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 20|path payment send max 0" : + "pathpayment|protocol version 21|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -37434,7 +40961,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 20|path payment send max negative" : + "pathpayment|protocol version 21|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -37442,7 +40969,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 20|path payment source does not have trustline" : + "pathpayment|protocol version 21|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -37450,7 +40977,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 20|path payment source is not authorized" : + "pathpayment|protocol version 21|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -37465,9 +40992,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 20|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 20|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 20|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 21|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 21|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -37487,7 +41014,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 20|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -37517,7 +41044,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 20|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 21|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -37541,7 +41068,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 20|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -37561,7 +41088,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 20|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -37591,10 +41118,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 20|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 20|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 20|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 20|path payment with cycle" : + "pathpayment|protocol version 21|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 21|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 21|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 21|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -37822,7 +41349,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -37834,7 +41361,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -37846,13 +41373,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage" : + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -37864,10 +41391,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 20|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 20|path payment with rounding errors" : + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 21|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -37879,7 +41406,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 20|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 21|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -37890,7 +41417,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -37909,7 +41436,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -37918,7 +41445,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 20|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -37927,7 +41454,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 21" : + "pathpayment|protocol version 22" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -38224,7 +41751,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38257,7 +41784,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38290,7 +41817,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 21|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38323,7 +41850,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38352,7 +41879,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38381,7 +41908,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 21|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 22|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -38410,7 +41937,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 21|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 22|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -38418,12 +41945,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38564,13 +42091,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38711,13 +42238,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -38858,13 +42385,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39005,13 +42532,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39152,13 +42679,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39299,13 +42826,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39446,13 +42973,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39593,13 +43120,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -39740,15 +43267,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 21|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 21|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 21|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 21|issuer missing" : + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 22|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 22|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 22|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -39766,10 +43293,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 21|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 21|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 21|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 22|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 22|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 22|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 22|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -39785,7 +43312,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 21|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 22|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -39802,7 +43329,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39830,7 +43357,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39858,7 +43385,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39886,7 +43413,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39914,7 +43441,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39942,7 +43469,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -39970,8 +43497,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 21|path payment asset with not enough funds" : + "pathpayment|protocol version 22|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 22|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -39981,7 +43508,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -40004,7 +43531,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -40026,7 +43553,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 21|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 22|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -40049,7 +43576,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 21|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -40071,7 +43598,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 21|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40094,7 +43621,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 21|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 22|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40117,7 +43644,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 21|path payment destination amount 0" : + "pathpayment|protocol version 22|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40125,7 +43652,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination amount negative" : + "pathpayment|protocol version 22|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40133,7 +43660,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination currency invalid" : + "pathpayment|protocol version 22|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40141,8 +43668,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 21|path payment destination does not have trustline" : + "pathpayment|protocol version 22|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 22|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -40151,7 +43678,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 22|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -40159,7 +43686,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 21|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 22|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -40167,7 +43694,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 21|path payment destination is not authorized" : + "pathpayment|protocol version 22|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -40182,9 +43709,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 21|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 21|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 21|path payment destination line full" : + "pathpayment|protocol version 22|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 22|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 22|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40195,7 +43722,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 21|path payment destination line overflow" : + "pathpayment|protocol version 22|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40206,7 +43733,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 21|path payment destination path currency invalid" : + "pathpayment|protocol version 22|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40214,7 +43741,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -40241,7 +43768,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40269,7 +43796,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 21|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 22|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40297,7 +43824,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40326,7 +43853,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40355,7 +43882,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40384,7 +43911,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40413,7 +43940,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40442,7 +43969,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 21|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40471,7 +43998,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40524,9 +44051,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40579,9 +44106,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40634,9 +44161,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment not enough offers for first exchange" : + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 22|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40660,7 +44187,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment not enough offers for last exchange" : + "pathpayment|protocol version 22|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40684,7 +44211,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 22|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40708,8 +44235,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 21|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 21|path payment over send max asset" : + "pathpayment|protocol version 22|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 22|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -40718,7 +44245,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 21|path payment over send max with real path" : + "pathpayment|protocol version 22|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40742,7 +44269,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40771,7 +44298,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40800,7 +44327,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 21|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 22|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40829,7 +44356,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 21|path payment rounding" : + "pathpayment|protocol version 22|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -40838,7 +44365,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -40849,7 +44376,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 21|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -40861,7 +44388,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 21|path payment send currency invalid" : + "pathpayment|protocol version 22|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40869,7 +44396,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment send max 0" : + "pathpayment|protocol version 22|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40877,7 +44404,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment send max negative" : + "pathpayment|protocol version 22|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -40885,7 +44412,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 21|path payment source does not have trustline" : + "pathpayment|protocol version 22|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -40893,7 +44420,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 21|path payment source is not authorized" : + "pathpayment|protocol version 22|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -40908,9 +44435,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 21|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 21|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 22|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 22|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40930,7 +44457,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 21|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40960,7 +44487,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 21|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 22|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -40984,7 +44511,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41004,7 +44531,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 21|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41034,10 +44561,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 21|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 21|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 21|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 21|path payment with cycle" : + "pathpayment|protocol version 22|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 22|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 22|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 22|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -41265,7 +44792,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -41277,7 +44804,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -41289,13 +44816,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage" : + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -41307,10 +44834,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 21|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 21|path payment with rounding errors" : + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 22|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -41322,7 +44849,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 21|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 22|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -41333,7 +44860,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -41352,7 +44879,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -41361,7 +44888,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 21|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -41370,7 +44897,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 22" : + "pathpayment|protocol version 23" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -41667,7 +45194,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41700,7 +45227,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41733,7 +45260,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 22|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41766,7 +45293,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41795,7 +45322,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41824,7 +45351,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 22|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 23|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -41853,7 +45380,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 22|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 23|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -41861,12 +45388,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42007,13 +45534,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42154,13 +45681,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42301,13 +45828,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42448,13 +45975,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42595,13 +46122,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42742,13 +46269,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -42889,13 +46416,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -43036,13 +46563,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -43183,15 +46710,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 22|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 22|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 22|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 22|issuer missing" : + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 23|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 23|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 23|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43209,10 +46736,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 22|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 22|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 22|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 23|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 23|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 23|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 23|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -43228,7 +46755,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 22|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 23|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -43245,7 +46772,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43273,7 +46800,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43301,7 +46828,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43329,7 +46856,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43357,7 +46884,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43385,7 +46912,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43413,8 +46940,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 22|path payment asset with not enough funds" : + "pathpayment|protocol version 23|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 23|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -43424,7 +46951,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43447,7 +46974,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43469,7 +46996,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 22|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 23|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -43492,7 +47019,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 22|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -43514,7 +47041,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 22|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43537,7 +47064,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 22|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 23|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43560,7 +47087,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 22|path payment destination amount 0" : + "pathpayment|protocol version 23|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43568,7 +47095,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination amount negative" : + "pathpayment|protocol version 23|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43576,7 +47103,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination currency invalid" : + "pathpayment|protocol version 23|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43584,8 +47111,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 22|path payment destination does not have trustline" : + "pathpayment|protocol version 23|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 23|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -43594,7 +47121,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 23|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -43602,7 +47129,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 22|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 23|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -43610,7 +47137,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 22|path payment destination is not authorized" : + "pathpayment|protocol version 23|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -43625,9 +47152,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 22|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 22|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 22|path payment destination line full" : + "pathpayment|protocol version 23|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 23|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 23|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43638,7 +47165,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 22|path payment destination line overflow" : + "pathpayment|protocol version 23|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -43649,7 +47176,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 22|path payment destination path currency invalid" : + "pathpayment|protocol version 23|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -43657,7 +47184,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -43684,7 +47211,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43712,7 +47239,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 22|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 23|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43740,7 +47267,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43769,7 +47296,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43798,7 +47325,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43827,7 +47354,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43856,7 +47383,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43885,7 +47412,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 22|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43914,7 +47441,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -43967,9 +47494,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44022,9 +47549,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44077,9 +47604,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment not enough offers for first exchange" : + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 23|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44103,7 +47630,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment not enough offers for last exchange" : + "pathpayment|protocol version 23|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44127,7 +47654,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 23|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44151,8 +47678,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 22|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 22|path payment over send max asset" : + "pathpayment|protocol version 23|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 23|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -44161,7 +47688,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 22|path payment over send max with real path" : + "pathpayment|protocol version 23|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44185,7 +47712,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44214,7 +47741,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44243,7 +47770,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 22|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 23|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44272,7 +47799,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 22|path payment rounding" : + "pathpayment|protocol version 23|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -44281,7 +47808,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -44292,7 +47819,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 22|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -44304,7 +47831,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 22|path payment send currency invalid" : + "pathpayment|protocol version 23|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44312,7 +47839,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment send max 0" : + "pathpayment|protocol version 23|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44320,7 +47847,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment send max negative" : + "pathpayment|protocol version 23|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -44328,7 +47855,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 22|path payment source does not have trustline" : + "pathpayment|protocol version 23|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -44336,7 +47863,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 22|path payment source is not authorized" : + "pathpayment|protocol version 23|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -44351,9 +47878,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 22|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 22|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 23|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 23|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44373,7 +47900,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 22|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44403,7 +47930,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 22|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 23|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44427,7 +47954,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44447,7 +47974,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 22|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -44477,10 +48004,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 22|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 22|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 22|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 22|path payment with cycle" : + "pathpayment|protocol version 23|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 23|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 23|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 23|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -44708,7 +48235,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -44720,7 +48247,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -44732,13 +48259,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage" : + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -44750,10 +48277,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 22|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 22|path payment with rounding errors" : + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 23|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -44765,7 +48292,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 22|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 23|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -44776,7 +48303,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -44795,7 +48322,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -44804,7 +48331,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 22|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -44813,7 +48340,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 23" : + "pathpayment|protocol version 24" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -45110,7 +48637,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45143,7 +48670,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45176,7 +48703,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 23|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45209,7 +48736,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45238,7 +48765,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45267,7 +48794,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 23|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 24|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -45296,7 +48823,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 23|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 24|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -45304,12 +48831,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45450,13 +48977,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45597,13 +49124,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45744,13 +49271,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -45891,13 +49418,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46038,13 +49565,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46185,13 +49712,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46332,13 +49859,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46479,13 +50006,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -46626,15 +50153,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 23|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 23|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 23|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 23|issuer missing" : + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 24|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 24|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 24|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -46652,10 +50179,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 23|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 23|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 23|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 24|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 24|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 24|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 24|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -46671,7 +50198,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 23|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 24|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -46688,7 +50215,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46716,7 +50243,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46744,7 +50271,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46772,7 +50299,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46800,7 +50327,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46828,7 +50355,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46856,8 +50383,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 23|path payment asset with not enough funds" : + "pathpayment|protocol version 24|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 24|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -46867,7 +50394,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46890,7 +50417,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46912,7 +50439,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 23|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 24|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -46935,7 +50462,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 23|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -46957,7 +50484,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 23|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -46980,7 +50507,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 23|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 24|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47003,7 +50530,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 23|path payment destination amount 0" : + "pathpayment|protocol version 24|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47011,7 +50538,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination amount negative" : + "pathpayment|protocol version 24|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47019,7 +50546,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination currency invalid" : + "pathpayment|protocol version 24|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47027,8 +50554,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 23|path payment destination does not have trustline" : + "pathpayment|protocol version 24|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 24|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -47037,7 +50564,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 24|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -47045,7 +50572,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 23|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 24|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -47053,7 +50580,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 23|path payment destination is not authorized" : + "pathpayment|protocol version 24|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -47068,9 +50595,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 23|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 23|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 23|path payment destination line full" : + "pathpayment|protocol version 24|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 24|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 24|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47081,7 +50608,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 23|path payment destination line overflow" : + "pathpayment|protocol version 24|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47092,7 +50619,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 23|path payment destination path currency invalid" : + "pathpayment|protocol version 24|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47100,7 +50627,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -47127,7 +50654,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47155,7 +50682,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 23|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 24|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47183,7 +50710,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47212,7 +50739,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47241,7 +50768,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47270,7 +50797,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47299,7 +50826,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47328,7 +50855,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 23|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47357,7 +50884,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47410,9 +50937,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47465,9 +50992,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47520,9 +51047,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment not enough offers for first exchange" : + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 24|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47546,7 +51073,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment not enough offers for last exchange" : + "pathpayment|protocol version 24|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47570,7 +51097,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 24|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47594,8 +51121,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 23|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 23|path payment over send max asset" : + "pathpayment|protocol version 24|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 24|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -47604,7 +51131,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 23|path payment over send max with real path" : + "pathpayment|protocol version 24|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47628,7 +51155,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47657,7 +51184,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47686,7 +51213,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 23|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 24|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47715,7 +51242,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 23|path payment rounding" : + "pathpayment|protocol version 24|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -47724,7 +51251,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -47735,7 +51262,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 23|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -47747,7 +51274,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 23|path payment send currency invalid" : + "pathpayment|protocol version 24|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47755,7 +51282,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment send max 0" : + "pathpayment|protocol version 24|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47763,7 +51290,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment send max negative" : + "pathpayment|protocol version 24|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -47771,7 +51298,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 23|path payment source does not have trustline" : + "pathpayment|protocol version 24|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -47779,7 +51306,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 23|path payment source is not authorized" : + "pathpayment|protocol version 24|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -47794,9 +51321,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 23|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 23|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 24|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 24|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47816,7 +51343,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 23|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47846,7 +51373,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 23|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 24|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47870,7 +51397,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47890,7 +51417,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 23|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -47920,10 +51447,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 23|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 23|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 23|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 23|path payment with cycle" : + "pathpayment|protocol version 24|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 24|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 24|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 24|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -48151,7 +51678,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -48163,7 +51690,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -48175,13 +51702,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage" : + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -48193,10 +51720,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 23|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 23|path payment with rounding errors" : + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 24|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -48208,7 +51735,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 23|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 24|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -48219,7 +51746,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -48238,7 +51765,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -48247,7 +51774,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 23|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -48256,7 +51783,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 24" : + "pathpayment|protocol version 25" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -48553,7 +52080,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48586,7 +52113,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48619,7 +52146,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 24|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48652,7 +52179,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48681,7 +52208,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48710,7 +52237,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 24|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 25|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -48739,7 +52266,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 24|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 25|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -48747,12 +52274,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -48893,13 +52420,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49040,13 +52567,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49187,13 +52714,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49334,13 +52861,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49481,13 +53008,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49628,13 +53155,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49775,13 +53302,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -49922,13 +53449,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -50069,15 +53596,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 24|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 24|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 24|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 24|issuer missing" : + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 25|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 25|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 25|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50095,10 +53622,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 24|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 24|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 24|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 25|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 25|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 25|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 25|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -50114,7 +53641,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 24|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 25|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -50131,7 +53658,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50159,7 +53686,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50187,7 +53714,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50215,7 +53742,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50243,7 +53770,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50271,7 +53798,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50299,8 +53826,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 24|path payment asset with not enough funds" : + "pathpayment|protocol version 25|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 25|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -50310,7 +53837,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50333,7 +53860,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50355,7 +53882,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 24|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 25|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -50378,7 +53905,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 24|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -50400,7 +53927,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 24|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50423,7 +53950,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 24|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 25|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50446,7 +53973,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 24|path payment destination amount 0" : + "pathpayment|protocol version 25|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50454,7 +53981,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination amount negative" : + "pathpayment|protocol version 25|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50462,7 +53989,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination currency invalid" : + "pathpayment|protocol version 25|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50470,8 +53997,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 24|path payment destination does not have trustline" : + "pathpayment|protocol version 25|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 25|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -50480,7 +54007,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 25|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -50488,7 +54015,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 24|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 25|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -50496,7 +54023,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 24|path payment destination is not authorized" : + "pathpayment|protocol version 25|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -50511,9 +54038,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 24|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 24|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 24|path payment destination line full" : + "pathpayment|protocol version 25|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 25|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 25|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50524,7 +54051,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 24|path payment destination line overflow" : + "pathpayment|protocol version 25|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50535,7 +54062,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 24|path payment destination path currency invalid" : + "pathpayment|protocol version 25|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -50543,7 +54070,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -50570,7 +54097,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50598,7 +54125,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 24|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 25|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50626,7 +54153,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50655,7 +54182,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50684,7 +54211,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50713,7 +54240,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50742,7 +54269,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50771,7 +54298,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 24|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50800,7 +54327,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50853,9 +54380,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50908,9 +54435,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -50963,9 +54490,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment not enough offers for first exchange" : + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 25|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -50989,7 +54516,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment not enough offers for last exchange" : + "pathpayment|protocol version 25|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -51013,7 +54540,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 25|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -51037,8 +54564,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 24|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 24|path payment over send max asset" : + "pathpayment|protocol version 25|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 25|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -51047,7 +54574,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 24|path payment over send max with real path" : + "pathpayment|protocol version 25|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51071,7 +54598,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51100,7 +54627,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51129,7 +54656,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 24|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 25|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51158,7 +54685,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 24|path payment rounding" : + "pathpayment|protocol version 25|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -51167,7 +54694,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -51178,7 +54705,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 24|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -51190,7 +54717,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 24|path payment send currency invalid" : + "pathpayment|protocol version 25|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51198,7 +54725,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment send max 0" : + "pathpayment|protocol version 25|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51206,7 +54733,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment send max negative" : + "pathpayment|protocol version 25|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -51214,7 +54741,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 24|path payment source does not have trustline" : + "pathpayment|protocol version 25|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -51222,7 +54749,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 24|path payment source is not authorized" : + "pathpayment|protocol version 25|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -51237,9 +54764,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 24|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 24|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 25|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 25|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51259,7 +54786,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 24|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51289,7 +54816,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 24|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 25|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51313,7 +54840,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51333,7 +54860,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 24|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -51363,10 +54890,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 24|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 24|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 24|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 24|path payment with cycle" : + "pathpayment|protocol version 25|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 25|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 25|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 25|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -51594,7 +55121,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -51606,7 +55133,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -51618,13 +55145,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage" : + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -51636,10 +55163,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 24|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 24|path payment with rounding errors" : + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 25|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -51651,7 +55178,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 24|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 25|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -51662,7 +55189,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -51681,7 +55208,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -51690,7 +55217,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 24|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -51699,7 +55226,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 25" : + "pathpayment|protocol version 26" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -51996,7 +55523,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52029,7 +55556,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52062,7 +55589,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 25|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52095,7 +55622,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52124,7 +55651,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52153,7 +55680,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 25|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 26|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -52182,7 +55709,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 25|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 26|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -52190,12 +55717,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52336,13 +55863,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52483,13 +56010,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52630,13 +56157,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52777,13 +56304,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -52924,13 +56451,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53071,13 +56598,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53218,13 +56745,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53365,13 +56892,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -53512,15 +57039,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 25|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 25|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 25|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 25|issuer missing" : + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 26|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 26|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 26|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53538,10 +57065,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 25|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 25|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 25|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 26|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 26|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 26|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 26|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -53557,7 +57084,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 25|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 26|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -53574,7 +57101,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53602,7 +57129,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53630,7 +57157,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53658,7 +57185,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53686,7 +57213,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53714,7 +57241,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53742,8 +57269,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 25|path payment asset with not enough funds" : + "pathpayment|protocol version 26|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 26|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -53753,7 +57280,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53776,7 +57303,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53798,7 +57325,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 25|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 26|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -53821,7 +57348,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 25|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -53843,7 +57370,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 25|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53866,7 +57393,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 25|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 26|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -53889,7 +57416,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 25|path payment destination amount 0" : + "pathpayment|protocol version 26|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53897,7 +57424,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination amount negative" : + "pathpayment|protocol version 26|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53905,7 +57432,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination currency invalid" : + "pathpayment|protocol version 26|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53913,8 +57440,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 25|path payment destination does not have trustline" : + "pathpayment|protocol version 26|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 26|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -53923,7 +57450,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 26|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -53931,7 +57458,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 25|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 26|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -53939,7 +57466,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 25|path payment destination is not authorized" : + "pathpayment|protocol version 26|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -53954,9 +57481,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 25|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 25|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 25|path payment destination line full" : + "pathpayment|protocol version 26|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 26|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 26|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53967,7 +57494,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 25|path payment destination line overflow" : + "pathpayment|protocol version 26|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -53978,7 +57505,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 25|path payment destination path currency invalid" : + "pathpayment|protocol version 26|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -53986,7 +57513,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -54013,7 +57540,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54041,7 +57568,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 25|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 26|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54069,7 +57596,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54098,7 +57625,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54127,7 +57654,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54156,7 +57683,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54185,7 +57712,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54214,7 +57741,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 25|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54243,7 +57770,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54296,9 +57823,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54351,9 +57878,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54406,9 +57933,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment not enough offers for first exchange" : + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 26|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54432,7 +57959,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment not enough offers for last exchange" : + "pathpayment|protocol version 26|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54456,7 +57983,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 26|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54480,8 +58007,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 25|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 25|path payment over send max asset" : + "pathpayment|protocol version 26|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 26|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -54490,7 +58017,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 25|path payment over send max with real path" : + "pathpayment|protocol version 26|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54514,7 +58041,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54543,7 +58070,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54572,7 +58099,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 25|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 26|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54601,7 +58128,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 25|path payment rounding" : + "pathpayment|protocol version 26|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -54610,7 +58137,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -54621,7 +58148,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 25|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -54633,7 +58160,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 25|path payment send currency invalid" : + "pathpayment|protocol version 26|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54641,7 +58168,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment send max 0" : + "pathpayment|protocol version 26|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54649,7 +58176,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment send max negative" : + "pathpayment|protocol version 26|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -54657,7 +58184,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 25|path payment source does not have trustline" : + "pathpayment|protocol version 26|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -54665,7 +58192,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 25|path payment source is not authorized" : + "pathpayment|protocol version 26|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -54680,9 +58207,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 25|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 25|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 26|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 26|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54702,7 +58229,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 25|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54732,7 +58259,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 25|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 26|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54756,7 +58283,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54776,7 +58303,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 25|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -54806,10 +58333,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 25|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 25|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 25|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 25|path payment with cycle" : + "pathpayment|protocol version 26|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 26|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 26|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 26|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -55037,7 +58564,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -55049,7 +58576,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -55061,13 +58588,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage" : + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -55079,10 +58606,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 25|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 25|path payment with rounding errors" : + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 26|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -55094,7 +58621,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 25|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 26|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -55105,7 +58632,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -55124,7 +58651,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -55133,7 +58660,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 25|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", @@ -55142,7 +58669,7 @@ "0xu9qM5H9OE=", "D49JXrZm99c=" ], - "pathpayment|protocol version 26" : + "pathpayment|protocol version 27" : [ "FoRcm9E0hVg=", "Nx/RMV1UcHg=", @@ -55439,7 +58966,7 @@ "FoRcm9E0hVg=", "Nx/RMV1UcHg=" ], - "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 27|authorized to maintain liabilities|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55472,7 +58999,7 @@ "XU8W/j21sRg=", "c8ws/vjWMV4=" ], - "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 27|authorized to maintain liabilities|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55505,7 +59032,7 @@ "DwLmc41DrZ4=", "7ihkpYi9Ht4=" ], - "pathpayment|protocol version 26|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 27|authorized to maintain liabilities|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55538,7 +59065,7 @@ "gRfBVI6+TYs=", "G2N6OlTf81g=" ], - "pathpayment|protocol version 26|authorized|path payment uses whole best offer for first exchange" : + "pathpayment|protocol version 27|authorized|path payment uses whole best offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55567,7 +59094,7 @@ "Na43vaX6XIY=", "pa2DQqS4bwU=" ], - "pathpayment|protocol version 26|authorized|path payment uses whole best offer for last exchange" : + "pathpayment|protocol version 27|authorized|path payment uses whole best offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55596,7 +59123,7 @@ "ib3O7WVfZIM=", "j81qhaFS5ss=" ], - "pathpayment|protocol version 26|authorized|path payment uses whole best offer for second exchange" : + "pathpayment|protocol version 27|authorized|path payment uses whole best offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -55625,7 +59152,7 @@ "Na43vaX6XIY=", "7RAttFPon9g=" ], - "pathpayment|protocol version 26|crossed offers release sponsorships allowing payment to succeed for source" : + "pathpayment|protocol version 27|crossed offers release sponsorships allowing payment to succeed for source" : [ "/zcorm87qHQ=", "8dtY9HNqTlc=", @@ -55633,12 +59160,12 @@ "olo/Vu1jSK0=", "OStx/5DtX2A=", "2XR9oqinR1k=", - "exPsJ/nFdcM=", - "V5Ecy07h+S8=", - "19mr4XOs5j0=", - "Fy27tvxI3Iw=" + "S/wRpu+DOOA=", + "nE4ii/73AnI=", + "je06Pm0eN3s=", + "FnZLjlEiiAM=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -55779,13 +59306,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "8wth0MclrJ0=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "hnossOMZe7E=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "IiztNwDjXts=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "tv67OLyOjsg=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "fcE1qY3mrgQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v1T14rEdF98=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully" : [ "WckGolveI8o=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer fully and one partially" : [ "NjIuzIFiEZ0=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross one offer partially" : [ "0lH927w2grM=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross three offers fully" : [ "H3K5dIIk1rU=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully" : [ "WEyxyz9+2SM=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|native for non-native|cross two offers fully and one partially" : [ "v+lZIhQMbQA=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -55926,13 +59453,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "KVmsIydv+WU=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "owBcHANMQsk=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "k+2nlWgVzVI=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "sVm+9s7u468=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "fyovqlu2SLA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "JE0QdTEJbRk=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully" : [ "XzO4r5Bu860=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer fully and one partially" : [ "JXChC62FS58=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross one offer partially" : [ "BJhuGj/zSoo=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross three offers fully" : [ "NEbvBA72KNQ=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully" : [ "PUmYg2xDJ7Q=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for native|cross two offers fully and one partially" : [ "AzvLzuaeOvU=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56073,13 +59600,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "HM0YK8/qGV8=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "z2fMLm3Rr6g=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "pOTuXjxwjL0=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "yHufmKpdEDA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "MOTju3FGCxc=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "kkI78wgWtVw=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully" : [ "9tn4v84dlxE=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer fully and one partially" : [ "5sxas1MxPns=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross one offer partially" : [ "m6DPK626ThQ=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross three offers fully" : [ "NOzDKFS0AQo=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully" : [ "kEaktWobMeA=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is other offer account|non-native for non-native|cross two offers fully and one partially" : [ "4+n6Lqd+2V0=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56220,13 +59747,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "cNMfT5ei4tk=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tV9xtUD3wOI=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "TYhXJOBaULQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "rZRdsLhzrmM=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "QFALFOJR+4o=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "uzYXSNESapI=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully" : [ "eJmAu3ket6U=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer fully and one partially" : [ "tjAcOGFabFs=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross one offer partially" : [ "zSXjwnMTEV8=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross three offers fully" : [ "o/ESMuGNDDE=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully" : [ "1dxl71BqaFQ=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, native for non-native|cross two offers fully and one partially" : [ "WyED6+mFlAw=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56367,13 +59894,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "0TlzH8pqfA0=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "1zrtBHWxHYU=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "3HF9WScNbCU=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "5AwSB+4aiEg=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "NzCosUw2kRg=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "5K1M7MoVh3s=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully" : [ "HUNQNIkY6EU=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer fully and one partially" : [ "bS2O1y4l/Ls=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross one offer partially" : [ "CJEvDOCCcbY=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross three offers fully" : [ "fbYtX6+wGZM=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully" : [ "5d4M2k6jkLg=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for native|cross two offers fully and one partially" : [ "YfLpY3TgRQc=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56514,13 +60041,13 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nq22B2MFf/E=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "DQfsaP8l4VQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "1rA0zeAtvHQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "k9gZzm1PCP4=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "BAPKehCKMAk=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "SSbs5/6G2zA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully" : [ "nGigw6QBX24=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer fully and one partially" : [ "rSzy7MbeQ24=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross one offer partially" : [ "W7yNvJ/oF+I=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross three offers fully" : [ "hkjnoPHQ31I=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully" : [ "klkMvIyF1OU=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|dest, non-native for non-native|cross two offers fully and one partially" : [ "QUvGnPChOwY=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56661,13 +60188,13 @@ "WFApHnVS7hE=", "5T0SosrOIbs=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "uUcWRNX6VMo=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "Ig0R9cws0P0=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "bmKeeW4orKI=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "DEYunVxqA4M=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "8LfXoOG6a2M=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "88Pb7UqL1+A=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully" : [ "IV4iFUtR2B4=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer fully and one partially" : [ "gtWJuqZ6r5Q=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross one offer partially" : [ "91BAA1rdQhA=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross three offers fully" : [ "/As2AtLl9go=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully" : [ "FioZwDWzL+I=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, native for non-native|cross two offers fully and one partially" : [ "L3Y5i/YA+4M=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56808,13 +60335,13 @@ "F41SzZGotsg=", "QeI1wQal0fc=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "hLcSNUBbSb8=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "rAVqBIUVRBw=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "Cwv6ES9uWVY=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "uUSVvXUFzpM=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "8+nIh80EYMA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "GI/0M/AboeQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully" : [ "7IEoaxlLb5w=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer fully and one partially" : [ "LDvWZlZM3AI=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross one offer partially" : [ "7Ijp6ggav8c=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross three offers fully" : [ "6uP7Bsve7yY=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully" : [ "K1D+TOlTQsQ=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for native|cross two offers fully and one partially" : [ "cJFIVaLPric=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native" : [ "VcYiG9y4WsM=", "T6TQDkiEL9I=", @@ -56955,15 +60482,15 @@ "8eKRh+k1Wug=", "+DnE2NEWoa4=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "0GfYw1hm9rw=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "z+hYIaFcxnQ=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "k77zPpapjTA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "jrVKe6Kb7mA=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "JPqgccrtcCY=" ], - "pathpayment|protocol version 26|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "FBryAlP0FCE=" ], - "pathpayment|protocol version 26|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], - "pathpayment|protocol version 26|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], - "pathpayment|protocol version 26|issuer missing" : + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully" : [ "uTLjai4XcQg=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer fully and one partially" : [ "quy2RzxnAuQ=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross one offer partially" : [ "7fJelJ78kXo=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross three offers fully" : [ "s2h1RWZxgP8=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully" : [ "5l26NeOlbJs=" ], + "pathpayment|protocol version 27|crossed sponsored offers|offer sponsor is source or dest account|source, non-native for non-native|cross two offers fully and one partially" : [ "fys/pNAP7iw=" ], + "pathpayment|protocol version 27|dest amount too big for XLM" : [ "GQBa2Nj3AF8=", "95EFmz1GWuM=" ], + "pathpayment|protocol version 27|dest amount too big for asset" : [ "GQBa2Nj3AF8=", "XyHyiroeVFo=", "3taCmHQwj64=", "oiJ/ILtY0d0=" ], + "pathpayment|protocol version 27|issuer missing" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -56981,10 +60508,10 @@ "uHUSG517pL4=", "Ytvp7CGAD7o=" ], - "pathpayment|protocol version 26|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 26|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], - "pathpayment|protocol version 26|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], - "pathpayment|protocol version 26|liabilities|cannot pay balance below selling liabilities" : + "pathpayment|protocol version 27|issuer missing|path payment last issuer missing" : [ "0DNtYe20T/k=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 27|issuer missing|path payment middle issuer missing" : [ "PKQzd8AM3+w=" ], + "pathpayment|protocol version 27|issuer missing|path payment send issuer missing" : [ "yrO9ifAGep0=", "tmSLmoNz1mw=" ], + "pathpayment|protocol version 27|liabilities|cannot pay balance below selling liabilities" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -57000,7 +60527,7 @@ "9BleSWWLEbs=", "JdItP/blvhE=" ], - "pathpayment|protocol version 26|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : + "pathpayment|protocol version 27|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "SDtbjftEI1s=", "N69CP8LhY0g=", @@ -57017,7 +60544,7 @@ "s+C4Hvq10zI=", "nRtt0mTyl68=" ], - "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 27|path payment 1 in trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57045,7 +60572,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 27|path payment 1 in trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57073,7 +60600,7 @@ "ulHyT4b2SBU=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 26|path payment 1 in trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 27|path payment 1 in trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57101,7 +60628,7 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 27|path payment 1 left in trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57129,7 +60656,7 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 27|path payment 1 left in trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57157,7 +60684,7 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 26|path payment 1 left in trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 27|path payment 1 left in trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57185,8 +60712,8 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], - "pathpayment|protocol version 26|path payment asset with not enough funds" : + "pathpayment|protocol version 27|path payment XLM with not enough funds" : [ "l9Q1zuQlTLI=", "7id/DhQ4O3k=" ], + "pathpayment|protocol version 27|path payment asset with not enough funds" : [ "5nC6xsgmxLs=", "Pazy8CJDr+A=", @@ -57196,7 +60723,7 @@ "kpKqsIKNDMM=", "oHB6DhbBacU=" ], - "pathpayment|protocol version 26|path payment crosses destination offer for first exchange" : + "pathpayment|protocol version 27|path payment crosses destination offer for first exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -57219,7 +60746,7 @@ "eM6EfdRtAxQ=", "lXDT7LiGnEA=" ], - "pathpayment|protocol version 26|path payment crosses destination offer for last exchange" : + "pathpayment|protocol version 27|path payment crosses destination offer for last exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -57241,7 +60768,7 @@ "QF9yUfxuR1E=", "j07bC7ehxMM=" ], - "pathpayment|protocol version 26|path payment crosses destination offer for middle exchange" : + "pathpayment|protocol version 27|path payment crosses destination offer for middle exchange" : [ "84dB2CkjYMM=", "YCxyeiUksg4=", @@ -57264,7 +60791,7 @@ "eM6EfdRtAxQ=", "qV2c+/ls7xQ=" ], - "pathpayment|protocol version 26|path payment crosses own offer for first exchange" : + "pathpayment|protocol version 27|path payment crosses own offer for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -57286,7 +60813,7 @@ "TZgoqjbP/mg=", "zdv2cP5T1F8=" ], - "pathpayment|protocol version 26|path payment crosses own offer for last exchange" : + "pathpayment|protocol version 27|path payment crosses own offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57309,7 +60836,7 @@ "vPnvVFdjuzU=", "4R+Ytq7eRYk=" ], - "pathpayment|protocol version 26|path payment crosses own offer for middle exchange" : + "pathpayment|protocol version 27|path payment crosses own offer for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57332,7 +60859,7 @@ "HpH1buzQvSA=", "lAHs/LaSaT8=" ], - "pathpayment|protocol version 26|path payment destination amount 0" : + "pathpayment|protocol version 27|path payment destination amount 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -57340,7 +60867,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment destination amount negative" : + "pathpayment|protocol version 27|path payment destination amount negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -57348,7 +60875,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment destination currency invalid" : + "pathpayment|protocol version 27|path payment destination currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -57356,8 +60883,8 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], - "pathpayment|protocol version 26|path payment destination does not have trustline" : + "pathpayment|protocol version 27|path payment destination does not exists" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", "7bnR/v25q6s=", "Ndf9JTDMTJo=" ], + "pathpayment|protocol version 27|path payment destination does not have trustline" : [ "84dB2CkjYMM=", "FG3IhmTARzU=", @@ -57366,7 +60893,7 @@ "eCrqSgEANyk=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 26|path payment destination is issuer and does not exists for complex paths" : + "pathpayment|protocol version 27|path payment destination is issuer and does not exists for complex paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -57374,7 +60901,7 @@ "Wg+fgElw2FQ=", "d7qzlts02Go=" ], - "pathpayment|protocol version 26|path payment destination is issuer and does not exists for simple paths" : + "pathpayment|protocol version 27|path payment destination is issuer and does not exists for simple paths" : [ "84dB2CkjYMM=", "xJSnVFa38aM=", @@ -57382,7 +60909,7 @@ "Wg+fgElw2FQ=", "Vyqf60paCOQ=" ], - "pathpayment|protocol version 26|path payment destination is not authorized" : + "pathpayment|protocol version 27|path payment destination is not authorized" : [ "84dB2CkjYMM=", "seAkOSbJ9bg=", @@ -57397,9 +60924,9 @@ "0kY0b30fQuM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 26|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 26|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], - "pathpayment|protocol version 26|path payment destination line full" : + "pathpayment|protocol version 27|path payment destination is not authorized|allow maintain liabilities" : [ "WHRDsdS78S0=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 27|path payment destination is not authorized|deny trust" : [ "Sok+pohafK8=", "lOOfMoptux0=", "WoAheSPym9g=" ], + "pathpayment|protocol version 27|path payment destination line full" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57410,7 +60937,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 26|path payment destination line overflow" : + "pathpayment|protocol version 27|path payment destination line overflow" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57421,7 +60948,7 @@ "oUB9G6vyaKk=", "UQFJuq1KcUo=" ], - "pathpayment|protocol version 26|path payment destination path currency invalid" : + "pathpayment|protocol version 27|path payment destination path currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -57429,7 +60956,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment does not cross own offer if better is available for first exchange" : + "pathpayment|protocol version 27|path payment does not cross own offer if better is available for first exchange" : [ "5c6UBHiI+wk=", "kaTyzoqxCVo=", @@ -57456,7 +60983,7 @@ "K7kmfza4PoY=", "vDQe3tVDJF0=" ], - "pathpayment|protocol version 26|path payment does not cross own offer if better is available for last exchange" : + "pathpayment|protocol version 27|path payment does not cross own offer if better is available for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57484,7 +61011,7 @@ "+y+avhcnp2Q=", "WLCzeX9QUTs=" ], - "pathpayment|protocol version 26|path payment does not cross own offer if better is available for middle exchange" : + "pathpayment|protocol version 27|path payment does not cross own offer if better is available for middle exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57512,7 +61039,7 @@ "w+wcVmI1duA=", "l3moHflzmvk=" ], - "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for first exchange" : + "pathpayment|protocol version 27|path payment empty trust line for selling asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57541,7 +61068,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for last exchange" : + "pathpayment|protocol version 27|path payment empty trust line for selling asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57570,7 +61097,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 26|path payment empty trust line for selling asset for offer for second exchange" : + "pathpayment|protocol version 27|path payment empty trust line for selling asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57599,7 +61126,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for first exchange" : + "pathpayment|protocol version 27|path payment full trust line for buying asset for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57628,7 +61155,7 @@ "Na43vaX6XIY=", "k8mDHsdDtFk=" ], - "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for last exchange" : + "pathpayment|protocol version 27|path payment full trust line for buying asset for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57657,7 +61184,7 @@ "ib3O7WVfZIM=", "lwUoYf4lvKg=" ], - "pathpayment|protocol version 26|path payment full trust line for buying asset for offer for second exchange" : + "pathpayment|protocol version 27|path payment full trust line for buying asset for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57686,7 +61213,7 @@ "Na43vaX6XIY=", "vidJs2P/+V4=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange" : + "pathpayment|protocol version 27|path payment missing trust line for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57739,9 +61266,9 @@ "dWAGy249LC8=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange" : + "pathpayment|protocol version 27|path payment missing trust line for offer for first exchange|missing buying line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 27|path payment missing trust line for offer for first exchange|missing selling line" : [ "QdukIQmH1jY=" ], + "pathpayment|protocol version 27|path payment missing trust line for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57794,9 +61321,9 @@ "ozVr4RmmCTQ=", "ib3O7WVfZIM=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange" : + "pathpayment|protocol version 27|path payment missing trust line for offer for last exchange|missing buying line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 27|path payment missing trust line for offer for last exchange|missing selling line" : [ "JDiWIwO+zP4=" ], + "pathpayment|protocol version 27|path payment missing trust line for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57849,9 +61376,9 @@ "bUjwxuDTKYA=", "Na43vaX6XIY=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 26|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 26|path payment not enough offers for first exchange" : + "pathpayment|protocol version 27|path payment missing trust line for offer for second exchange|missing buying line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 27|path payment missing trust line for offer for second exchange|missing selling line" : [ "wu+z/Bm5lK4=" ], + "pathpayment|protocol version 27|path payment not enough offers for first exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57875,7 +61402,7 @@ "t0W/GzdUKUU=", "hMieieeAoGg=" ], - "pathpayment|protocol version 26|path payment not enough offers for last exchange" : + "pathpayment|protocol version 27|path payment not enough offers for last exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57899,7 +61426,7 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 26|path payment not enough offers for middle exchange" : + "pathpayment|protocol version 27|path payment not enough offers for middle exchange" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57923,8 +61450,8 @@ "C3pGWc84i3E=", "hMieieeAoGg=" ], - "pathpayment|protocol version 26|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], - "pathpayment|protocol version 26|path payment over send max asset" : + "pathpayment|protocol version 27|path payment over send max XLM" : [ "sR8SDOAmgK8=", "AlAXuJoPQqY=", "jqDTZZ/yqZQ=" ], + "pathpayment|protocol version 27|path payment over send max asset" : [ "84dB2CkjYMM=", "Pazy8CJDr+A=", @@ -57933,7 +61460,7 @@ "JajBi4B9QYo=", "PKQzd8AM3+w=" ], - "pathpayment|protocol version 26|path payment over send max with real path" : + "pathpayment|protocol version 27|path payment over send max with real path" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57957,7 +61484,7 @@ "1ilChofvrNA=", "QqdQAouaiYQ=" ], - "pathpayment|protocol version 26|path payment reaches limit for offer for first exchange" : + "pathpayment|protocol version 27|path payment reaches limit for offer for first exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -57986,7 +61513,7 @@ "Na43vaX6XIY=", "QdukIQmH1jY=" ], - "pathpayment|protocol version 26|path payment reaches limit for offer for last exchange" : + "pathpayment|protocol version 27|path payment reaches limit for offer for last exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58015,7 +61542,7 @@ "ib3O7WVfZIM=", "JDiWIwO+zP4=" ], - "pathpayment|protocol version 26|path payment reaches limit for offer for second exchange" : + "pathpayment|protocol version 27|path payment reaches limit for offer for second exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58044,7 +61571,7 @@ "Na43vaX6XIY=", "wu+z/Bm5lK4=" ], - "pathpayment|protocol version 26|path payment rounding" : + "pathpayment|protocol version 27|path payment rounding" : [ "84dB2CkjYMM=", "l/kHyURS/+M=", @@ -58053,7 +61580,7 @@ "l/kHyURS/+M=", "5ZlFxJBFyFA=" ], - "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : + "pathpayment|protocol version 27|path payment rounding|exchangeV10 recalculate sheepValue: 1 offer" : [ "+b87FRsGcjk=", "B62pF6s6HKU=", @@ -58064,7 +61591,7 @@ "XZYDIIGqDC4=", "LT0l0KObt6I=" ], - "pathpayment|protocol version 26|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : + "pathpayment|protocol version 27|path payment rounding|exchangeV10 recalculate sheepValue: 2 offers" : [ "73A0UNKWLKo=", "7j9cSBVYs4U=", @@ -58076,7 +61603,7 @@ "RP+CXGlIDMQ=", "tpaGwWKft3Q=" ], - "pathpayment|protocol version 26|path payment send currency invalid" : + "pathpayment|protocol version 27|path payment send currency invalid" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -58084,7 +61611,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment send max 0" : + "pathpayment|protocol version 27|path payment send max 0" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -58092,7 +61619,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment send max negative" : + "pathpayment|protocol version 27|path payment send max negative" : [ "84dB2CkjYMM=", "FPBRed6XlTI=", @@ -58100,7 +61627,7 @@ "NvPpapviECA=", "wRCHIbN/oaI=" ], - "pathpayment|protocol version 26|path payment source does not have trustline" : + "pathpayment|protocol version 27|path payment source does not have trustline" : [ "/EmyOnCtLmA=", "c1gCoedj8uQ=", @@ -58108,7 +61635,7 @@ "OqDuU0KyT7o=", "wGJirSRxKX8=" ], - "pathpayment|protocol version 26|path payment source is not authorized" : + "pathpayment|protocol version 27|path payment source is not authorized" : [ "zPS+2W6schE=", "Pazy8CJDr+A=", @@ -58123,9 +61650,9 @@ "bZ3gPtw91cM=", "QIzPbnwaNIk=" ], - "pathpayment|protocol version 26|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 26|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], - "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange" : + "pathpayment|protocol version 27|path payment source is not authorized|allow maintain liabilities" : [ "910TEFBHa6o=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 27|path payment source is not authorized|deny trust" : [ "0yDQYmZ0uAE=", "wVY49x+3UuQ=", "0ALYHmpB0zs=" ], + "pathpayment|protocol version 27|path payment takes all offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58145,7 +61672,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 26|path payment takes all offers, multiple offers per exchange V10" : + "pathpayment|protocol version 27|path payment takes all offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58175,7 +61702,7 @@ "LThcgZ1yLp8=", "YELQlc6wi88=" ], - "pathpayment|protocol version 26|path payment takes all offers, one offer per exchange" : + "pathpayment|protocol version 27|path payment takes all offers, one offer per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58199,7 +61726,7 @@ "1ilChofvrNA=", "r/vKK+R+E9I=" ], - "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange" : + "pathpayment|protocol version 27|path payment takes best offers, multiple offers per exchange" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58219,7 +61746,7 @@ "pVDK6uoLmbc=", "fDEHOy8/1A4=" ], - "pathpayment|protocol version 26|path payment takes best offers, multiple offers per exchange V10" : + "pathpayment|protocol version 27|path payment takes best offers, multiple offers per exchange V10" : [ "LWjx9i6CNpU=", "xuKoj+hSPkw=", @@ -58249,10 +61776,10 @@ "LThcgZ1yLp8=", "86cuf/GS4O0=" ], - "pathpayment|protocol version 26|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], - "pathpayment|protocol version 26|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], - "pathpayment|protocol version 26|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], - "pathpayment|protocol version 26|path payment with cycle" : + "pathpayment|protocol version 27|path payment to self XLM" : [ "8I0naIdoaTU=", "vML1HXsCJXw=" ], + "pathpayment|protocol version 27|path payment to self asset" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "YkFwkWqim3k=", "DqrlbAjN26s=" ], + "pathpayment|protocol version 27|path payment to self asset over the limit" : [ "xn/eAjai8lc=", "cBhXR5oegM0=", "S4fFiyEefvE=", "nJfFVdhLvQQ=" ], + "pathpayment|protocol version 27|path payment with cycle" : [ "JYHFotZe0+U=", "N1g7eei+n5c=", @@ -58480,7 +62007,7 @@ "n6eVjEMVsNg=", "HyzF/1NelYw=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage" : + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -58492,7 +62019,7 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax" : + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage with big sendmax" : [ "1ZOgoaqGpjQ=", "q16uoSCziIA=", @@ -58504,13 +62031,13 @@ "q16uoSCziIA=", "jps0yhLPa+A=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 26|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], - "pathpayment|protocol version 26|path payment with cycle|arbitrage" : + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage with big sendmax|send with path (IDR -> USD -> XLM -> IDR)" : [ "wPxZT5GjkV4=" ], + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage with big sendmax|send with path (USD -> XLM -> IDR -> USD)" : [ "O7KNpClCRKM=" ], + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage with big sendmax|send with path (XLM -> IDR -> USD -> XLM)" : [ "vG310GlC1d8=" ], + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 27|path payment with cycle|anti-arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "/gmus8PMK20=" ], + "pathpayment|protocol version 27|path payment with cycle|arbitrage" : [ "J+JvuyL47Yo=", "RuMySzr96po=", @@ -58522,10 +62049,10 @@ "RuMySzr96po=", "BLAuQHYo3oo=" ], - "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], - "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], - "pathpayment|protocol version 26|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], - "pathpayment|protocol version 26|path payment with rounding errors" : + "pathpayment|protocol version 27|path payment with cycle|arbitrage|send with path (IDR -> USD -> XLM -> IDR)" : [ "NTRK7SJVMqo=" ], + "pathpayment|protocol version 27|path payment with cycle|arbitrage|send with path (USD -> XLM -> IDR -> USD)" : [ "btInwtSHEQo=" ], + "pathpayment|protocol version 27|path payment with cycle|arbitrage|send with path (XLM -> IDR -> USD -> XLM)" : [ "BhZrvh7XdR8=" ], + "pathpayment|protocol version 27|path payment with rounding errors" : [ "pjSG6TKYsG8=", "gFz8o0HBkqg=", @@ -58537,7 +62064,7 @@ "ie6GldQ1XEs=", "7Hut65U4jf4=" ], - "pathpayment|protocol version 26|path with bogus offer, bogus offer shows on offers trail" : + "pathpayment|protocol version 27|path with bogus offer, bogus offer shows on offers trail" : [ "wcgpbmaVjBA=", "yuIxOHPBaBQ=", @@ -58548,7 +62075,7 @@ "v1B8VCiHaW4=", "U+Qp6/NERxc=" ], - "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment" : + "pathpayment|protocol version 27|transact more than INT64_MAX in a path payment" : [ "GMFz9Wcm7H4=", "EdmTGwx/oHw=", @@ -58567,7 +62094,7 @@ "qSH7D3AVmZc=", "kGyhvJYqEGQ=" ], - "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : + "pathpayment|protocol version 27|transact more than INT64_MAX in a path payment|burn more than INT64_MAX" : [ "SDA54a1FCn8=", "fx8/uj8pMZU=", @@ -58576,7 +62103,7 @@ "JQJDHlGGuKw=", "LXrcsR8fhTA=" ], - "pathpayment|protocol version 26|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : + "pathpayment|protocol version 27|transact more than INT64_MAX in a path payment|issue more than INT64_MAX" : [ "sko66XB6VKM=", "cGePF4sBpUc=", diff --git a/test-tx-meta-baseline-next/PaymentTests.json b/test-tx-meta-baseline-next/PaymentTests.json index 456c1fed7a..918268a100 100644 --- a/test-tx-meta-baseline-next/PaymentTests.json +++ b/test-tx-meta-baseline-next/PaymentTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "payment fees|protocol version 0|fee bigger than base reserve|account has only base reserve + amount" : [ "Jpus0ofxyBI=" ], "payment fees|protocol version 0|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "EacgVbI3SOw=" ], @@ -337,6 +338,22 @@ "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees" : [ "JGz2t/DxcLU=", "zRL7G+5gJYk=" ], "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "Jw3Z92xHgg8=", "+WLExRDUCmI=" ], "payment fees|protocol version 26|fee equal to base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "IS0cY9nIFtY=", "wvRy8bfw32g=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount" : [ "q3/zp/7aAb4=", "ZfAoGox8KS8=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "B0rm1LiLOSE=", "oc5Rv5tx4wE=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "p0vDXXn59Z4=", "G5BNtHvQtJg=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "K3swMJqN/uY=", "KoWaqgQHvg8=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + one stroop" : [ "2imvjmW0wCo=", "faNUUcq+/EM=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + two operation fees" : [ "wf9j9yELBTE=", "p62oXeEtjOM=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "oxRlr8uSNE0=", "omoZrk93TvE=" ], + "payment fees|protocol version 27|fee bigger than base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "cuNEnYB0oc4=", "3al9Ctm1pRk=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount" : [ "gzMr0OZxB74=", "BFAFdoRRNIc=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + one operation fee" : [ "OfxKShDWHwE=", "0bKr2ssTJX4=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "57uffV9VFUY=", "iX/T1K4X36s=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "/Nwk+JsAnTw=", "KoWaqgQHvg8=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + one stroop" : [ "eMoL8WNsrJg=", "7kc23Ry2bNI=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + two operation fees" : [ "JGz2t/DxcLU=", "zRL7G+5gJYk=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "Jw3Z92xHgg8=", "+WLExRDUCmI=" ], + "payment fees|protocol version 27|fee equal to base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "IS0cY9nIFtY=", "wvRy8bfw32g=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount" : [ "Jpus0ofxyBI=", "/lfj8xIFS8I=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount + one operation fee" : [ "EacgVbI3SOw=", "/lfj8xIFS8I=" ], "payment fees|protocol version 2|fee bigger than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "bqpp59+loaQ=", "/lfj8xIFS8I=" ], @@ -7546,6 +7563,388 @@ ], "payment|protocol version 26|simple credit|with trust|positive" : [ "bKUZmcBO1tg=", "gtCbVkV9exo=" ], "payment|protocol version 26|two payments, first breaking second" : [ "Ju+ZDykdCWQ=", "epcXI1yMtYk=" ], + "payment|protocol version 27" : + [ + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=", + "9pWSlqLQ1S0=", + "Xa5pFPDfXb8=", + "txaaanX3xi8=" + ], + "payment|protocol version 27|a pays b, then a merge into b" : [ "m1+68QRC2Tg=", "rx5wTRKMRs4=" ], + "payment|protocol version 27|a pays b, then b merge into a" : [ "m1+68QRC2Tg=", "oOnZBnE+60I=" ], + "payment|protocol version 27|authorize flag|allow trust" : + [ + "c9mvhBOUNvE=", + "WLjKq0CmxbU=", + "n2GJOUS40Vo=", + "B6S4xT9Nlvs=", + "vRXPUeXYwvc=", + "sBe9V81VQmw=", + "l1Ablm4+l6o=", + "Ox5hBpc9UJ8=", + "F4T5iMC/6oo=" + ], + "payment|protocol version 27|authorize flag|set trustline flags" : + [ + "c9mvhBOUNvE=", + "WLjKq0CmxbU=", + "n2GJOUS40Vo=", + "B6S4xT9Nlvs=", + "vRXPUeXYwvc=", + "sBe9V81VQmw=", + "l1Ablm4+l6o=", + "Ox5hBpc9UJ8=", + "F4T5iMC/6oo=" + ], + "payment|protocol version 27|create, merge, pay, 2 accounts" : [ "naV4nl/MgIc=", "DWIqWV2n2xY=" ], + "payment|protocol version 27|create, merge, pay, 3 accounts" : [ "naV4nl/MgIc=", "1PPnexnF9sE=" ], + "payment|protocol version 27|create, path payment, merge, create" : [ "naV4nl/MgIc=", "/oQD4VU6Ohk=", "deC1xmX9MLY=", "LbAOafWeECE=" ], + "payment|protocol version 27|dest amount too big for native asset" : [ "95EFmz1GWuM=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount" : [ "raRiau4GtC8=", "dt73AIBswNY=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + one operation fee" : [ "n8tkNypnaMg=", "iUH3ksLBVmo=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + one operation fee + one stroop" : [ "t1eeSmveoRg=", "sC9CkUiuy8Y=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + one operation fee - one stroop" : [ "FNViLerTe3g=", "OKyxJn9aXzA=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + one stroop" : [ "40feS1pePg4=", "PSpURk5ot0w=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + two operation fees" : [ "NeCSUQw6zNc=", "NhBodSWwcBw=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + two operation fees - one stroop" : [ "cDTfAe8jeFc=", "pXkjHv7ikZU=" ], + "payment|protocol version 27|fee less than base reserve|account has only base reserve + amount + two operation fees - two stroops" : [ "v3B4nYITC8o=", "HvQKxTSh6/k=" ], + "payment|protocol version 27|issuer large amounts" : [ "qt90FYP+Ga4=", "0D6Ykz8nEjE=", "qoU8AcAeK88=" ], + "payment|protocol version 27|liabilities|cannot pay balance below selling liabilities" : + [ + "JstZFvMduYU=", + "qceRple+m8c=", + "fSh0o2YIofo=", + "WLMAn11AhMI=", + "T2t/Mu59EHw=" + ], + "payment|protocol version 27|liabilities|cannot receive such that balance + buying liabilities exceeds limit" : [ "ou8rkQWJVnc=", "oF3yDi4fV8o=", "WmglBV4ZVCk=", "5gE6LJnF0h8=" ], + "payment|protocol version 27|merge then send" : [ "Z4buC823qiw=", "VmO2z+TEXAA=" ], + "payment|protocol version 27|pay self multiple, merge, pay self multiple, merge" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "5RNsiKELy84=" ], + "payment|protocol version 27|pay self, merge, pay self, merge" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "8bwhpO8KSVM=" ], + "payment|protocol version 27|pay, merge, create, pay, 2 accounts" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "+ZYG+GYTQDY=" ], + "payment|protocol version 27|pay, merge, create, pay, 3 accounts" : [ "naV4nl/MgIc=", "WLFQpNHVL+E=", "0J0xIMgdNxQ=", "m19BeodhWIA=" ], + "payment|protocol version 27|pay, merge, create, pay, self" : [ "naV4nl/MgIc=", "WiK7kvxjyAw=", "r6Q2hqplZ+g=" ], + "payment|protocol version 27|rescue account (was below reserve)" : [ "aWxrB7B6fkY=", "mGNtvLIASQM=", "/fEYrEFMlTM=", "+q7qLxOucFQ=" ], + "payment|protocol version 27|send XLM to a new account (no destination)" : [ "95EFmz1GWuM=" ], + "payment|protocol version 27|send XLM to an existing account" : [ "LGfPJYRTA1Y=" ], + "payment|protocol version 27|send to self" : + [ + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "5CgRkyXWRcA=", + "/12TcinSyRs=", + "isaFxIN1Xgs=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=", + "l5CTfxmeetU=", + "6L7bqvbhhow=", + "tOmja1N+sfg=", + "Ku8uvl5/x6g=" + ], + "payment|protocol version 27|send to self|existing asset|with trustline and 0 balance|all" : [ "2T73pqf9GWA=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and 0 balance|few" : [ "2T73pqf9GWA=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and 0 balance|more than have" : [ "isaFxIN1Xgs=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and full balance" : [ "l275dHlYCCE=", "l275dHlYCCE=", "l275dHlYCCE=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and full balance|all" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and full balance|few" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and full balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and half balance" : [ "H//xSF3xQFA=", "H//xSF3xQFA=", "H//xSF3xQFA=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and half balance|few" : [ "R9nGr2KiyiY=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and half balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|existing asset|with trustline and half balance|to full" : [ "R9nGr2KiyiY=" ], + "payment|protocol version 27|send to self|existing asset|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 27|send to self|native|all" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 27|send to self|native|few" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 27|send to self|native|more than have" : [ "+b/xYnFSYeY=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and 0 balance|all" : [ "VpNOmJNnQT8=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and 0 balance|few" : [ "VpNOmJNnQT8=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and 0 balance|more than have" : [ "isaFxIN1Xgs=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and full balance" : [ "YKWKdH0Wdk4=", "YKWKdH0Wdk4=", "YKWKdH0Wdk4=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and full balance|all" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and full balance|few" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and full balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and half balance" : [ "Ou5LEV8yKfE=", "Ou5LEV8yKfE=", "Ou5LEV8yKfE=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and half balance|few" : [ "ZIsSzUSVUsc=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and half balance|more than have" : [ "qZyDJXgaSZ0=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|with trustline and half balance|to full" : [ "ZIsSzUSVUsc=" ], + "payment|protocol version 27|send to self|non existing asset with existing issuer|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 27|send to self|non existing asset with non existing issuer|without trustline" : [ "WVnDbWS6YyE=" ], + "payment|protocol version 27|simple credit|credit payment with no trust" : [ "NT543EOisA0=" ], + "payment|protocol version 27|simple credit|credit sent to new account (no account error)" : [ "NT543EOisA0=" ], + "payment|protocol version 27|simple credit|with trust" : + [ + "/OuFsOyH6MY=", + "aNN2SDyyEtA=", + "2vKWR6o1LZQ=", + "qTJMaYAHDWQ=", + "/OuFsOyH6MY=", + "aNN2SDyyEtA=", + "2vKWR6o1LZQ=", + "qTJMaYAHDWQ=" + ], + "payment|protocol version 27|simple credit|with trust|missing issuer" : + [ + "iEy5GXPp3yc=", + "wHUDt9yaOdg=", + "/A1Xm+ny/XE=", + "73FOjzOqDVY=", + "Ddfys59hUjs=", + "Emow+z2V6bA=" + ], + "payment|protocol version 27|simple credit|with trust|positive" : [ "bKUZmcBO1tg=", "gtCbVkV9exo=" ], + "payment|protocol version 27|two payments, first breaking second" : [ "Ju+ZDykdCWQ=", "epcXI1yMtYk=" ], "payment|protocol version 2|a pays b, then a merge into b" : [ "tC1VsNNRT18=", "6Cm6IY7Goqo=" ], "payment|protocol version 2|a pays b, then b merge into a" : [ "tC1VsNNRT18=", "L64XLnXWjLE=" ], "payment|protocol version 2|authorize flag|allow trust" : diff --git a/test-tx-meta-baseline-next/RevokeSponsorshipTests.json b/test-tx-meta-baseline-next/RevokeSponsorshipTests.json index 7e9b3cd2fc..decc1213ac 100644 --- a/test-tx-meta-baseline-next/RevokeSponsorshipTests.json +++ b/test-tx-meta-baseline-next/RevokeSponsorshipTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "update sponsorship|protocol version 0|invalid input" : [ "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=" ], "update sponsorship|protocol version 0|invalid input|invalid trustline keys" : [ "dhe5iAdbDEg=" ], @@ -2065,6 +2066,152 @@ "VoNeHRgk3eM=", "nIhC52Lbz8o=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is not sponsored|account" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is not sponsored|claimable balances" : [ "ZHO0Ty522ik=", "9jD/76gvgHA=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is not sponsored|signer" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is not sponsored|trust line" : [ "ZHO0Ty522ik=", "tp9bf87W3+E=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is sponsored|account" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is sponsored|claimable balances" : [ "ZHO0Ty522ik=", "9jD/76gvgHA=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is sponsored|signer|Account has sponsored entry" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is sponsored|signer|Signer is the only sponsorship" : [ "ZHO0Ty522ik=", "F72v4P4wJ/g=" ], + "update sponsorship|protocol version 27|entry is not sponsored|account is sponsored|trust line" : [ "ZHO0Ty522ik=", "tp9bf87W3+E=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is not sponsored|claimable balance" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is not sponsored|signer" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is not sponsored|trust line" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored by owner|data" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored by owner|offer" : [ "iiBSGUxILOM=", "reBx4fl00xc=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored by owner|signer" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored by owner|trustline" : [ "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|account" : [ "Dzl6tPYEaWw=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|claimable balances" : [ "Xf8jX4ueNlI=", "t/RCwcdWVC0=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|data" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|offer" : [ "iiBSGUxILOM=", "jxJYa1+40zo=", "lXTeqFSzUZ8=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|signer" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 27|entry is sponsored|sponsor is sponsored|trust line" : [ "5KjEutNtf8g=", "v98Km7a14z0=" ], + "update sponsorship|protocol version 27|failure tests|does not exist" : [ "gZL35fBE+jQ=", "gZL35fBE+jQ=", "gZL35fBE+jQ=" ], + "update sponsorship|protocol version 27|failure tests|does not exist|use wrong account in offer key" : [ "GtcpZSUR8oA=", "LC36lyiP88E=", "nYKfP0C0oLo=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|entry|establish sponsorship" : [ "ZHO0Ty522ik=", "jmMblF7JHy0=", "cHRf3uEyjdw=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|entry|remove sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|entry|transfer sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|signer|establish sponsorship" : [ "ZHO0Ty522ik=", "jmMblF7JHy0=", "ARnfUOdVgag=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|signer|remove sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 27|failure tests|low reserve|signer|transfer sponsorship" : [ "5KjEutNtf8g=", "ZbYu43BUXYs=" ], + "update sponsorship|protocol version 27|failure tests|not sponsor" : + [ + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=", + "ZHO0Ty522ik=", + "njXA4Gx1JL0=" + ], + "update sponsorship|protocol version 27|failure tests|not sponsor|entry is not sponsored. transfer from wrong source account" : [ "cHRf3uEyjdw=" ], + "update sponsorship|protocol version 27|failure tests|not sponsor|signer is not sponsored. transfer from wrong source account" : [ "ARnfUOdVgag=" ], + "update sponsorship|protocol version 27|invalid input" : + [ + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=", + "10n072Z/0cs=" + ], + "update sponsorship|protocol version 27|invalid input|invalid trustline keys" : [ "hqZi03haQ3Q=" ], + "update sponsorship|protocol version 27|too many sponsoring" : + [ + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=", + "iiBSGUxILOM=" + ], + "update sponsorship|protocol version 27|too many sponsoring|account" : + [ + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=", + "m8mkYva7h+A=" + ], + "update sponsorship|protocol version 27|too many sponsoring|claimable balance" : + [ + "6L27Lp20ZYw=", + "C4THWNZavJg=", + "6L27Lp20ZYw=", + "C4THWNZavJg=", + "6L27Lp20ZYw=", + "C4THWNZavJg=" + ], + "update sponsorship|protocol version 27|too many sponsoring|pool share trustline" : + [ + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=", + "trV2JffVOfo=", + "CnzErJwImpE=", + "VhPiy3sI7Ko=", + "0rvK0QAhki0=", + "KBhrHQfZsFo=" + ], + "update sponsorship|protocol version 27|too many sponsoring|signer" : + [ + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=", + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=", + "kD/FlI4gKXY=", + "Ie2cJrvXztQ=" + ], + "update sponsorship|protocol version 27|too many sponsoring|trustline" : + [ + "VoNeHRgk3eM=", + "nIhC52Lbz8o=", + "VoNeHRgk3eM=", + "nIhC52Lbz8o=", + "VoNeHRgk3eM=", + "nIhC52Lbz8o=" + ], "update sponsorship|protocol version 2|invalid input" : [ "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=", "+OHYPtl+vPU=" ], "update sponsorship|protocol version 2|invalid input|invalid trustline keys" : [ "dhe5iAdbDEg=" ], "update sponsorship|protocol version 2|too many sponsoring" : diff --git a/test-tx-meta-baseline-next/SetOptionsTests.json b/test-tx-meta-baseline-next/SetOptionsTests.json index 57e3697a0d..9aa38130bf 100644 --- a/test-tx-meta-baseline-next/SetOptionsTests.json +++ b/test-tx-meta-baseline-next/SetOptionsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "set options|protocol version 0" : [ @@ -476,93 +477,93 @@ "set options|protocol version 14|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 14|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 14|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 14|Signers|add signer with native selling liabilities" : @@ -658,93 +659,93 @@ "set options|protocol version 15|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 15|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 15|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 15|Signers|add signer with native selling liabilities" : @@ -840,93 +841,93 @@ "set options|protocol version 16|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 16|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 16|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 16|Signers|add signer with native selling liabilities" : @@ -1022,93 +1023,93 @@ "set options|protocol version 17|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 17|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 17|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 17|Signers|add signer with native selling liabilities" : @@ -1204,93 +1205,93 @@ "set options|protocol version 18|Home domain|invalid home domain" : [ "5njpN1t36rQ=", "IC4jjAKS66s=", "hrY/y/NkUQI=" ], "set options|protocol version 18|Signers|add and remove many signers, some with sponsorships" : [ - "PpZ3La2CywM=", - "duUUnIUFbLA=", - "ZV9bskAv+Ds=", - "+46GVaQBpGU=", - "G8QUJn/lpgc=", - "I2/jOHlZfIo=", - "lq2zTzm+EM8=", - "A6MSzDg8Zy8=", - "ukKtHcUgeRU=", - "CrDZJbCOqFg=", - "329qgtaVWn0=", - "MhfFmhTHvYM=", - "bumgB38IuWk=", - "A4Hbh8+3Kzw=", - "FnBBJ0TmYA8=", - "CAEWJiOQ//M=", - "rouRmdJJwf4=", - "y5KmrwGKYos=", - "vvX+LmTIAk8=", - "LhdPg3qqyMU=", - "vHfHsFFwA10=", - "cCdXvgw76Eg=", - "UZe4BFe8wG4=", - "qH945m7hTCs=", - "FqJiJEpZI/0=", - "JeL7uGvksPk=", - "3EuGUAPyakY=", - "N80mwL2cMyY=", - "q1b2iHLlnyM=", - "WNFQRF0UGmw=", - "QciEcaLVQ2o=", - "5YcGR0ukep8=", - "58Sr+cUIa94=", - "BFS0yapxQ9g=", - "uGwQgYt8VMo=", - "dH3Axxy8L0A=", - "9Yzr+1Imu4U=", - "ooQOqEmgd/E=", - "m/xjMZT3xNY=", - "22oghS2qXHE=", - "xdc1rC29fV0=", - "hSAgGL0NmG0=", - "hZe0GleGrZI=", - "vUX0dH9MGeI=", - "vChX1BNvJQo=", - "DCucbEhW6TQ=", - "jpD4/es6p/w=", - "QdMYAEqP+wM=", - "59Feb2HQt3s=", - "4MoRkAfs//w=", - "KserVQ/Zaig=", - "BqMMRsCEfwA=", - "dPgEhesDXPs=", - "aK/miHFsZmk=", - "SE5LU35Xa8c=", - "igz+n5OGd7Q=", - "VjNB935woOo=", - "dEam9afQhek=", - "BP+RHwYjqGw=", - "zLvzeDuR6Wg=", - "yy6+qRz1i4Q=", - "28H/29SnlTU=", - "t/p1gDdP9MM=", - "FPZ4z7VQv4U=", - "zEgozDXZhWI=", - "a1SBEt51JzQ=", - "X3ZWaB0gVvk=", - "8gNCGWsTd3A=", - "N0w6seCJyHc=", - "NoLO9dBudew=", - "UupsujoZZG4=", - "9LlXieFEPmQ=", - "DQ0nP7GPhrY=", - "7BHcsztBlgk=", - "BtYawDAqYW8=", - "JU7xUm/ovJk=", - "+XmJkOmaLHY=", - "S1hc3WcPhdM=", - "w5ZtsVUUb0g=", - "kuqzX08x3Rk=", - "MGAV0U1NZdE=", - "8y4aE7REh7Y=", - "lBYBB6AXViw=", - "NMxZOTA2zdc=", - "DYyhvQAqSaI=", - "LxyfsvQDct8=", - "oHe3xZ12+Tk=" + "kE09P2QcqXI=", + "ndGEZkgXBnU=", + "XoVGMs5848w=", + "hc5UE/pk0pM=", + "xrRLEvNtaGc=", + "4YCBgWq+hok=", + "X6ZOjirf+DI=", + "zyZMEJ6cDMo=", + "1hbc35NZ50Y=", + "AMun+0wJfoU=", + "EIQMRUdHQc0=", + "n4l48a0HgYI=", + "FO2v2ZGhu40=", + "0FvuNs6V2pk=", + "mxDHiKMakfc=", + "Yn+PTjyB27g=", + "heSqcv4qtGw=", + "dZW3qRhJ6DA=", + "eFEj2V8NlI0=", + "bKbRXjoZtHc=", + "HLs/Ecxmzlw=", + "VEupH1J8Q98=", + "ZaoEXmW5E+A=", + "8tpQrMRWWX0=", + "rWbNJefxeX8=", + "Fci/m7a03Yk=", + "67yYwbgmMzU=", + "MIiTLEZeCgo=", + "R8hKYbTWlIs=", + "7d2QFSXBdk0=", + "NkvR7HD9fYI=", + "vIotsYt7IsA=", + "0rLnKk8Izwg=", + "hzHmdTqBYbw=", + "nOstGoObqmQ=", + "93CSexguG5o=", + "RQcGSSPJzPs=", + "P//HNKbJIA0=", + "vrR5z1wNlog=", + "pgm0+17DSjI=", + "1O5oBxct40c=", + "pGptWawiSVw=", + "eyz3Ops/wYk=", + "PwxwWMBD7KQ=", + "OVRoICiDQcg=", + "/J2SUP43UWU=", + "efPKzrZX2KE=", + "JNj2hX/cSVM=", + "0nbBpJCfeNM=", + "wQ3IN/oZiTU=", + "w3w3+Y28mA0=", + "Cr80tj7113E=", + "/piUb4UTEso=", + "lHMgM/APKNc=", + "Yt+cQIr1+Tw=", + "/2Xn9iwTKS0=", + "7HSAugjNuuc=", + "RTCTpp8ZBBg=", + "PsDruMwCW2s=", + "RTm38PSiPFM=", + "XM+5fXurScA=", + "VR675of24ZE=", + "knUAvCe4Rxk=", + "N6tXtpQopU0=", + "XUIyjYF5iQg=", + "1STYT4wSWdY=", + "JpLxLgnan6E=", + "AP+I+06IvHU=", + "KwHVdHepg8Q=", + "dSwyqnABAMQ=", + "SicMVQXqnGA=", + "TcGNZsYKqnk=", + "g9Na8WArB8o=", + "JnTpKkH+cAk=", + "LrH6sKgzeoo=", + "jT2tUrxbp2c=", + "Hj4lDlA+TBQ=", + "7lJpWTq4AfY=", + "pdlysl9TGRc=", + "bee0b3DDZ2c=", + "5bSq441Tvms=", + "VkW1ZNxVOZ4=", + "G/fGlT0iAQE=", + "eQaARyTxU9g=", + "qc6YxnGQzF4=", + "nr8s62ky/9w=", + "VtRf8WXIsbE=" ], "set options|protocol version 18|Signers|add signer with native buying liabilities" : [ "tKszQIledIw=", "xK8umMAyIMA=", "frYZ93ex7LU=" ], "set options|protocol version 18|Signers|add signer with native selling liabilities" : @@ -1386,93 +1387,93 @@ "set options|protocol version 19|Home domain|invalid home domain" : [ "Shl7NaoFTc0=", "fvNf/7V36Fs=", "yFo0SoiYtpk=" ], "set options|protocol version 19|Signers|add and remove many signers, some with sponsorships" : [ - "cBgcUxh3yQg=", - "a3zVSwp0Iz4=", - "Nljph82RHMs=", - "CMmVvy7j7YM=", - "05a+/VRN6jE=", - "gKk9KQtzXKk=", - "H8GDYiRe9y4=", - "1I6BF+w5zig=", - "rPTOUeB9k6M=", - "xaoNdJ0eZkc=", - "6YruXF+6f+A=", - "xqe03Fxstec=", - "Bcoh7HOw3ic=", - "eOQktpM+m4k=", - "DY1dCPtICOc=", - "PDuOOH7pOw4=", - "TloO7UoSApQ=", - "xCFRbCVUQAQ=", - "wkmz9HEW2tA=", - "m55EhMN3k28=", - "kdrU/cS52nI=", - "EibPux1X84M=", - "rOJcf/ZS9WQ=", - "0hl4BmRH7Lw=", - "5oYX7QXeZAc=", - "zXph6yj8mfM=", - "H9GlqmUFsMU=", - "/igrKKjYN8E=", - "CqyF1TBpAkE=", - "g5yuPQaT+h8=", - "A6ozifowfCQ=", - "7+bmEtTgKko=", - "J9Ybh2MfcTI=", - "CyiYD0u/8BY=", - "I+FxrTpq/bI=", - "Jv/guCSD6eA=", - "9DhXHK0pBWQ=", - "WVbegPNoARQ=", - "XV4WnP3coGc=", - "88AIwm2jfL8=", - "kP0ka488L3o=", - "/W6FvWbWrUU=", - "dpT24aQdAmA=", - "dWypu2mD40I=", - "CVBEQ6iQu8Q=", - "o2qLJVZuvAo=", - "PCisexo0n8s=", - "mGJ9roVItLE=", - "CMsmL0yFJ9E=", - "vOWaRIYokZc=", - "7zLTAjH8pCg=", - "wY/z6AjoCT8=", - "4cV922wKuW0=", - "EpIiY8Sd6Yo=", - "YJsMcjisVFc=", - "8S6uyuvRj7g=", - "D4fxY1d1PvE=", - "wVFh8bt4M9M=", - "/xeH7SX2o7Y=", - "Ut1BH509+pQ=", - "6u7AWfAiMqY=", - "EEihYpVJFes=", - "ZQI6yAOP3dg=", - "HCV4YSDv/Tw=", - "gSAxy3BtUfw=", - "bQgwpFCzYAQ=", - "QryjX4XFonQ=", - "wWlzl6p4J8A=", - "howuUyzg9SY=", - "8dbgCa+K/Fs=", - "ViHG5BnWhhg=", - "KXp514sHKRc=", - "TNIxg9FMREs=", - "pQxMIbhVqBM=", - "a4Uq855Lgas=", - "0TP6Pdgv8BU=", - "MIUOJcHqo9s=", - "CHpw+OIKBNc=", - "/oNxztEXdiM=", - "qCSP/hxx6ls=", - "texUvlpaenM=", - "YjUkM5LeesM=", - "V074XhBNxaY=", - "HGnzzLd+Gmg=", - "AM9z3ThGft4=", - "DP5XYukcg+A=", - "Q87zELhjtdQ=" + "wkZI0XRR/5U=", + "m9cDn14Yw4c=", + "ZT98KZxsthY=", + "l+NHz1Eq7ts=", + "LAE+YjLNIgg=", + "W4yNDXmEdAg=", + "bUc2LMBI2Gw=", + "TUwUBNic3Y8=", + "Zrj0Z47JdpU=", + "wGeb1bcqUd4=", + "0VIWGYPg6Qk=", + "3MX8lB+YPCA=", + "ihDrH2oTJZ8=", + "CQm3izCHndo=", + "rUK+scISbu4=", + "geoKkqElwuY=", + "+s9uOctc7Ls=", + "RJRFcN7rJN8=", + "zfNHFLJ0YWY=", + "/ULHyM9hCD8=", + "7Rx4TCe6Y/4=", + "BqtBFaYHFCU=", + "ICNf+6WTsAw=", + "c+4vRmC+Y34=", + "t0j3n2jvIuY=", + "+JxVibZSKLs=", + "a5tuTpUIGkI=", + "OuWbhWRGWIo=", + "5jIeOSNWqTs=", + "r0rUzMbLka0=", + "37rkqcpKpPY=", + "c37+vxARTAA=", + "k3VoECE4/wY=", + "2dPIME2q6dg=", + "N5aRkvRbFzI=", + "/hvbVSIKlSw=", + "AXes7jA7u8A=", + "oUCaMGD7b30=", + "dKH2xTQHZpw=", + "/kPZYmNxcpo=", + "FbubjZVVF3Q=", + "UH363xUWcXo=", + "vQHYTvFp+kw=", + "xTK5sbisx8o=", + "fczWYFK9mm0=", + "ueo6aOAJF7k=", + "gXxdKdCX+WU=", + "dIWEwI65v2k=", + "DNLQD2EJp7Q=", + "ZBadD+YgUX8=", + "d3ACLKtNM/U=", + "mhHcndvYVxY=", + "sm6MqAc7QLQ=", + "4i7wWOw8npk=", + "NEG5R4KSyKs=", + "ljuuKnyG808=", + "9qXUpT4sHNE=", + "nWCf+gyOGHg=", + "HKvP+3wDHdE=", + "BSESc4i9vrc=", + "KHsI8OWVUnM=", + "JyWExLsTpCo=", + "UFaxNwy+VrE=", + "eTU1zz02hSo=", + "81TE2yM7+Nw=", + "6NbGokLYzaI=", + "Q1hXgAmr/eo=", + "Q1aPEaLTDSg=", + "QS1sCGWvD00=", + "FOpEondlLjM=", + "G78goIpdxBo=", + "XICuJ/4utlE=", + "k3cM8X5iO9A=", + "JpR51lydFo0=", + "2EdjBgYw12A=", + "ONqybRLDRhI=", + "Kf4xvMleIqI=", + "BXvkmqaEUi4=", + "Nc6KwU0VXy0=", + "sUCjOoCwdH4=", + "/dwguJtBmqY=", + "4E27hjouWPo=", + "CeVKWfhprDI=", + "kumWPNI5f9Y=", + "KfvtpURk+SU=", + "OQnJGrrGw2U=", + "YNTJ1xAoNkE=" ], "set options|protocol version 19|Signers|add signer with native buying liabilities" : [ "xKIlhkQFJi8=", "0RuDDzFLEjk=", "x97I1IDbHmc=" ], "set options|protocol version 19|Signers|add signer with native selling liabilities" : @@ -1651,93 +1652,93 @@ "set options|protocol version 20|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 20|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 20|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 20|Signers|add signer with native selling liabilities" : @@ -1833,93 +1834,93 @@ "set options|protocol version 21|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 21|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 21|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 21|Signers|add signer with native selling liabilities" : @@ -2015,93 +2016,93 @@ "set options|protocol version 22|Home domain|invalid home domain" : [ "qfychd3sH3Y=", "bjSEmZjbch4=", "BDLUaR4RlS0=" ], "set options|protocol version 22|Signers|add and remove many signers, some with sponsorships" : [ - "1y6+P8JbQFI=", - "X+w4uyvvugI=", - "rQG8VEDj6SM=", - "lX+WZ4Ki/cU=", - "jbeJTnMkJbA=", - "iBYhC9zPsb0=", - "Ut+s6wddyK0=", - "jj5o47oX9w0=", - "BKI3hni4G1g=", - "2HXNvWZhUEM=", - "aJF5qymBOyw=", - "ONig13EIaLI=", - "LTJZ8ObO6Dk=", - "Ydeyeh7vmZ8=", - "QRSHaJsNIS4=", - "CYSS5NXo+lQ=", - "dCsqHh+PYC0=", - "UR6Wi8qGJTs=", - "7RA1dQYxo4w=", - "oR5dXZ4WDpI=", - "4Qg/Wn5xH3Y=", - "A+Ry/nehWOk=", - "gqCNPIZ/ZKs=", - "OFyoqvll4f4=", - "MWicP0BXxdo=", - "YKKH+jVp0fo=", - "VzIxsv+CYjE=", - "q7Jfrpotmus=", - "fR7VvRnu7rE=", - "32uLn9KBvx8=", - "bvsfeQzU8A0=", - "6JZIp7V0x/k=", - "ge7zmfdGhCk=", - "xLgvieq4H78=", - "GQVfJkcItTA=", - "pD1jADyKeFE=", - "sdeyFHsGc5Y=", - "vlIsSNDyd5w=", - "a8dlAYhcXQ8=", - "ChbvLWi8A8k=", - "QZmTX5BzxXQ=", - "9vy3Ck8eQ68=", - "E6zNkE5A0RY=", - "wOY+ZMyOKY8=", - "g19y13FR100=", - "EO7Mza771lw=", - "dfL5YGndwls=", - "7hVkceFKBMk=", - "+3s5pr7RBKI=", - "5k/IEb/HkCg=", - "lRAKy5ug/O0=", - "5RD4FMhXZbg=", - "hm6KW5y5zNo=", - "sLMzSJEdHxk=", - "9B0PELY94+E=", - "F/z3tdhMLLM=", - "4V8xw7qcTug=", - "UfMZMTt4c5I=", - "cVTOa2tcy/8=", - "+N/wR7NzVmU=", - "HNZkrExZzHY=", - "TyXMdatTRBU=", - "hpU4guktl9o=", - "VEmQGJyAeco=", - "3weG2nqbaQo=", - "cBGdcFnb/88=", - "dLPCRFjYSpY=", - "7CD3ZdS1BII=", - "VcYIIwuRSEc=", - "HJYX92CqjCU=", - "tOzrhkCVrTk=", - "E4j4spsyVuI=", - "u55fIpl6fHY=", - "+nhfZf1Z/Jk=", - "n3lebTUf3Mg=", - "U/mj4wc9kMY=", - "4nKs3xnemSs=", - "SFyJVgVoezs=", - "ZvuTDweS8uw=", - "3YZus2969xQ=", - "FKd5x/m/spA=", - "xHSnDlIHtkU=", - "IBtC5pFF+mA=", - "JQmtUggKdeU=", - "kQ+LBxnZitE=", - "VuGwKPW1Dm8=", - "+R+rDXu1kww=" + "DFGZkSCkSoQ=", + "N99VujdWSRc=", + "YDxhJPDWbTQ=", + "5bfFZlmxq9s=", + "6NhV+LMoC8A=", + "U0VZV0JaI3o=", + "nFrQkCT6tog=", + "/TG0WHlvCJ4=", + "ZcMjZQBKf9M=", + "1EPGkmZtckI=", + "DDPAYLGEYuc=", + "EwuW1/nh4Bk=", + "cXcL/YN3MHw=", + "e2085eIjD0Q=", + "MIBOCyxStxQ=", + "WJMKOEbanbM=", + "X7/o3SMh9eo=", + "t9PdJk/I1Sc=", + "DAqqRX0Vq2E=", + "VLZoBx3mKlc=", + "KuBrFaTh90A=", + "a2LSdbbgyJM=", + "tGXb0+LpPt4=", + "gt5150y1pH0=", + "ZKDqOrPYs9k=", + "kUo4Kfmo/Fs=", + "/jR8ZuJ1iIg=", + "Q+WvDXiie28=", + "R7x/P5JCq+8=", + "bXlln9F78Xw=", + "hvWfYA4DKCI=", + "0pqclkCuyk0=", + "nU5b2+BnDwI=", + "HxwhVSubgTk=", + "Z8HOYwGxXR4=", + "qxuxWu/OUhc=", + "4HNLqHYwTtA=", + "5coCYmTVLOg=", + "s1OoajbkQP4=", + "PizVXupT5cQ=", + "JTrNNhnblw0=", + "IbgCvPNQ3xo=", + "yN6kORZhJns=", + "HdzgawKs9s0=", + "fsGR8INnznA=", + "B3ZQgPCbny8=", + "zDCnMRrQneI=", + "+gXy+ZiyN7Q=", + "XyATrS+z1KI=", + "RSDThgiDYUc=", + "/Byt83tlESc=", + "PNI4c0zeJ5M=", + "yUhWWO39thc=", + "R2D/JNNto60=", + "Pn6IUlc24o8=", + "MmLATyPF+w4=", + "MfdjLEa5eBY=", + "QWzNzziNL0A=", + "okNfvgz4nZw=", + "BpchH/GqH/Q=", + "CjWLZYW3+Jg=", + "+dBRoW8+3/I=", + "wpBbvEtmh/g=", + "5eAksMpkwko=", + "YPRysFJLHIs=", + "wjm2K3S+FF4=", + "sGx3A6EDGJM=", + "ZLOjTp4GYj0=", + "oKG4YCRjkLQ=", + "biDyZ8vU9dY=", + "Cm182RLXDfg=", + "hCVTknTaYJY=", + "6lK8inL8pf8=", + "Ez6EjpT0aF8=", + "/mZk6vPJeQM=", + "3P2qPkzZqFs=", + "MWVSxsSsbgM=", + "RxIEyts2wHs=", + "RQNXVaJoA9M=", + "09nyzPlF7+I=", + "Amnzzm/HLIU=", + "i0rzvad5M6Q=", + "5xyXUtgxsfI=", + "oPYlItaHKKs=", + "d7WG/kKrpaw=", + "W5nQE7eQtho=", + "G+JBYzU6FvE=" ], "set options|protocol version 22|Signers|add signer with native buying liabilities" : [ "38PGch32Yj8=", "a0Y+nX12cIA=", "jtIBQ22cXd8=" ], "set options|protocol version 22|Signers|add signer with native selling liabilities" : @@ -2197,93 +2198,93 @@ "set options|protocol version 23|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 23|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 23|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 23|Signers|add signer with native selling liabilities" : @@ -2379,93 +2380,93 @@ "set options|protocol version 24|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 24|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 24|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 24|Signers|add signer with native selling liabilities" : @@ -2561,93 +2562,93 @@ "set options|protocol version 25|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 25|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 25|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 25|Signers|add signer with native selling liabilities" : @@ -2743,93 +2744,93 @@ "set options|protocol version 26|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], "set options|protocol version 26|Signers|add and remove many signers, some with sponsorships" : [ - "SDqR8gSdees=", - "2xFGqEZg2NU=", - "h7NO4g4hfsg=", - "sQL/ILrOUcs=", - "qlltpPNq3qg=", - "whKUofyHvbQ=", - "WEApeSCZyso=", - "M5rhj1vFxSk=", - "DULbgI6DVlE=", - "POqHEGfQ/GA=", - "BL1arY/CuSY=", - "Vb8Qc8h1Kmw=", - "6wdyU18JAbk=", - "+I+5ffPbcp0=", - "e5BB9tEd3ag=", - "Tk6D0R17mGk=", - "AHhkaskTsSA=", - "spajtQUXCFM=", - "EJDcVwNj0YY=", - "pZQn6Zuvf9g=", - "ngWCuj/vGFA=", - "CsQcoa4fpiQ=", - "xVDgq3dgP3U=", - "KIFehips+IE=", - "oaqvn5D1FCs=", - "3ijsv/Cim6o=", - "66aOjiRfg7M=", - "0YmQ8AO00S4=", - "qJA78VcG+Xk=", - "nv4PzUePK0c=", - "lNy8UxFVRYc=", - "YnwsopNEQCs=", - "k/L265fqwuw=", - "V/FDKhqomW4=", - "RX0KBsPu1/c=", - "r3wnDMlebYk=", - "/UfWFWCE9o0=", - "uR0TpP+f+hg=", - "TAXwi2ZWOIk=", - "jwTQPGUdcg4=", - "YeE1MJ7WdCQ=", - "gFHTBhKdLI0=", - "gEM1CsFTeE8=", - "jWvKPU4/8k0=", - "KVC5nR31Lu8=", - "Jv1aVITfT4s=", - "Xb2nPcJYIhs=", - "3ZE+0FBCesI=", - "dPc7eBU1jfE=", - "NoNKQIUeNFQ=", - "jdAar3l6KiY=", - "gWNqpReekiM=", - "DMLFIH2xLP8=", - "+Tc6G3+RCj4=", - "5rW/nSZ3b04=", - "9MOfZcE8kJY=", - "4VLjMrrK7WA=", - "v/iSNH6jFjI=", - "yzpRSOHFcR8=", - "iPmuZxPMZPo=", - "WnZQPoXFHKw=", - "tl+yeB+laZ8=", - "QTfQUzmGWJY=", - "uYFND/KpB2c=", - "qsE/kyogldQ=", - "0x9jBd5KVb4=", - "ZFPSfpIivJM=", - "xitjizGwCVs=", - "+SkEMlcGPbU=", - "X5ICxAlHpU0=", - "wcC34lkTfGk=", - "dNW6N3X+5js=", - "mQZe58FUuRE=", - "GrNNv91Expc=", - "0zM+P/9NPJ4=", - "VPMrvaTexzw=", - "2HKl1GF5gZc=", - "uHgvvGEhtW4=", - "w/s3fV54Jv4=", - "Cm9drztOwuA=", - "6OkBMG8jEgc=", - "kvqELzAOBSM=", - "bLMuqwlBm8M=", - "uHeftQNPguY=", - "dA2k4VjFJY4=", - "CvzB9M5OteI=", - "OdAOAzAMfuU=" + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" ], "set options|protocol version 26|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], "set options|protocol version 26|Signers|add signer with native selling liabilities" : @@ -2897,6 +2898,188 @@ "sZB1gOsKLU8=", "BC5Hqoi5njs=" ], + "set options|protocol version 27" : + [ + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=", + "DKQqbAOaoas=" + ], + "set options|protocol version 27|Home domain|invalid home domain" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], + "set options|protocol version 27|Signers|add and remove many signers, some with sponsorships" : + [ + "6E2kzOjISPA=", + "PfnhQ/EMDyM=", + "9jhnF3qs3q0=", + "IPGE5tzHCNY=", + "qTRgyL3xud4=", + "/zdWjE/GetM=", + "DYXKwnQ53AA=", + "jwMP3lBOvuI=", + "PHunNwVdOH0=", + "b6LJJFiTgTU=", + "+cqEWvIM8CI=", + "iHWrSiF0hZo=", + "1xT6cr7SmQc=", + "xbiI8MOORI8=", + "oOZJ2UNoB4w=", + "wVcGKe7m4Lk=", + "pTR2h0rurPE=", + "E8Za+JuIYXU=", + "jf/i6hnxNx0=", + "0Mx44R5PGIg=", + "lv29JYLuz1w=", + "hmSRIFH8eZU=", + "3sNYuoebySQ=", + "y+MfpHpw6Hw=", + "BAefUv0JLHM=", + "2Kagslbgd1o=", + "qSELRZ+c07U=", + "uYdC7e6yUfc=", + "LrJOrVW9MLQ=", + "eevpf6zD7/s=", + "dG3mcyFnKuo=", + "4TuWFDlBqDY=", + "Sl+T3Zh0hyU=", + "qIsd1fNxsXA=", + "SuF+fd3VZw8=", + "TZuLVTOLR2g=", + "e7gK2IvvGJY=", + "kUmo89I8KOU=", + "YO7ER9SqmcI=", + "6pVIGzaiOcM=", + "oMO+HW6sYKk=", + "jRJzsPiFGi0=", + "HGamizTJogE=", + "tmRkF9e5LQA=", + "hxUbPfnaz9A=", + "fiFz5LDPoZA=", + "DbRpmrd8a2c=", + "GF6+UVy1ZKA=", + "ajiCPiBhugM=", + "euskzfxCT5w=", + "CNKGh6CUYXo=", + "6+nIe1HzNw4=", + "2YK6bgh7cJU=", + "01lTG+HfCvU=", + "s/24RG+smdI=", + "7MdzaYIOSiA=", + "+YC672ztS6M=", + "AO+oY1M5Kpw=", + "gkCex7ekGYQ=", + "Fb6Wy8IVDeE=", + "WXNK/OVgLRQ=", + "0FoLCSQSXJM=", + "UFpwWVouDgc=", + "MU+Q55qKV1g=", + "e5yY4ifQilE=", + "3zMCQt891YY=", + "8rnD8r/uby0=", + "sITZaWhkIF0=", + "vd/GvJ4DEFM=", + "u3Wks466xoc=", + "MDc/JBtntjM=", + "99xvDWO6BQE=", + "n57yfSPh+1U=", + "Xsg/h0u7aBk=", + "AWqVU7jivUc=", + "MhoAbPU3yzY=", + "FxDFAYi4ySY=", + "EhLnGQo9BaA=", + "61sAs3uJh9M=", + "1iArm/bklAU=", + "HBsxJMVNPrs=", + "/c4zznIjWZI=", + "cSR0uCHAql4=", + "FIFzOSWYP2E=", + "2wcGYjYfaj0=", + "DxnguFrRECk=", + "G+ym1GuMWBc=" + ], + "set options|protocol version 27|Signers|add signer with native buying liabilities" : [ "JrVdj6y1nKM=", "Nm6WGa5tG1I=", "QjGMHtPGdd0=" ], + "set options|protocol version 27|Signers|add signer with native selling liabilities" : + [ + "JrVdj6y1nKM=", + "g+/6K99/PJs=", + "iCYVXgg/1Pg=", + "5WROxK1ahyw=", + "BmZ01/HiAyc=" + ], + "set options|protocol version 27|Signers|bad thresholds" : [ "uAWOrzAaoYc=", "SYVdy4LxM4M=", "o0Xxbs6nodk=" ], + "set options|protocol version 27|Signers|bad weight for master key" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 27|Signers|can't use master key as alternate signer" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 27|Signers|delete signer that does not exist with sponsorships" : [ "W208TQVIdRo=" ], + "set options|protocol version 27|Signers|ed25519 payload signer" : [ "VxTAsnbLZbs=", "T9mx9lDloRM=", "x+fNMotRL48=" ], + "set options|protocol version 27|Signers|insufficient balance" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 27|Signers|invalid signer weight" : [ "IlJmI6NdhFY=", "g0ZY1hAp5wM=" ], + "set options|protocol version 27|Signers|non-account signers" : + [ + "IlJmI6NdhFY=", + "PPbzSmsUMmQ=", + "thVIFDxxwaQ=", + "O7fGV7QGyZE=", + "Vngbfq7F1Ok=", + "jTlH7XcNal4=", + "cHSIcNgKNbs=", + "4l9+EcIePiw=", + "EcoqKtoLRP8=" + ], + "set options|protocol version 27|Signers|sponsorship" : [ "/SbCXgTKxGc=", "1Br7yhIxvB8=", "/SbCXgTKxGc=", "1Br7yhIxvB8=" ], + "set options|protocol version 27|Signers|sponsorship|create, modify, and remove sponsored entry" : [ "4qp9yUQYmhA=" ], + "set options|protocol version 27|Signers|too many signers" : + [ + "noY2hJhjCAo=", + "o0VtuySuv24=", + "Ebyzq3Wkcxs=", + "zSKipHBBdlo=", + "70sYuEqKweA=", + "7ultcFvqowE=", + "sF1B736civc=", + "tiBvcVBRXK8=", + "ALDy6cGfURc=", + "UoFwJ+oAnIg=", + "/DcsUU9YCfw=", + "h14R+sNsbks=", + "SIRrRM1UkRY=", + "3YmVLqxgj7M=", + "mF+urbDuKX0=", + "mfAeJEb/7cw=", + "fSXCUZoM7OA=", + "XPq2MnMjnoA=", + "+CZqxHeT7jk=", + "eF3tCVSNM2Y=", + "m+HUczXhuxc=" + ], + "set options|protocol version 27|Signers|too many subentries" : [ "mBYpf3mLbj4=", "mBYpf3mLbj4=" ], + "set options|protocol version 27|flags|Can't set and clear same flag" : [ "uAWOrzAaoYc=" ], + "set options|protocol version 27|flags|auth flags" : + [ + "tfheUCYuwek=", + "cefLKvIy7N0=", + "jBdHV6Yb6sI=", + "25XqA1RSriI=", + "ekQxvYmNXZE=", + "sZB1gOsKLU8=", + "BC5Hqoi5njs=" + ], "set options|protocol version 2|Home domain|invalid home domain" : [ "/lfj8xIFS8I=", "/lfj8xIFS8I=", "/lfj8xIFS8I=" ], "set options|protocol version 2|Signers|add signer with native buying liabilities" : [ "7mDTyBusMEE=", "F4XfmmSvUyo=", "LjJWBJ6wR7U=" ], "set options|protocol version 2|Signers|add signer with native selling liabilities" : [ "7mDTyBusMEE=", "44U+GUCwrJk=", "LjJWBJ6wR7U=" ], diff --git a/test-tx-meta-baseline-next/SetTrustLineFlagsTests.json b/test-tx-meta-baseline-next/SetTrustLineFlagsTests.json index 3673681487..d0b2d8debd 100644 --- a/test-tx-meta-baseline-next/SetTrustLineFlagsTests.json +++ b/test-tx-meta-baseline-next/SetTrustLineFlagsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,40 @@ 23, 24, 25, - 26 + 26, + 27 + ], + "pool share revocation order test" : + [ + "ITpXqgpFF30=", + "P/rIn0NE8KY=", + "Tojg9R7gBpM=", + "YgrarXvtOc0=", + "Oj9LBplreFw=", + "jdV8bqSB+kA=", + "1lANyk2+auQ=", + "G+odnbpOIBo=", + "/+f4FqaRf+w=", + "QX/0q46LfOs=", + "PkFEyR91lwo=" + ], + "revocation result test across validators" : + [ + "ITpXqgpFF30=", + "VFR450IniRs=", + "okqR49cN7bM=", + "F30nsE+N5Nw=", + "nv+Wtmu81bY=", + "xXsiKwwgZSo=", + "mtSookiDIPU=", + "SEbZg3F2KoY=", + "3JuuCrkQesY=", + "yZrAMi3U7SI=", + "a6XJOk4UdxE=", + "rfqX5FTFGEs=", + "qf1MdsvxjP8=", + "hPrRx7g/dzY=", + "e3wU9pYJIso=" ], "revoke from pool|protocol version 0" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 1" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], @@ -21689,6 +21722,2411 @@ "QWIGOaGw8v0=", "Qb7/3qR5hoo=" ], + "revoke from pool|protocol version 27" : + [ + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=", + "alQ6EsRSoSQ=", + "YXRTghDaPeM=", + "z4U1VXmCYY4=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - both non-native|pool is deleted" : + [ + "3BNOJlzsung=", + "qnW43+iAjUc=", + "L7yAI/+I8U4=", + "sZ4Auj/tiBE=", + "Xh6mxPLJw1U=", + "7ZFgf+AIkns=", + "c9iaWJd2uI0=", + "qjrDI0KFknA=", + "zCvjFvGl73w=", + "rHcNANiCuPE=", + "mwi+gGFGQ08=", + "gy/qpbX/PeE=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - both non-native|pool still exists" : + [ + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "ea/g8lcJPAs=", + "ujC00Pr/5yo=", + "3nQM4ZJgqWk=", + "C/p1gpvQBYI=", + "5XszkOyxn3A=", + "S7LPyZ5CEXs=", + "UNlpWLs8m9Y=", + "qmjLhizAjTc=", + "exQ7xKEnaW0=", + "t8tNIRPirOc=", + "ZTp7H67E5hQ=", + "G5rVvX1mI88=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - one non-native" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - one non-native|pool is deleted" : + [ + "x/MgwJ+FwD8=", + "GkRkl1HHX8A=", + "DALmy1BuYqw=", + "cR3FuNXBgJk=", + "/n9cCQ8ebY4=", + "MlI0a3ixUxs=", + "NtVrNYQWVSk=", + "ff/JtZQNcpc=", + "2W7mD2l2qf0=", + "cZTxmjbj2dI=", + "svta6YdqdOQ=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claim - one non-native|pool still exists" : + [ + "xygGFb0+baM=", + "P9kM3O+K94Y=", + "ZuUGd+7kcaQ=", + "dfKq7c3dWfg=", + "bvZnC2+ePHk=", + "SGu/Mnwk/YM=", + "Yt1fnvDoDY8=", + "+w+nKs4P4CA=", + "HG1f3RqEvns=", + "kXGvUIy/fx0=", + "w/RmOUlRw1M=", + "C0Z9eKG6JQs=", + "Iit2+K+wvVw=", + "SjuWIN5aIzs=", + "ipTKhVpqQbA=", + "ike8886Uhpk=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claimable balance created for issuer|assetA issuer" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "xeV5F90ykR8=", + "+gwXWxx6a8E=", + "Q3VaJoeQgrM=", + "GkRkl1HHX8A=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "xbomjYJ6A2U=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|claimable balance created for issuer|assetB issuer" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "9XqiTtI/0YI=", + "nzW1CVCl0B8=", + "kAerL8wvs90=", + "++SukBbWVBA=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "fwh19zAt3n8=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - both non-native" : + [ + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=", + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - both non-native|pool is deleted" : + [ + "eqURmTshdoU=", + "ESZkLAlpgGE=", + "+Bo0oXoOnMU=", + "uKuNz7HZgjQ=", + "btR9vAI/zsc=", + "r2igwYQDMHM=", + "tM3vXW40Q8E=", + "BXCQCqkzdF0=", + "Fnm5vNgFyGs=", + "2fux4pfF0FE=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - both non-native|pool still exists" : + [ + "kqY4X4f3i0E=", + "1QFpACchEy8=", + "4gEAox7FUtY=", + "mebbBvaYLCA=", + "FBTDoyYT8u8=", + "h/a3yw489GA=", + "OIusLgy02ac=", + "fNCQD9diZeg=", + "UXTsQO+GrEw=", + "DR1sbtRrrcM=", + "A2M5W4+l7UM=", + "ZegnzK0j+NI=", + "1xAXCqHiJUw=", + "S0xJyU6ViCQ=", + "2LDC4yG1/gg=", + "xjtLQ3CObTQ=", + "q7n/2scovxw=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - one non-native" : + [ + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=", + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - one non-native|pool is deleted" : + [ + "hM7lug967E0=", + "YhZSf19ZWzQ=", + "bhm+jxhljCY=", + "iWid/HPeM7w=", + "Tbd3yPekrgA=", + "S1zE4ydM1ao=", + "bWkGVFtqrAY=", + "vA2H+q7Kots=", + "kxBE01p1e38=", + "jyZhoxv1E6I=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|clawback - one non-native|pool still exists" : + [ + "AsniooyAj+k=", + "1dWjW5Jt2HA=", + "JqEiAta7RkI=", + "cQgdvFIOsEk=", + "yS9EyeunPig=", + "KSVoJgepZtA=", + "qy/K06HJxVU=", + "4x8VKaJth7w=", + "A7exKodqy2U=", + "/A+InlbfNp4=", + "XzyRgKH48lw=", + "tfDkX4p6dcw=", + "esNzPAUBlGI=", + "iHASW18z/04=", + "OIu0vnRDR8s=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke from 0 balance pool share trustline" : + [ + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "WA9JJNEjQMU=", + "odq2qvS+iIA=", + "ttzUOsaIBoY=", + "T1l2IU6VtHs=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke from multiple pools" : + [ + "Ej15sgZwk/8=", + "KtpHKUDsWbI=", + "l184XIgBAeE=", + "aTJgLxdwiYQ=", + "EPrCWsfgUqQ=", + "PN4+M90+aQM=", + "85qdD7cFGhQ=", + "BiRdX2k8dEM=", + "Sk0EDDMZXw8=", + "ZD/jdFRjVDg=", + "U8CwBSWmPZk=", + "W+d8+NS8Jfc=", + "5fJsNj+wspk=", + "xIYUXCsPK1A=", + "MFLO5qYoyBY=", + "+Q7AS5LR51g=", + "ZmmFXqrv0bY=", + "uB+5xHHbH2w=", + "aX12TR4j4Do=", + "lMyQHwrJTME=", + "8C52RDeJj/8=", + "qbPZ3uodwe8=", + "Ptul7KLdH+0=", + "CSeIxSRpl9o=", + "vFlZEj0C850=", + "m5jFVGrb8cQ=", + "g1PXQB9Zx/Y=", + "9rrsJjz/Q/g=", + "pf13WPD7hJ8=", + "ZHH+blVwuqM=", + "O2lIZBnDEs4=", + "qOcYlhFOt+A=", + "uetGYsCSoqw=", + "+q9gVrbbK9s=", + "3oBkrVAW6JE=", + "bUaD8AiapZI=", + "oKxx1HmCAXs=", + "SSGQDGKjooU=", + "IMeeZpumd8o=", + "UTxbpWCYsII=", + "RiiZy7X+/uk=", + "h7sutwR1TZY=", + "cR7uve/Pf7M=", + "ToKeBOH1z8U=", + "pHLCgtrtv3A=", + "5ylJKrYNfCw=", + "U8UZDNdrMxE=", + "NNQ7z36o5/0=", + "T/CYSuGEyus=", + "oKAS0SQVrg0=", + "lLvUEgo6tUo=", + "eTVipZ/xyuQ=", + "40A1PdpTnVo=", + "IKWEFkebeIE=", + "+n1HcViSGsw=", + "Q+YBbcY/Aac=", + "X15b10a2f3I=", + "KPPVnmRMk8Q=", + "0dKi+WsNoVc=", + "1GYJFcKvENQ=", + "nmeJQccgYQ4=", + "65v6wdoXexU=", + "MF9XJBBANIQ=", + "S9RevQNqoaQ=", + "SdA/GSOdOrw=", + "gsfsaXClo5U=", + "+2z83VJwktk=", + "8rOo2BIewg4=", + "sT3sHJ3+Lko=", + "0+sTbu+Dv2s=", + "uXZYrB/+zQY=", + "51QnpTZc2R4=", + "/9eNWvcM36o=", + "CRWKXHjMuhw=", + "+ysW91msOdg=", + "MEwUvQR96M0=", + "OsQ2P4F8GBE=", + "GRrYXNGRsWQ=", + "fVHextyz4+g=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetA" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "1U8pMfUIgTw=", + "cu6yCQSH2Qk=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "Fp0/G4TdTb0=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "wVupFjRjvsU=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetB" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "JXJZG8Yos7U=", + "Sp3J20yyJkQ=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "ZrrEiEZr8JU=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "NWvh+/5OvyI=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke leads to redeemed pool shares and pulled offers|one non-native - revoke assetB" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "ASwh0YJ3ty0=", + "J2v8GZ8XIV4=", + "fofvQf14MqQ=", + "FcFgNF79nwM=", + "r7CX3cwTZgI=", + "VjF8n3KSevI=", + "bXkN4v07Rwk=", + "ebZgGYgrQ/0=", + "XNrDtfNgwnc=", + "ygRGrcjJM7g=", + "4KonIE5uxog=", + "cfJEY2CYzDs=", + "kRNrjY6VaVI=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetA" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "9sRqqiKFjeg=", + "B7xUZpLBWDA=", + "xygGFb0+baM=", + "24B7JaVOxbY=", + "SKbMVA6we1g=", + "V0k3rbgNntU=", + "pFNB3NuLX+Q=", + "PMtSlH6DtTA=", + "jx2RoC3YtGE=", + "4Rul+L0t+WE=", + "pxddiin/7b4=", + "N6nk3weoJZA=", + "/hzINuVMx3g=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetB" : + [ + "tywh5+xR0v4=", + "CMvxm6vFvHA=", + "u+Yx++9iq2M=", + "Ad8vXXB9jT0=", + "xygGFb0+baM=", + "e6lcyfaPHIk=", + "JvSvLLTxhJU=", + "LKG0yNbBLeA=", + "/E7bu7ZOnLs=", + "1urk252ChO8=", + "IKVWLXL0+aQ=", + "0S2DV4bLyxo=", + "dcoNQcL6NQw=", + "r/aZey5P0qY=", + "j//DKCUkd54=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "jYF0uW2lDQg=", + "fLcqUde/eO4=", + "yZ3vVlhJE2M=", + "G4tPSEpVnmY=", + "+3Pff4UHyXQ=", + "4KSZaOMrK/s=", + "esb/9o1Ith8=", + "xrQrY/JYbcM=", + "MbOykBvt7FI=", + "YO3GW0Sz64E=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "nch4XDckfm8=", + "BiilzEGKpP4=", + "Y4fg/mICYmA=", + "8MK/LTYK9Dg=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "oj+ok3E7epw=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "KtBN8wbHttk=", + "XPU0Mu8Oo5Q=", + "9+oSpEq6C74=", + "Ut1PP2aMiY4=", + "erukIeNz9h8=", + "XlBeTbG00jk=", + "Y/vlzR2ox5I=", + "n4X/+8hl0Vc=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "6oXlTNs8wn4=", + "ooSzGlVyZOw=", + "jobDkOlDdOk=", + "XFPIMsO2cFU=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "TYABVzPOqvI=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships" : + [ + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Qxb1bSRHPSs=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "87KmiTyC60g=", + "ueaGBgDmnoM=", + "RpUgNVMFrpU=", + "t2JqvrD0xm4=", + "q9ueNpUSruY=", + "Out6Rxu9isY=", + "Hf0BAdxLncQ=", + "77f5MjdHBWg=", + "/fz8AKyNiRM=", + "jD2s+hxb8ME=", + "K0IcWpTufj8=", + "WAiS4mMoTmk=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - no sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "vVrAhaWRbPw=", + "RC0QjlyzzBI=", + "6k47iVDdHhQ=", + "8TEkMta+Ugs=", + "mOqcAnU8Yto=", + "8Riq56qqxMY=", + "/yMbdlqdqdQ=", + "1QopmuAd0uo=", + "g+hYkj6vFk8=", + "+cRUnRTLolI=", + "eKUqK+Y4+DE=", + "yUcwcWD75qU=", + "PdBWklVCL2o=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "XyErsWQCxUA=", + "PEx2d9OURMc=", + "GXvhRrhlqTM=", + "Iky+IrHSmKI=", + "7Rkiq2YBb0Q=", + "rkN82xsGLZc=", + "+Qd0reR74yM=", + "l+ils0txONY=", + "HEBIP2v+wrM=", + "eG7fdBb0nuQ=", + "BKZFtrOPIz0=", + "zT2Gam6mBZY=", + "0kkzMk1k7cc=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - sponsored account is the sponsor of the pool share trustline - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|increase reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "/hOeJJJ5mMQ=", + "iXMx+HQLzFM=", + "ykQzkoL7rN4=", + "W61imUX5t/Y=", + "FnKSUS49NW4=", + "3qPnbcvE+3o=", + "SrTSPxmNdJI=", + "vE5LM9dAjOA=", + "U+QMFpfBZNU=", + "bPn7JE201Fc=", + "uWrwfpHp/mY=", + "aCy7YHn5MMc=", + "CAtZ31dhFTQ=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Y0KQiXCoayk=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "R+AVlIeR8sA=", + "0JhxKLQ9G5I=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "6jb1LeVj00w=", + "c945pKdzmm4=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "NCT2rtqQDVQ=", + "1i3C/LQKcog=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - multiple pool share trustlines - one sponsored pool share trustline - sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "N1hWy+10hjA=", + "oHmwfFW2co8=", + "W/YPEAUchUU=", + "Xc2Ar0bpBaA=", + "sXg/lV8PdO4=", + "tPqGVjY1a5M=", + "Tx67I3JtA9c=", + "KnjXCxlajJc=", + "3mU6EhzQjMA=", + "2amfXdgoxbU=", + "kzurgO+oS7Y=", + "GkiHLPQBgz4=", + "G6pfiTh2kFg=", + "2KHf53MoBec=", + "jimhpvl7g9w=", + "V7GLPLHckhw=", + "ZlDxaYwheIE=", + "UrB9byyhI7s=", + "OWBOfEOdCPc=", + "h9Dbnoiuqeo=", + "5Qu2iohtyXk=", + "j947DTc00fU=", + "Jg4T+xiZhdk=", + "Us9URSoIjKQ=", + "f77qiIiGacQ=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "/6Mrw9MPXz8=", + "+QlpSoKA0aA=", + "/qADlAG9hz0=", + "22zFaPfJo5M=", + "SflnKBqrHFg=", + "qP7ZVB4jbaI=", + "w8A04wiexCs=", + "+3HupLDd924=", + "UCE+MdumGLk=", + "TVcscJ11kZY=", + "5mwqwFgPQFI=", + "1WnWTidOrVM=", + "1rzy6kL9Pnw=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "pvDp7Puvuqk=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "7t6gKBTfYrQ=", + "/edzsxdxWPE=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "T5pcyAswmpY=", + "Ilm4rG46Lnk=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "sfi3O4cRf1c=", + "yO58wjkST+0=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - sponsored account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "g4sVyUnPpfw=", + "GyTzzmvLfQU=", + "s1gxJk+3IFU=", + "+mvI6qfax6s=", + "Lp23JQaBGN4=", + "Y4BQKY/9Vmw=", + "kwqbbIRhx2s=", + "GzjUoNp1QMg=", + "HdUWOhDpq3A=", + "Zm3LB3CKqZE=", + "I196VtsCgC8=", + "sMOM6D4e2Lg=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - sponsored pool share trustline - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "tuiwUYU/EXw=", + "6J9PHOd8BXY=", + "bMUgxBOUFzA=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "OhzesPa0S+c=", + "fsj/kSFV2G4=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "hRNlPz09FOo=", + "nN06QtnRMLE=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|same reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "+zVp3B8qtNc=", + "VFfVREX63hw=", + "/qADlAG9hz0=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "w8A04wiexCs=", + "pVT7vfyvW/U=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "1WnWTidOrVM=", + "3ib6aHpo68Q=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|sponsorships|trustline is owned by one issuer and sponsored by the other" : + [ + "GjbSkanf1hU=", + "s7MjdOBLANk=", + "YPx9015AQko=", + "HgQoNLPFZe8=", + "O/wmtzZ58CU=", + "KpShWnhWRzk=", + "nDp6WE1k7JM=", + "KboarMVOWrs=", + "hJeyTwPxLok=", + "xDI7r/SfmOU=", + "WgGeGR43D2Y=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|trade with pool, revoke, then trade again|both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "MQLOhfdOUcQ=", + "PQ+a0coy0oI=", + "Y4fg/mICYmA=", + "QoCNi8c8tDU=", + "LdwEizxVY2Y=", + "hXuSS9pEyf4=", + "zSJ2bz3eaxw=", + "SsbpJgliMLw=", + "nqgad2MARzg=", + "5H3mf3lKEGM=", + "uMaHM5s1FQE=", + "vgbYU7ndwhc=", + "QThD9qtuu4k=", + "pN/aKDSme6o=", + "c12Sw2o8bDE=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|trade with pool, revoke, then trade again|one non-native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "DDpRsT17okA=", + "x2hg1xGgZMc=", + "MjEBL9rAEbs=", + "o+ttYhvYOQk=", + "NnRpnTLMIYw=", + "lYqJB/6JNrg=", + "cB1eeYocsws=", + "N6oC7nFdTMM=", + "ecdAgS28/Ak=", + "ykVWGqrHUm8=", + "Wiz2rqWiGxg=", + "cn9NlhoC5Fo=", + "8irUQ7VTyas=", + "4G3edp3Lq7o=" + ], + "revoke from pool|protocol version 27|revoke with allow trust|validate op num and tx account is used in hash" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "8/L0r2VGyTo=", + "Re1szw+hSQc=", + "R+i1RvPUkS8=", + "ouqhP9P6AxE=", + "Gp/dvueQUpY=", + "e3WWjr3RCYo=", + "eqzP0fBHBLY=", + "R5QVthwgOco=", + "ORYWlyD+vqc=", + "Oxd0d4+rVJw=", + "qQu/HqkkcZk=", + "SB/i/WaCXKE=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - both non-native|pool is deleted" : + [ + "3BNOJlzsung=", + "qnW43+iAjUc=", + "L7yAI/+I8U4=", + "sZ4Auj/tiBE=", + "Xh6mxPLJw1U=", + "7ZFgf+AIkns=", + "c9iaWJd2uI0=", + "qjrDI0KFknA=", + "zCvjFvGl73w=", + "rHcNANiCuPE=", + "mwi+gGFGQ08=", + "gy/qpbX/PeE=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - both non-native|pool still exists" : + [ + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "ea/g8lcJPAs=", + "ujC00Pr/5yo=", + "3nQM4ZJgqWk=", + "C/p1gpvQBYI=", + "5XszkOyxn3A=", + "S7LPyZ5CEXs=", + "UNlpWLs8m9Y=", + "qmjLhizAjTc=", + "exQ7xKEnaW0=", + "t8tNIRPirOc=", + "ZTp7H67E5hQ=", + "G5rVvX1mI88=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - one non-native" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - one non-native|pool is deleted" : + [ + "x/MgwJ+FwD8=", + "GkRkl1HHX8A=", + "DALmy1BuYqw=", + "cR3FuNXBgJk=", + "/n9cCQ8ebY4=", + "MlI0a3ixUxs=", + "NtVrNYQWVSk=", + "ff/JtZQNcpc=", + "2W7mD2l2qf0=", + "cZTxmjbj2dI=", + "svta6YdqdOQ=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claim - one non-native|pool still exists" : + [ + "xygGFb0+baM=", + "P9kM3O+K94Y=", + "ZuUGd+7kcaQ=", + "dfKq7c3dWfg=", + "bvZnC2+ePHk=", + "SGu/Mnwk/YM=", + "Yt1fnvDoDY8=", + "+w+nKs4P4CA=", + "HG1f3RqEvns=", + "kXGvUIy/fx0=", + "w/RmOUlRw1M=", + "C0Z9eKG6JQs=", + "Iit2+K+wvVw=", + "SjuWIN5aIzs=", + "ipTKhVpqQbA=", + "ike8886Uhpk=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claimable balance created for issuer|assetA issuer" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "xeV5F90ykR8=", + "+gwXWxx6a8E=", + "Q3VaJoeQgrM=", + "GkRkl1HHX8A=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "xbomjYJ6A2U=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|claimable balance created for issuer|assetB issuer" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "9XqiTtI/0YI=", + "nzW1CVCl0B8=", + "kAerL8wvs90=", + "++SukBbWVBA=", + "eblY5EBBZw4=", + "n1rMOGsqk80=", + "cU38wHqBzJo=", + "BNUcrdbpMV8=", + "fwh19zAt3n8=", + "/YKCQlgwMao=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - both non-native" : + [ + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=", + "lKaEXvJjtSU=", + "Xvgzy99yvpk=", + "dzulW02X7TI=", + "NrL9GC58/78=", + "Lmf8i4KWD+c=", + "sytFea0coHc=", + "T89dydDGotg=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - both non-native|pool is deleted" : + [ + "eqURmTshdoU=", + "ESZkLAlpgGE=", + "+Bo0oXoOnMU=", + "uKuNz7HZgjQ=", + "btR9vAI/zsc=", + "r2igwYQDMHM=", + "tM3vXW40Q8E=", + "BXCQCqkzdF0=", + "Fnm5vNgFyGs=", + "2fux4pfF0FE=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - both non-native|pool still exists" : + [ + "kqY4X4f3i0E=", + "1QFpACchEy8=", + "4gEAox7FUtY=", + "mebbBvaYLCA=", + "FBTDoyYT8u8=", + "h/a3yw489GA=", + "OIusLgy02ac=", + "fNCQD9diZeg=", + "UXTsQO+GrEw=", + "DR1sbtRrrcM=", + "A2M5W4+l7UM=", + "ZegnzK0j+NI=", + "1xAXCqHiJUw=", + "S0xJyU6ViCQ=", + "2LDC4yG1/gg=", + "xjtLQ3CObTQ=", + "q7n/2scovxw=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - one non-native" : + [ + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=", + "lKaEXvJjtSU=", + "ebCerNxH5J4=", + "FpELJ3p5SQM=", + "c0MRrYujocE=", + "KVz60ymEZ54=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - one non-native|pool is deleted" : + [ + "hM7lug967E0=", + "YhZSf19ZWzQ=", + "bhm+jxhljCY=", + "iWid/HPeM7w=", + "Tbd3yPekrgA=", + "S1zE4ydM1ao=", + "bWkGVFtqrAY=", + "vA2H+q7Kots=", + "kxBE01p1e38=", + "jyZhoxv1E6I=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|clawback - one non-native|pool still exists" : + [ + "AsniooyAj+k=", + "1dWjW5Jt2HA=", + "JqEiAta7RkI=", + "cQgdvFIOsEk=", + "yS9EyeunPig=", + "KSVoJgepZtA=", + "qy/K06HJxVU=", + "4x8VKaJth7w=", + "A7exKodqy2U=", + "/A+InlbfNp4=", + "XzyRgKH48lw=", + "tfDkX4p6dcw=", + "esNzPAUBlGI=", + "iHASW18z/04=", + "OIu0vnRDR8s=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke from 0 balance pool share trustline" : + [ + "tNoHVw1oPiE=", + "QUc/k8RJKHE=", + "WA9JJNEjQMU=", + "odq2qvS+iIA=", + "ttzUOsaIBoY=", + "T1l2IU6VtHs=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke from multiple pools" : + [ + "Ej15sgZwk/8=", + "KtpHKUDsWbI=", + "l184XIgBAeE=", + "aTJgLxdwiYQ=", + "EPrCWsfgUqQ=", + "PN4+M90+aQM=", + "85qdD7cFGhQ=", + "BiRdX2k8dEM=", + "Sk0EDDMZXw8=", + "ZD/jdFRjVDg=", + "U8CwBSWmPZk=", + "W+d8+NS8Jfc=", + "5fJsNj+wspk=", + "xIYUXCsPK1A=", + "MFLO5qYoyBY=", + "+Q7AS5LR51g=", + "ZmmFXqrv0bY=", + "uB+5xHHbH2w=", + "aX12TR4j4Do=", + "lMyQHwrJTME=", + "8C52RDeJj/8=", + "qbPZ3uodwe8=", + "Ptul7KLdH+0=", + "CSeIxSRpl9o=", + "vFlZEj0C850=", + "m5jFVGrb8cQ=", + "g1PXQB9Zx/Y=", + "9rrsJjz/Q/g=", + "pf13WPD7hJ8=", + "ZHH+blVwuqM=", + "O2lIZBnDEs4=", + "qOcYlhFOt+A=", + "uetGYsCSoqw=", + "+q9gVrbbK9s=", + "3oBkrVAW6JE=", + "bUaD8AiapZI=", + "oKxx1HmCAXs=", + "SSGQDGKjooU=", + "IMeeZpumd8o=", + "UTxbpWCYsII=", + "RiiZy7X+/uk=", + "h7sutwR1TZY=", + "cR7uve/Pf7M=", + "ToKeBOH1z8U=", + "pHLCgtrtv3A=", + "5ylJKrYNfCw=", + "U8UZDNdrMxE=", + "NNQ7z36o5/0=", + "T/CYSuGEyus=", + "oKAS0SQVrg0=", + "lLvUEgo6tUo=", + "eTVipZ/xyuQ=", + "40A1PdpTnVo=", + "IKWEFkebeIE=", + "+n1HcViSGsw=", + "Q+YBbcY/Aac=", + "X15b10a2f3I=", + "KPPVnmRMk8Q=", + "0dKi+WsNoVc=", + "1GYJFcKvENQ=", + "nmeJQccgYQ4=", + "65v6wdoXexU=", + "MF9XJBBANIQ=", + "S9RevQNqoaQ=", + "SdA/GSOdOrw=", + "gsfsaXClo5U=", + "+2z83VJwktk=", + "8rOo2BIewg4=", + "sT3sHJ3+Lko=", + "0+sTbu+Dv2s=", + "uXZYrB/+zQY=", + "51QnpTZc2R4=", + "/9eNWvcM36o=", + "CRWKXHjMuhw=", + "+ysW91msOdg=", + "MEwUvQR96M0=", + "OsQ2P4F8GBE=", + "GRrYXNGRsWQ=", + "fVHextyz4+g=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetA" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "1U8pMfUIgTw=", + "cu6yCQSH2Qk=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "Fp0/G4TdTb0=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "wVupFjRjvsU=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|both non-native - revoke assetB" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "V8JT1vdIQtg=", + "1j5NmsuKQxI=", + "JXJZG8Yos7U=", + "Sp3J20yyJkQ=", + "e91Z212+u+Q=", + "WRfgstBoPJM=", + "5zq/1aMb/t8=", + "w6X+AMiB+xA=", + "ZrrEiEZr8JU=", + "xujiT6C4qBE=", + "/+5cQxIZeys=", + "Nindidt8TgQ=", + "9kxay4VZyv0=", + "NWvh+/5OvyI=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke leads to redeemed pool shares and pulled offers|one non-native - revoke assetB" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "ASwh0YJ3ty0=", + "J2v8GZ8XIV4=", + "fofvQf14MqQ=", + "FcFgNF79nwM=", + "r7CX3cwTZgI=", + "VjF8n3KSevI=", + "bXkN4v07Rwk=", + "ebZgGYgrQ/0=", + "XNrDtfNgwnc=", + "ygRGrcjJM7g=", + "4KonIE5uxog=", + "cfJEY2CYzDs=", + "kRNrjY6VaVI=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetA" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "9sRqqiKFjeg=", + "B7xUZpLBWDA=", + "xygGFb0+baM=", + "24B7JaVOxbY=", + "SKbMVA6we1g=", + "V0k3rbgNntU=", + "pFNB3NuLX+Q=", + "PMtSlH6DtTA=", + "jx2RoC3YtGE=", + "4Rul+L0t+WE=", + "pxddiin/7b4=", + "N6nk3weoJZA=", + "/hzINuVMx3g=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|revoked account is issuer of assetB" : + [ + "tywh5+xR0v4=", + "CMvxm6vFvHA=", + "u+Yx++9iq2M=", + "Ad8vXXB9jT0=", + "xygGFb0+baM=", + "e6lcyfaPHIk=", + "JvSvLLTxhJU=", + "LKG0yNbBLeA=", + "/E7bu7ZOnLs=", + "1urk252ChO8=", + "IKVWLXL0+aQ=", + "0S2DV4bLyxo=", + "dcoNQcL6NQw=", + "r/aZey5P0qY=", + "j//DKCUkd54=", + "d8cmhPKJ27I=", + "Wmm0Z63q6rc=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "jYF0uW2lDQg=", + "fLcqUde/eO4=", + "yZ3vVlhJE2M=", + "G4tPSEpVnmY=", + "+3Pff4UHyXQ=", + "4KSZaOMrK/s=", + "esb/9o1Ith8=", + "xrQrY/JYbcM=", + "MbOykBvt7FI=", + "YO3GW0Sz64E=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetA - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "nch4XDckfm8=", + "BiilzEGKpP4=", + "Y4fg/mICYmA=", + "8MK/LTYK9Dg=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "oj+ok3E7epw=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "KtBN8wbHttk=", + "XPU0Mu8Oo5Q=", + "9+oSpEq6C74=", + "Ut1PP2aMiY4=", + "erukIeNz9h8=", + "XlBeTbG00jk=", + "Y/vlzR2ox5I=", + "n4X/+8hl0Vc=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|revoke pool share trustline that results in one less claimable balance due to rounding|trade down assetB - non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "6oXlTNs8wn4=", + "ooSzGlVyZOw=", + "jobDkOlDdOk=", + "XFPIMsO2cFU=", + "L6I2XsyRLfg=", + "iCeLN7iUChY=", + "hUqScta/zuo=", + "l/V0uJ98UH8=", + "TYABVzPOqvI=", + "c6CfLp9SAhY=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships" : + [ + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=", + "5APfT5VQQgs=", + "Wp8Af40nyHU=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Qxb1bSRHPSs=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "87KmiTyC60g=", + "ueaGBgDmnoM=", + "RpUgNVMFrpU=", + "t2JqvrD0xm4=", + "q9ueNpUSruY=", + "Out6Rxu9isY=", + "Hf0BAdxLncQ=", + "77f5MjdHBWg=", + "/fz8AKyNiRM=", + "jD2s+hxb8ME=", + "K0IcWpTufj8=", + "WAiS4mMoTmk=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - no sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "vVrAhaWRbPw=", + "RC0QjlyzzBI=", + "6k47iVDdHhQ=", + "8TEkMta+Ugs=", + "mOqcAnU8Yto=", + "8Riq56qqxMY=", + "/yMbdlqdqdQ=", + "1QopmuAd0uo=", + "g+hYkj6vFk8=", + "+cRUnRTLolI=", + "eKUqK+Y4+DE=", + "yUcwcWD75qU=", + "PdBWklVCL2o=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "XyErsWQCxUA=", + "PEx2d9OURMc=", + "GXvhRrhlqTM=", + "Iky+IrHSmKI=", + "7Rkiq2YBb0Q=", + "rkN82xsGLZc=", + "+Qd0reR74yM=", + "l+ils0txONY=", + "HEBIP2v+wrM=", + "eG7fdBb0nuQ=", + "BKZFtrOPIz0=", + "zT2Gam6mBZY=", + "0kkzMk1k7cc=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - sponsored account is the sponsor of the pool share trustline - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|increase reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "/hOeJJJ5mMQ=", + "iXMx+HQLzFM=", + "ykQzkoL7rN4=", + "W61imUX5t/Y=", + "FnKSUS49NW4=", + "3qPnbcvE+3o=", + "SrTSPxmNdJI=", + "vE5LM9dAjOA=", + "U+QMFpfBZNU=", + "bPn7JE201Fc=", + "uWrwfpHp/mY=", + "aCy7YHn5MMc=", + "CAtZ31dhFTQ=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - issuer sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "Y0KQiXCoayk=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - issuer sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "R+AVlIeR8sA=", + "0JhxKLQ9G5I=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "6jb1LeVj00w=", + "c945pKdzmm4=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "NCT2rtqQDVQ=", + "1i3C/LQKcog=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - multiple pool share trustlines - one sponsored pool share trustline - sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "N1hWy+10hjA=", + "oHmwfFW2co8=", + "W/YPEAUchUU=", + "Xc2Ar0bpBaA=", + "sXg/lV8PdO4=", + "tPqGVjY1a5M=", + "Tx67I3JtA9c=", + "KnjXCxlajJc=", + "3mU6EhzQjMA=", + "2amfXdgoxbU=", + "kzurgO+oS7Y=", + "GkiHLPQBgz4=", + "G6pfiTh2kFg=", + "2KHf53MoBec=", + "jimhpvl7g9w=", + "V7GLPLHckhw=", + "ZlDxaYwheIE=", + "UrB9byyhI7s=", + "OWBOfEOdCPc=", + "h9Dbnoiuqeo=", + "5Qu2iohtyXk=", + "j947DTc00fU=", + "Jg4T+xiZhdk=", + "Us9URSoIjKQ=", + "f77qiIiGacQ=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "/6Mrw9MPXz8=", + "+QlpSoKA0aA=", + "/qADlAG9hz0=", + "22zFaPfJo5M=", + "SflnKBqrHFg=", + "qP7ZVB4jbaI=", + "w8A04wiexCs=", + "+3HupLDd924=", + "UCE+MdumGLk=", + "TVcscJ11kZY=", + "5mwqwFgPQFI=", + "1WnWTidOrVM=", + "1rzy6kL9Pnw=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - sandwich on revoke - fail" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "pvDp7Puvuqk=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - sandwich on revoke - success" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "IFe8p6Q7Dc4=", + "CaduKxIuu5A=", + "iALUAVr5R6g=", + "7t6gKBTfYrQ=", + "/edzsxdxWPE=", + "mYrhk2lM17o=", + "8jxU8Xp7Ojs=", + "nbMHzS+7eUU=", + "T5pcyAswmpY=", + "Ilm4rG46Lnk=", + "qE6Euse0j6o=", + "TqzGc1L1ss8=", + "+usdvf/Wny4=", + "sfi3O4cRf1c=", + "yO58wjkST+0=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - sponsored account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "g4sVyUnPpfw=", + "GyTzzmvLfQU=", + "s1gxJk+3IFU=", + "+mvI6qfax6s=", + "Lp23JQaBGN4=", + "Y4BQKY/9Vmw=", + "kwqbbIRhx2s=", + "GzjUoNp1QMg=", + "HdUWOhDpq3A=", + "Zm3LB3CKqZE=", + "I196VtsCgC8=", + "sMOM6D4e2Lg=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - sponsored pool share trustline - no sandwich on revoke" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "tuiwUYU/EXw=", + "6J9PHOd8BXY=", + "bMUgxBOUFzA=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "OhzesPa0S+c=", + "fsj/kSFV2G4=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "hRNlPz09FOo=", + "nN06QtnRMLE=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|same reserve - sponsoring account is the sponsor of the pool share trustline" : + [ + "YECs072yGN4=", + "Jt9mlGpxue8=", + "lfavMVyhauo=", + "xCIC+VA8EF4=", + "A3uO+508WMA=", + "Qh0VbJxS1CQ=", + "Cyerhv6WIlU=", + "+zVp3B8qtNc=", + "VFfVREX63hw=", + "/qADlAG9hz0=", + "qhOXzdpjUHU=", + "OmgkvsrNZ5o=", + "GBXG42isGqI=", + "w8A04wiexCs=", + "pVT7vfyvW/U=", + "0iq1wn05Obc=", + "cpuZpCIB1eo=", + "0SKFPg8UYtE=", + "1WnWTidOrVM=", + "3ib6aHpo68Q=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|sponsorships|trustline is owned by one issuer and sponsored by the other" : + [ + "GjbSkanf1hU=", + "s7MjdOBLANk=", + "YPx9015AQko=", + "HgQoNLPFZe8=", + "O/wmtzZ58CU=", + "KpShWnhWRzk=", + "nDp6WE1k7JM=", + "KboarMVOWrs=", + "hJeyTwPxLok=", + "xDI7r/SfmOU=", + "WgGeGR43D2Y=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|trade with pool, revoke, then trade again|both non-native" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "W33WS+VSAHI=", + "1wczGFK9j7Y=", + "UgIubVEgRo0=", + "Lmp9MvlUGh8=", + "R4GZcROdZ8g=", + "J/y8ZW+7AP4=", + "tykCKej9fL0=", + "MQLOhfdOUcQ=", + "PQ+a0coy0oI=", + "Y4fg/mICYmA=", + "QoCNi8c8tDU=", + "LdwEizxVY2Y=", + "hXuSS9pEyf4=", + "zSJ2bz3eaxw=", + "SsbpJgliMLw=", + "nqgad2MARzg=", + "5H3mf3lKEGM=", + "uMaHM5s1FQE=", + "vgbYU7ndwhc=", + "QThD9qtuu4k=", + "pN/aKDSme6o=", + "c12Sw2o8bDE=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|trade with pool, revoke, then trade again|one non-native" : + [ + "zW7nIgGEYw8=", + "KvXY6KfyOLM=", + "6UR3oy+Z1Go=", + "DJRwuHY/fpA=", + "xygGFb0+baM=", + "8Tr5ss8T4Bk=", + "qnXgbpJdf84=", + "JGA5qzibeTY=", + "ugUe6izMLxs=", + "DDpRsT17okA=", + "x2hg1xGgZMc=", + "MjEBL9rAEbs=", + "o+ttYhvYOQk=", + "NnRpnTLMIYw=", + "lYqJB/6JNrg=", + "cB1eeYocsws=", + "N6oC7nFdTMM=", + "ecdAgS28/Ak=", + "ykVWGqrHUm8=", + "Wiz2rqWiGxg=", + "cn9NlhoC5Fo=", + "8irUQ7VTyas=", + "4G3edp3Lq7o=" + ], + "revoke from pool|protocol version 27|revoke with set trustline flags|validate op num and tx account is used in hash" : + [ + "UhF+J9KPG0E=", + "lA2qijqZy4k=", + "N7AbBgmxGyM=", + "OtWzCUtJgXQ=", + "8/L0r2VGyTo=", + "Re1szw+hSQc=", + "R+i1RvPUkS8=", + "ouqhP9P6AxE=", + "Gp/dvueQUpY=", + "e3WWjr3RCYo=", + "eqzP0fBHBLY=", + "R5QVthwgOco=", + "ORYWlyD+vqc=", + "Oxd0d4+rVJw=", + "qQu/HqkkcZk=", + "SB/i/WaCXKE=" + ], + "revoke from pool|protocol version 27|too many sponsoring|one claimable balance" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "rfbgtiAvP4Q=", + "x59BkQRfFjI=", + "wsRiHBjQXLo=", + "xDDfonaStfE=", + "xr/u0c8kmqQ=", + "lYFv3hFxSiw=" + ], + "revoke from pool|protocol version 27|too many sponsoring|two claimable balances" : + [ + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=", + "RLySHFXjplM=", + "jo50hQgBBGM=", + "TbTX2vLeMXU=", + "pmVuldB8QgE=", + "bZ9dsst2Csw=", + "rdiqtlA0Fk0=", + "N0OEj5baJmQ=", + "jQHa5qLsccs=", + "gj127A6JPko=", + "Q6sHbiz3xQk=", + "QWIGOaGw8v0=", + "Qb7/3qR5hoo=" + ], "revoke from pool|protocol version 3" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 4" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], "revoke from pool|protocol version 5" : [ "1kTXt7VFL1o=", "vMG2aGxrtAk=", "i/xr57yuK4A=" ], @@ -23074,6 +25512,135 @@ "set trustline flags|protocol version 26|upgrade auth when not revocable|0 -> authorized" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "nseFPAiMjX4=" ], "set trustline flags|protocol version 26|upgrade auth when not revocable|0 -> authorized to maintain liabilities" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "xjST+M6UZeU=" ], "set trustline flags|protocol version 26|upgrade auth when not revocable|authorized -> authorized to maintain liabilities -> authorized - with offers" : [ "w6iHOMgk5Zk=", "xwBPyJTkCdg=", "XhY1S+Bov0Y=", "fWhsK0sz/s4=" ], + "set trustline flags|protocol version 27" : + [ + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=", + "y/3ZzizJ/Kk=", + "6OzKWSrzQIc=", + "1VFixhV3iOc=", + "mXUag4QXvk0=", + "DUxjld6fPug=" + ], + "set trustline flags|protocol version 27|clear clawback" : + [ + "2q36ojLRHD4=", + "qh0/I7xumvc=", + "usRMxV2pCms=", + "KpAjWIlYGEk=", + "vfMD++LNONg=", + "/SU69GLvd+U=", + "mLGLCGSoYTk=" + ], + "set trustline flags|protocol version 27|empty flags" : [ "w6iHOMgk5Zk=", "hsA6Wo3b1eg=" ], + "set trustline flags|protocol version 27|errors|can't revoke|authorized -> 0" : [ "uwL6fqbahGg=", "K57lrYKFW20=" ], + "set trustline flags|protocol version 27|errors|can't revoke|authorized to maintain liabilities -> 0" : [ "ITK1uQfAvnE=", "yBsK55Y7kYU=", "Vw5W6hX6Jxw=" ], + "set trustline flags|protocol version 27|errors|invalid state" : [ "DJiVkhmIJs4=", "VY7N5Tg4P4A=", "DJiVkhmIJs4=", "VY7N5Tg4P4A=" ], + "set trustline flags|protocol version 27|errors|invalid state|set authorized when maintain liabilities" : [ "cPCAm5FYyBE=", "DFdctIg8ntM=" ], + "set trustline flags|protocol version 27|errors|invalid state|set maintain liabilities when authorized" : [ "/wPz30B3B3k=", "DFdctIg8ntM=" ], + "set trustline flags|protocol version 27|errors|malformed" : + [ + "Xd9HtdNhGVA=", + "SymM1FmYlyA=", + "LBocPPKS24I=", + "BzS3kHkzM74=", + "01SYm603m9s=", + "vlLZU1HUCck=", + "0sN4o12Ge0o=", + "GrRq36Wg7SM=", + "B7UXmmPPbJY=", + "keHGQAmKIZw=", + "Z6bsTg0wLjs=", + "aG2279UTCvE=", + "B4o5qBSKoDk=", + "gGukDOtmPrk=", + "SXE0j60942Y=", + "y8F0cyYnv1U=", + "kGwQ0M4SqnY=", + "S83NYVprs/8=", + "VqXgmfg9PAQ=", + "j1SkQRTo+X8=", + "h2ySbgoi+yg=", + "Agm/TGJjuLg=", + "tcuaFPrkzwo=", + "RipipwRxKjE=", + "Dc1ON5R1VmY=", + "HqXZ1MTe1IU=", + "LD/sfiuaYpQ=", + "160Bc14MRK0=", + "P+DWs7+hLDU=", + "v/VIU+7ijFw=" + ], + "set trustline flags|protocol version 27|errors|no trust" : [ "Xd9HtdNhGVA=" ], + "set trustline flags|protocol version 27|small test" : + [ + "9/P8T63L/mc=", + "t8Xt2RuSDDk=", + "0fsz0JFBVkg=", + "l6NH8YN0z70=", + "fR8HKma4Bns=" + ], + "set trustline flags|protocol version 27|upgrade auth when not revocable|0 -> authorized" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "nseFPAiMjX4=" ], + "set trustline flags|protocol version 27|upgrade auth when not revocable|0 -> authorized to maintain liabilities" : [ "iflE3+hwXfE=", "yBsK55Y7kYU=", "xjST+M6UZeU=" ], + "set trustline flags|protocol version 27|upgrade auth when not revocable|authorized -> authorized to maintain liabilities -> authorized - with offers" : [ "w6iHOMgk5Zk=", "xwBPyJTkCdg=", "XhY1S+Bov0Y=", "fWhsK0sz/s4=" ], "set trustline flags|protocol version 2|not supported before version 17" : [ "/lfj8xIFS8I=" ], "set trustline flags|protocol version 3" : [ diff --git a/test-tx-meta-baseline-next/TxEnvelopeTests.json b/test-tx-meta-baseline-next/TxEnvelopeTests.json index db80a0a372..957a4bbe61 100644 --- a/test-tx-meta-baseline-next/TxEnvelopeTests.json +++ b/test-tx-meta-baseline-next/TxEnvelopeTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "txenvelope|protocol version 0|alternative signatures" : [ @@ -1217,7 +1218,7 @@ "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 14|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1248,7 +1249,7 @@ "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 14|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 14|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 14|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1461,7 +1462,7 @@ "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 15|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1492,7 +1493,7 @@ "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 15|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 15|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 15|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1705,7 +1706,7 @@ "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 16|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1736,7 +1737,7 @@ "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 16|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 16|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 16|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -1949,7 +1950,7 @@ "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 17|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -1980,7 +1981,7 @@ "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 17|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 17|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 17|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -2193,7 +2194,7 @@ "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "bWQV9RGGn10=", "r5eqRixNcho=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "XNKsjU30KYM=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "WdGJfGQRfVI=" ], - "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "GXulSaEBlsg=" ], + "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "IF5hGrjjLEM=", "PRnyBpYQT9Q=", "hICLaD2OLu4=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "YxhjmsesZcg=", "MeciNpbK/lA=" ], "txenvelope|protocol version 18|alternative signatures|hash tx|single signature|failing transaction" : [ "k8yMJlLL3B8=", "/RrjgGXPfMc=" ], @@ -2224,7 +2225,7 @@ "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ZOwdB+fmKjM=", "511i2rRxiMI=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "VwP3r9J7ttc=", "Vs9AnrUJNns=" ], - "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=", "s9tTEuDmL1Q=" ], + "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "IF5hGrjjLEM=", "41CUe6MU20Y=" ], "txenvelope|protocol version 18|alternative signatures|hash x|multisig|success signature + hash x" : [ "IF5hGrjjLEM=", "9FVpRTlh3Lg=", "xTcOm8XDZq8=" ], "txenvelope|protocol version 18|alternative signatures|hash x|single signature|accountMerge signing account" : [ "QX02OX53mlU=", "Ca3C4aHxJFM=", "9XQY8VPxCDQ=", "QK4ky4wAMhs=" ], "txenvelope|protocol version 18|alternative signatures|hash x|single signature|failing transaction" : [ "vioyvz1btfI=", "569QECM4Jig=" ], @@ -2456,7 +2457,7 @@ "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "seWgWQjP1KA=", "HD+KE2dv0J8=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "7xAxuX2koIU=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "od7ol9puDzI=" ], - "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "n54lTWoqP6c=" ], + "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "J1TPVPqVGng=", "rrLhA7Z1UnA=", "oasdKqTDCOA=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "82DS8lxCTyM=", "jamZv4a6NgY=", "Te+Mi7134UI=", "0NccSo9SKW8=" ], "txenvelope|protocol version 19|alternative signatures|hash tx|single signature|failing transaction" : [ "JpMQtM6sUVs=", "Mi4truI3NJ4=" ], @@ -2487,7 +2488,7 @@ "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "EM8eNo5S2Rg=", "1SD5E7Sv0wM=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "7dRyDVVWD/o=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "7dRyDVVWD/o=" ], - "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "jkPDpouHQkQ=" ], + "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|hash x|multisig|success signature + hash x" : [ "J1TPVPqVGng=", "zSMquDS/218=", "GYh9gczOApY=" ], "txenvelope|protocol version 19|alternative signatures|hash x|single signature|accountMerge signing account" : [ "82DS8lxCTyM=", "jamZv4a6NgY=", "HthBV2u6yIM=", "sjeWbqW5W2w=" ], "txenvelope|protocol version 19|alternative signatures|hash x|single signature|failing transaction" : [ "ThY7/Mobm5U=", "rcoIrs45/xg=" ], @@ -2516,7 +2517,7 @@ "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "0W/+Rbf99jQ=", "XGBSWiLy4Es=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "nrKK2E+HdPI=", "6cQ1e6fl0yA=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "nrKK2E+HdPI=", "6cQ1e6fl0yA=" ], - "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=", "ZUTCMzwc9ZY=" ], + "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "J1TPVPqVGng=", "5RyIOUuDPkA=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "J1TPVPqVGng=", "7fO6akVkQ3Q=", "O90hZRetVuc=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "tlAFvpcsg4A=", "Nbzl0nNC5F4=", "GCLfz0SkNWc=" ], "txenvelope|protocol version 19|alternative signatures|payload signer|payload signer in op source account signers" : [ "tlAFvpcsg4A=", "Nbzl0nNC5F4=", "KgOPmO2NGVA=" ], @@ -3049,7 +3050,7 @@ "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 20|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3080,7 +3081,7 @@ "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 20|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 20|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3109,7 +3110,7 @@ "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 20|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -3391,7 +3392,7 @@ "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 21|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3422,7 +3423,7 @@ "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 21|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 21|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3451,7 +3452,7 @@ "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 21|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -3733,7 +3734,7 @@ "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "X4K6rcNzHVc=", "N+iiTVk5omg=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "lRiICuotIJw=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "HqMzwPOKq64=" ], - "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "6OKbqbODrbA=" ], + "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "S2Oy9yMxw4U=", "ETPfuKzAwmU=", "U0+JkC6eeks=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "nqi8VWnppYo=", "FRYfk3sm4ak=" ], "txenvelope|protocol version 22|alternative signatures|hash tx|single signature|failing transaction" : [ "fYMiOK+Q6hQ=", "4amZzMK1fTw=" ], @@ -3764,7 +3765,7 @@ "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "wcogNKtYyEQ=", "aD9cGmwh68c=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "FpweMFCFzJ4=" ], - "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "1ooWhhmhnVY=" ], + "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|hash x|multisig|success signature + hash x" : [ "S2Oy9yMxw4U=", "OM+/Kdnx2RM=", "9kVgDQimCXg=" ], "txenvelope|protocol version 22|alternative signatures|hash x|single signature|accountMerge signing account" : [ "SbOzbM8vHjA=", "9Ri8Y3cQ3+c=", "YqwqzxCR/18=", "DM0tN76Dmcg=" ], "txenvelope|protocol version 22|alternative signatures|hash x|single signature|failing transaction" : [ "OJt4Wq4WWh4=", "mLRMwOytKz4=" ], @@ -3793,7 +3794,7 @@ "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "ukglCRn+H1c=", "1XO45QW+IzY=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "fOXTkAP6+Yc=", "NGDcehHRD40=" ], - "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=", "EtBHjDTNwGY=" ], + "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "S2Oy9yMxw4U=", "acDsIPAc1xk=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "S2Oy9yMxw4U=", "OJUhNIg6u24=", "vnxV7beju/A=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "lcpiUIcdP8k=" ], "txenvelope|protocol version 22|alternative signatures|payload signer|payload signer in op source account signers" : [ "G/OwBA3vSos=", "P1dCFcOPRtU=", "snLV48WNYB8=" ], @@ -4075,7 +4076,7 @@ "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 23|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4106,7 +4107,7 @@ "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 23|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 23|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4135,7 +4136,7 @@ "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 23|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -4417,7 +4418,7 @@ "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 24|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4448,7 +4449,7 @@ "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 24|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 24|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4477,7 +4478,7 @@ "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 24|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -4759,7 +4760,7 @@ "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 25|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -4790,7 +4791,7 @@ "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 25|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 25|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -4819,7 +4820,7 @@ "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 25|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -5101,7 +5102,7 @@ "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], - "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "ktMxaIuvGCE=" ], + "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 26|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], "txenvelope|protocol version 26|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], @@ -5132,7 +5133,7 @@ "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], "txenvelope|protocol version 26|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], - "txenvelope|protocol version 26|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "jb5pcmVkJsI=" ], + "txenvelope|protocol version 26|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 26|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], "txenvelope|protocol version 26|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], "txenvelope|protocol version 26|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], @@ -5161,7 +5162,7 @@ "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], - "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=", "f/w68qgXhaE=" ], + "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], "txenvelope|protocol version 26|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], "txenvelope|protocol version 26|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], "txenvelope|protocol version 26|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], @@ -5361,6 +5362,348 @@ "txenvelope|protocol version 26|outer envelope|no signature" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 26|outer envelope|too many signatures (signed twice)" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 26|outer envelope|too many signatures (unused signature)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 27|alternative signatures" : + [ + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=" + ], + "txenvelope|protocol version 27|alternative signatures|empty X" : [ "rwNYUsvxUXI=", "CTs4F3izVmM=", "tqnFBwNWLjo=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|hash tx in multiple ops source account signers" : [ "BahzAZdyops=", "CJZk3cmY69I=", "2HyD46LmMA8=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|hash tx in op source account signers" : [ "Zptmmof6T2Y=", "F7WSVIcaxqE=", "Ez+RsXXfABE=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "vDoXGkKmIL0=", "yO7sxtrTA4o=", "rhoNOYGXUZE=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|not enough rights (envelope)" : [ "pBi6zV5UG30=", "pE7scQEyvA4=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "uwKD8d7nQDs=", "4O0eUK8zJjw=", "RbyPfEk2/Pc=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|not enough rights (operation)" : [ "wOOgf22A1h0=", "F5Z0zVK716k=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "UEmhjrgJpZs=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "q3s41oP/EF8=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|success complex sponsored signatures + hash tx" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|multisig|success signature + hash tx" : [ "/Fd+cT3qpVA=", "NPwLVdtvveU=", "D9Hjd9ieti4=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "VMMXCczWGTQ=", "cYW/S95qlrI=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|failing transaction" : [ "fHONewQdf5A=", "jH4e+OTfCg4=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|invalid seq nr" : [ "dZ5tdD9vm78=", "VIsJfF9efF0=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|invalid signature" : [ "WqUldHvceXk=", "hH9fZ7vm6IE=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|merge source account before payment|merge op source account" : [ "wBV3EVc6/MI=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|merge source account before payment|merge tx source account" : [ "UUg8SLWrfeE=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|success" : [ "spOYk57UnbQ=", "LIm07cvW9gk=" ], + "txenvelope|protocol version 27|alternative signatures|hash tx|single signature|too many signatures (signed by owner)" : [ "spOYk57UnbQ=", "zaJVZ8bPECw=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|hash x in multiple ops source account signers" : [ "KhrsPrJeMKQ=", "rno8ihfVJEs=", "qYmHnjWMmKk=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|hash x in op source account signers" : [ "KhrsPrJeMKQ=", "rno8ihfVJEs=", "s5X1c4hu+BY=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "CTs4F3izVmM=", "Yo7IJqAbn4k=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|not enough rights (envelope)" : [ "CTs4F3izVmM=", "7mznDGX+WXE=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "CTs4F3izVmM=", "Yo7IJqAbn4k=", "Vvlp5+YkDFI=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|not enough rights (operation)" : [ "ohgSpru47gc=", "YtKIV7r/oSk=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "96houGP0Jh8=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|success complex sponsored signatures + hash x" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|multisig|success signature + hash x" : [ "/Fd+cT3qpVA=", "eV6DcNABTyo=", "+RCHYuu+aSU=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "TJNGv5LgPN8=", "ro2mgBpBlxo=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|failing transaction" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|invalid seq nr" : [ "/RiyrxZOjJU=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|invalid signature" : [ "oG1CULz/v8Y=", "eCkJR1BQw1A=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|merge source account before payment|merge op source account" : [ "7IYvW4+WPNc=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|merge source account before payment|merge tx source account" : [ "7IYvW4+WPNc=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|success" : [ "/RiyrxZOjJU=", "vApZbfMf4hU=" ], + "txenvelope|protocol version 27|alternative signatures|hash x|single signature|too many signatures (signed by owner)" : [ "/RiyrxZOjJU=", "0hasMHqIhG0=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig" : + [ + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=", + "rwNYUsvxUXI=" + ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|Bad seq num. Same pre auth signer on both tx and op source account" : [ "PZxmNF7cYUQ=", "kyDWcZ1YZl4=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|not enough rights (envelope)" : [ "PZxmNF7cYUQ=", "kXKT2U5Cs5I=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|not enough rights (envelope). Same pre auth signer on both tx and op source account" : [ "PZxmNF7cYUQ=", "kyDWcZ1YZl4=", "Z1A7gJnvV98=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|not enough rights (operation)" : [ "3hDr+yjyKWo=", "mXPcCSSSa94=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|not enough rights on first operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|not enough rights on second operation" : [ "EGBAFNf8Ut4=", "53a2sjG9KyE=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|success complex sponsored signatures + payload signer" : [ "/Fd+cT3qpVA=", "Fpg+KDJL810=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|multisig|success signature + payload signer" : [ "/Fd+cT3qpVA=", "HVY2o2Kplvg=", "RsPk3GA9tx0=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|payload signer in multiple ops source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "jZkIEqNUQiE=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|payload signer in op source account signers" : [ "hWUu+QLCdhQ=", "K2l6Niw712Y=", "XaLU+1YLEno=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|accountMerge signing account" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "+1oPlCoa7Z4=", "Bt5UK97U1xM=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|failing transaction" : [ "QYPt2rHQ69s=", "5yEP9CyFaaQ=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|invalid seq nr" : [ "QYPt2rHQ69s=", "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|invalid signature" : [ "mkVH2A0g9dU=", "Om8GIp++A3w=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|merge source account before payment" : [ "g5OTJaxKfv0=", "/MnOHb7JAbg=", "g5OTJaxKfv0=", "/MnOHb7JAbg=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|merge source account before payment|merge op source account" : [ "z5KjFduen9s=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|merge source account before payment|merge tx source account" : [ "z5KjFduen9s=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|success" : [ "QYPt2rHQ69s=", "lJJazC7dHHE=" ], + "txenvelope|protocol version 27|alternative signatures|payload signer|single signature|too many signatures (signed by owner)" : [ "QYPt2rHQ69s=", "5yEP9CyFaaQ=" ], + "txenvelope|protocol version 27|batching|empty batch" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|batching|non empty" : + [ + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=", + "bsNWqs4A9XQ=", + "YMkJEqvmV7s=" + ], + "txenvelope|protocol version 27|batching|non empty|multiple tx|both success" : [ "ed5VrA2COL0=" ], + "txenvelope|protocol version 27|batching|non empty|multiple tx|one failed tx" : [ "A84rnNwfKjA=" ], + "txenvelope|protocol version 27|batching|non empty|multiple tx|one invalid tx" : [ "A84rnNwfKjA=" ], + "txenvelope|protocol version 27|batching|non empty|operation using default signature" : [ "qV3u/8pEI+M=" ], + "txenvelope|protocol version 27|batching|non empty|single tx wrapped by different account|missing signature" : [ "wkmQXFCYhEg=" ], + "txenvelope|protocol version 27|batching|non empty|single tx wrapped by different account|success" : [ "/T+9YKd7z4w=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction" : + [ + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=", + "InyMhfQUBWA=", + "/jwX2nF6S28=" + ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|change thresholds twice" : [ "o0lSXoiKSFY=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|lower master weight twice" : [ "cx/7twhL5PM=", "d8fZl+7DYKg=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|merge one of signing accounts" : [ "6P5Au3Xd6YU=", "6P5Au3Xd6YU=", "6P5Au3Xd6YU=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|merge one of signing accounts|by destination" : [ "OCN0WlyN8Yk=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|merge one of signing accounts|by source, signed by destination" : [ "pS6cdEpZoJo=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|reduce auth, do something" : [ "na4r5iaBuOo=", "na4r5iaBuOo=", "na4r5iaBuOo=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|reduce auth, do something|single tx|missing signature" : [ "MaloAfduObM=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|reduce auth, do something|single tx|valid" : [ "M81hMcpZjk0=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|switch a into regular account 1" : [ "WonJdB8EWJQ=", "5rtub7YsfE0=" ], + "txenvelope|protocol version 27|change signer and weights mid-transaction|switch a into regular account 2" : [ "WonJdB8EWJQ=", "VSo0Hxrk0xE=" ], + "txenvelope|protocol version 27|common transaction" : + [ + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=", + "bsNWqs4A9XQ=" + ], + "txenvelope|protocol version 27|common transaction|Insufficient fee" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|common transaction|duplicate payment" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|common transaction|time issues|on time" : [ "MIyf3xETJKg=" ], + "txenvelope|protocol version 27|common transaction|time issues|too early" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|common transaction|time issues|too late" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|common transaction|transaction gap" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|ed25519 payload signer" : + [ + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=", + "87LN58OHZJg=" + ], + "txenvelope|protocol version 27|ed25519 payload signer|3 byte payload" : [ "zflp2nEyWqc=", "Fb91c2RSbw4=" ], + "txenvelope|protocol version 27|ed25519 payload signer|4 byte payload" : [ "RvEUbBY6YeU=", "PBSTtzpJ2Nk=" ], + "txenvelope|protocol version 27|ed25519 payload signer|5 byte payload" : [ "FOzfW19Mdqk=", "OkQWWae6OHY=" ], + "txenvelope|protocol version 27|ed25519 payload signer|empty payload in payload signer in extra signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|ed25519 payload signer|payload is tx" : [ "Ixf1E+3uxs0=", "Hre9i3AO5l4=", "9Izn6nScHtM=" ], + "txenvelope|protocol version 27|ed25519 payload signer|payload signer in extra signers|fail" : [ "BktTqnyYnMw=" ], + "txenvelope|protocol version 27|ed25519 payload signer|payload signer in extra signers|success" : [ "1SvvqMBkpYg=" ], + "txenvelope|protocol version 27|ed25519 payload signer|payload signer with zeroed out ed25519" : [ "j3d4BDjfdaE=", "OSpUlVwrpMA=" ], + "txenvelope|protocol version 27|extraSigners" : + [ + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=", + "ZHO0Ty522ik=" + ], + "txenvelope|protocol version 27|extraSigners|duplicate extra signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|extraSigners|duplicate hash card signers" : [ "R6/tPSYNWDY=" ], + "txenvelope|protocol version 27|extraSigners|one extra hashx signer|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 27|extraSigners|one extra hashx signer|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 27|extraSigners|one extra signer|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 27|extraSigners|one extra signer|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 27|extraSigners|preauth signer" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 27|extraSigners|signer overlap with added account signer" : [ "aI/qkx86PSM=", "aI/qkx86PSM=" ], + "txenvelope|protocol version 27|extraSigners|signer overlap with added account signer - both signers used" : [ "aI/qkx86PSM=", "3k/4PoxlEe8=" ], + "txenvelope|protocol version 27|extraSigners|signer overlap with added account signer|signature missing" : [ "QV8nsu6lcwk=" ], + "txenvelope|protocol version 27|extraSigners|signer overlap with added account signer|signature present" : [ "i5GLE8glWZ8=" ], + "txenvelope|protocol version 27|extraSigners|signer overlap with default account signer" : [ "DF8gl+xOXqU=" ], + "txenvelope|protocol version 27|extraSigners|two extra signers|fail" : [ "6MhV958wwbQ=" ], + "txenvelope|protocol version 27|extraSigners|two extra signers|success" : [ "6IJ1mLDSrTA=" ], + "txenvelope|protocol version 27|multisig" : + [ + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=", + "bsNWqs4A9XQ=", + "SQtyBss4WvM=", + "s0BXIC6cUEo=" + ], + "txenvelope|protocol version 27|multisig|account locked down" : [ "aY3ARmof8NE=", "0H1IgRarsek=" ], + "txenvelope|protocol version 27|multisig|do not allow duplicate signature" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 27|multisig|not enough rights (envelope)" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 27|multisig|not enough rights (first signer)" : [ "laAzyxeZuKE=" ], + "txenvelope|protocol version 27|multisig|not enough rights (first thresholds)" : [ "laAzyxeZuKE=" ], + "txenvelope|protocol version 27|multisig|not enough rights (operation, together)" : [ "X6QHJyWOdpY=" ], + "txenvelope|protocol version 27|multisig|success two signatures, first signer" : [ "thXzNwPU0Ys=" ], + "txenvelope|protocol version 27|multisig|success two signatures, first thresholds" : [ "thXzNwPU0Ys=" ], + "txenvelope|protocol version 27|multisig|success two signatures, together" : [ "MYbC+RJv5Js=" ], + "txenvelope|protocol version 27|multisig|without master key" : [ "u0xZ7kST12g=", "u0xZ7kST12g=" ], + "txenvelope|protocol version 27|multisig|without master key|good tx" : [ "Y6I7h/K3QhE=" ], + "txenvelope|protocol version 27|multisig|without master key|master key is extra" : [ "yOZG7A3j6SY=" ], + "txenvelope|protocol version 27|mux accounts" : [ "bsNWqs4A9XQ=", "bsNWqs4A9XQ=" ], + "txenvelope|protocol version 27|mux accounts|dest account" : [ "zzCg6Wknl90=" ], + "txenvelope|protocol version 27|mux accounts|src account" : [ "zzCg6Wknl90=" ], + "txenvelope|protocol version 27|outer envelope|bad signature" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 27|outer envelope|bad signature (wrong hint)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 27|outer envelope|no signature" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 27|outer envelope|too many signatures (signed twice)" : [ "Zby/J3+a3+M=" ], + "txenvelope|protocol version 27|outer envelope|too many signatures (unused signature)" : [ "Zby/J3+a3+M=" ], "txenvelope|protocol version 2|alternative signatures" : [ "49rU55h6rBs=", diff --git a/test-tx-meta-baseline-next/TxResultsTests.json b/test-tx-meta-baseline-next/TxResultsTests.json index 506d141abc..e2eccc9d57 100644 --- a/test-tx-meta-baseline-next/TxResultsTests.json +++ b/test-tx-meta-baseline-next/TxResultsTests.json @@ -1,6 +1,6 @@ { - "!cfg protocol version" : 26, + "!cfg protocol version" : 27, "!rng seed" : 12345, "!test all versions" : true, "!versions to test" : @@ -31,7 +31,8 @@ 23, 24, 25, - 26 + 26, + 27 ], "txresults|protocol version 0" : [ @@ -3877,6 +3878,199 @@ "txresults|protocol version 26|not enough signature weight|before tx" : [ "R51x7z7h5Zw=" ], "txresults|protocol version 26|not enough signature weight|normal" : [ "gp2J7tvctEY=" ], "txresults|protocol version 26|not enough signature weight|with operation after" : [ "4P8x4nLbeOU=" ], + "txresults|protocol version 27" : + [ + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=", + "Z9fjJ3M0iTc=", + "4gfEhJW7g4o=", + "VpKffnLrgNI=", + "DSyVH0E6Sho=", + "Opi2x5sJhyo=", + "E43kgd2ZO54=" + ], + "txresults|protocol version 27|create account|normal" : [ "RHQgioGEE04=" ], + "txresults|protocol version 27|create account|with payment after" : [ "pEg9scPYtzg=" ], + "txresults|protocol version 27|fees with liabilities" : [ "ykK4qLMIdWU=", "ykK4qLMIdWU=" ], + "txresults|protocol version 27|fees with liabilities|buying liabilities" : [ "bBEmCuCcPW0=", "huxHnrofXJw=" ], + "txresults|protocol version 27|fees with liabilities|selling liabilities" : [ "L6xveLuxMvs=" ], + "txresults|protocol version 27|merge account|normal" : [ "5Hc2qkhawS0=" ], + "txresults|protocol version 27|merge account|with operation after" : [ "/QqVExssKBQ=" ], + "txresults|protocol version 27|not enough signature weight|before tx" : [ "R51x7z7h5Zw=" ], + "txresults|protocol version 27|not enough signature weight|normal" : [ "gp2J7tvctEY=" ], + "txresults|protocol version 27|not enough signature weight|with operation after" : [ "4P8x4nLbeOU=" ], "txresults|protocol version 2|create account|normal" : [ "SySR+eR5Mwo=" ], "txresults|protocol version 2|create account|with payment after" : [ "XxNMjyQ/39I=" ], "txresults|protocol version 2|fees with liabilities" : [ "YZfznGXhWYA=", "YZfznGXhWYA=" ],