Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem: testground infra is not easy to setup #1504

Merged
merged 16 commits into from
Jul 5, 2024

Conversation

yihuang
Copy link
Collaborator

@yihuang yihuang commented Jul 3, 2024

Solution:

  • most of the features of testground are not really used by us yet, so for a simple benchmark to get a TPS result, it's possible to do an alternative setup. the alternative implementation setup all the node data files in advance, then run the nodes in containers in a stateless manner, they don't need any coordinations at runtime, so we don't need those infrastructures to support the coordinations, just deploy the testplan image to the cluster like a stateless service.

👮🏻👮🏻👮🏻 !!!! REFERENCE THE PROBLEM YOUR ARE SOLVING IN THE PR TITLE AND DESCRIBE YOUR SOLUTION HERE !!!! DO NOT FORGET !!!! 👮🏻👮🏻👮🏻

PR Checklist:

  • Have you read the CONTRIBUTING.md?
  • Does your PR follow the C4 patch requirements?
  • Have you rebased your work on top of the latest master?
  • Have you checked your code compiles? (make)
  • Have you included tests for any non-trivial functionality?
  • Have you checked your code passes the unit tests? (make test)
  • Have you checked your code formatting is correct? (go fmt)
  • Have you checked your basic code style is fine? (golangci-lint run)
  • If you added any dependencies, have you checked they do not contain any known vulnerabilities? (go list -json -m all | nancy sleuth)
  • If your changes affect the client infrastructure, have you run the integration test?
  • If your changes affect public APIs, does your PR follow the C4 evolution of public contracts?
  • If your code changes public APIs, have you incremented the crate version numbers and documented your changes in the CHANGELOG.md?
  • If you are contributing for the first time, please read the agreement in CONTRIBUTING.md now and add a comment to this pull request stating that your PR is in accordance with the Developer's Certificate of Origin.

Thank you for your code, it's appreciated! :)

Summary by CodeRabbit

  • New Features

    • Introduced stateless mode for easier cluster setup.
    • Added functionality for generating nodes, preparing genesis files, and managing node roles in simulations.
    • Added Docker configuration for spawning multiple containers.
  • Enhancements

    • Improved test account funding and transaction generation with threading support.
    • Refactored peer setup process and updated node initialization logic.
  • Documentation

    • Added a new section on "Stateless Mode" in the README with setup instructions.

yihuang and others added 2 commits July 3, 2024 17:15
Solution:
- most of the features of testground are not really used by us yet, so
  for a simple benchmark to get a TPS result, it's possible to do an
  alternative setup.
  the alternative implementation setup all the node data files in
  advance, then run the nodes in containers in a stateless manner, they
  don't need any coordinations at runtime, so we don't need those
  infrastructures to support the coordinations, just deploy the testplan
  image to the cluster like a stateless service.
Copy link
Contributor

coderabbitai bot commented Jul 3, 2024

Walkthrough

The project enhancements encapsulate better organization and efficiency in the testing framework, particularly its blockchain simulation component. Key improvements include reorganized imports, streamlined paths, new and refined functions for node initialization and transaction generation, and the incorporation of stateless mode for simplified cluster setups. These changes significantly improve how nodes are initialized, transactions are generated, and clusters are set up and managed within the Docker environment.

Changes

Files Summary of Changes
testground/benchmark/benchmark/main.py Reorganized imports, updated module paths, refactored function calls, and replaced code blocks.
testground/benchmark/benchmark/peer.py Significant module modifications: introduced new functions, restructured control flow, updated constants.
testground/benchmark/benchmark/sendtx.py Added multi-threaded transaction generation and result collection functions.
testground/benchmark/benchmark/stateless.py Introduced new file for stateless node generation and configuration for blockchain simulations.
testground/benchmark/benchmark/utils.py Modified export_eth_account function to include **kwargs and default keyring_backend value.
testground/compositions/docker-compose.jsonnet Added Docker configuration to spawn multiple containers for test plans using a specified image.
flake.nix Added stateless-testcase app to the configuration for Docker deployment.
testground/README.md Added "Stateless Mode" section providing setup instructions for local and Docker-based environments.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Main
    participant Peer
    participant SendTx
    participant Stateless
    participant Docker

    User->>+Main: Initiate Test
    Main->>+Docker: Start Docker Containers
    Docker-->>-Main: Containers Running
    Main->>+Peer: Bootstrap Nodes
    Peer->>SendTx: Generate Transactions
    SendTx->>Main: Load Generated
    User->>+Stateless: Run Stateless Mode
    Stateless->>+Peer: Initialize Nodes
    Peer->>Stateless: Nodes Initialized
    Stateless->>+Main: Nodes Active with config
Loading

Poem

Amidst the code that swiftly flows,
New nodes and paths the project grows.
Transactions spin through threads anew,
In Docker's dance, containers brew.
Stateless setups now take flight,
In blockchain dreams, we code the night.
🐇💻✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@yihuang yihuang marked this pull request as ready for review July 4, 2024 07:39
@yihuang yihuang requested a review from a team as a code owner July 4, 2024 07:39
@yihuang yihuang requested review from mmsqe and JayT106 and removed request for a team July 4, 2024 07:39
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 1a791bd and 59e953f.

Files ignored due to path filters (1)
  • testground/benchmark/poetry.lock is excluded by !**/*.lock
Files selected for processing (7)
  • testground/benchmark/benchmark/main.py (3 hunks)
  • testground/benchmark/benchmark/peer.py (3 hunks)
  • testground/benchmark/benchmark/sendtx.py (2 hunks)
  • testground/benchmark/benchmark/stateless.py (1 hunks)
  • testground/benchmark/benchmark/utils.py (1 hunks)
  • testground/benchmark/compositions/docker-compose.jsonnet (1 hunks)
  • testground/benchmark/pyproject.toml (2 hunks)
Files skipped from review due to trivial changes (1)
  • testground/benchmark/compositions/docker-compose.jsonnet
Additional context used
Ruff
testground/benchmark/benchmark/main.py

30-30: Use context handler for opening files

(SIM115)

testground/benchmark/benchmark/stateless.py

5-5: time imported but unused

Remove unused import: time

(F401)


79-79: Use context handler for opening files

(SIM115)


95-98: Use contextlib.suppress(subprocess.TimeoutExpired) instead of try-except-pass

Replace with contextlib.suppress(subprocess.TimeoutExpired)

(SIM105)

GitHub Check: Lint python
testground/benchmark/benchmark/utils.py

[failure] 98-98:
./testground/benchmark/benchmark/utils.py:98:29: BLK100 Black would make changes.

testground/benchmark/benchmark/stateless.py

[failure] 5-5:
./testground/benchmark/benchmark/stateless.py:5:1: F401 'time' imported but unused


[failure] 12-12:
./testground/benchmark/benchmark/stateless.py:12:20: BLK100 Black would make changes.

Additional comments not posted (17)
testground/benchmark/pyproject.toml (1)

17-17: LGTM!

The additions of the fire dependency and the stateless-testcase script are appropriate and align with the project's requirements.

Also applies to: 28-28

testground/benchmark/benchmark/main.py (2)

9-10: LGTM!

The import of generate_load from sendtx is appropriate and aligns with the functionality needed in the entrypoint function.


39-39: LGTM!

The call to generate_load is correctly placed within the entrypoint function.

testground/benchmark/benchmark/sendtx.py (2)

2-2: LGTM!

The import of ThreadPoolExecutor and as_completed is appropriate for handling concurrent operations.


60-71: LGTM! Ensure proper error handling in threaded operations.

The generate_load function is well-structured for generating load with multiple accounts and transactions. Ensure that proper error handling and resource management are in place within the threaded operations.

testground/benchmark/benchmark/utils.py (1)

96-99: LGTM!

The changes to export_eth_account enhance flexibility and usability by allowing additional keyword arguments and setting a default value for keyring_backend.

Tools
GitHub Check: Lint python

[failure] 98-98:
./testground/benchmark/benchmark/utils.py:98:29: BLK100 Black would make changes.

testground/benchmark/benchmark/stateless.py (4)

101-112: LGTM!

The function is correctly implemented.


114-126: LGTM!

The function is correctly implemented.


128-138: LGTM!

The function is correctly implemented.


141-146: LGTM!

The function is correctly implemented.

testground/benchmark/benchmark/peer.py (7)

6-21: LGTM!

The imports and constants are correctly defined.


24-51: LGTM!

The function is correctly implemented.


54-94: LGTM!

The function is correctly implemented.


97-115: LGTM!

The function is correctly implemented.


Line range hint 119-139:
LGTM!

The function is correctly implemented.


142-161: LGTM!

The function is correctly implemented.


Line range hint 164-174:
LGTM!

The function is correctly implemented.

testground/benchmark/benchmark/utils.py Outdated Show resolved Hide resolved
testground/benchmark/benchmark/stateless.py Outdated Show resolved Hide resolved
testground/benchmark/benchmark/stateless.py Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 59e953f and 9d94f94.

Files selected for processing (3)
  • testground/benchmark/benchmark/stateless.py (1 hunks)
  • testground/benchmark/benchmark/utils.py (1 hunks)
  • testground/benchmark/pyproject.toml (2 hunks)
Files skipped from review as they are similar to previous changes (2)
  • testground/benchmark/benchmark/utils.py
  • testground/benchmark/pyproject.toml
Additional context used
Ruff
testground/benchmark/benchmark/stateless.py

84-84: Use context handler for opening files

(SIM115)


100-103: Use contextlib.suppress(subprocess.TimeoutExpired) instead of try-except-pass

Replace with contextlib.suppress(subprocess.TimeoutExpired)

(SIM105)

Additional comments not posted (7)
testground/benchmark/benchmark/stateless.py (7)

41-41: Consider adding logging instead of print statements.

Using a logging framework instead of print statements provides more control over the logging levels and outputs.

- print("init validator", i)
+ logging.info("init validator %d", i)
...
- print("init fullnode", i)
+ logging.info("init fullnode %d", i)
...
- print("prepare genesis")
+ logging.info("prepare genesis")
...
- print("patch genesis")
+ logging.info("patch genesis")

Also applies to: 44-44, 49-49, 53-53


81-85: Use context manager for opening files.

Using a context manager ensures that the file is properly closed after its operations are done.

- logfile = home / "node.log"
- proc = subprocess.Popen(
-     [cronosd, "start", "--home", str(home)],
-     stdout=open(logfile, "ab", buffering=0),
- )
+ logfile = home / "node.log"
+ with open(logfile, "ab", buffering=0) as log:
+     proc = subprocess.Popen(
+         [cronosd, "start", "--home", str(home)],
+         stdout=log,
+     )
Tools
Ruff

84-84: Use context handler for opening files

(SIM115)


100-103: Use contextlib.suppress for handling subprocess.TimeoutExpired.

Using contextlib.suppress makes the code cleaner and more readable.

- try:
-     proc.wait()
- except subprocess.TimeoutExpired:
-     pass
+ import contextlib
+ with contextlib.suppress(subprocess.TimeoutExpired):
+     proc.wait()
Tools
Ruff

100-103: Use contextlib.suppress(subprocess.TimeoutExpired) instead of try-except-pass

Replace with contextlib.suppress(subprocess.TimeoutExpired)

(SIM105)


106-116: LGTM!

The function init_node_local is a straightforward wrapper around init_node.


119-130: LGTM!

The function patch_configs_local writes the genesis file and patches the configuration files.


133-143: LGTM!

The function node_index determines the node index based on environment variables or the hostname.


146-147: LGTM!

The function main initializes the CLI using the Fire library.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 9d94f94 and 092f482.

Files selected for processing (4)
  • flake.nix (1 hunks)
  • testground/README.md (2 hunks)
  • testground/benchmark/compositions/docker-compose.jsonnet (1 hunks)
  • testground/benchmark/flake.nix (1 hunks)
Files skipped from review due to trivial changes (1)
  • flake.nix
Files skipped from review as they are similar to previous changes (1)
  • testground/benchmark/compositions/docker-compose.jsonnet
Additional context used
LanguageTool
testground/README.md

[uncategorized] ~76-~76: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ess Mode To simplify cluster setup, we introduce a stateless mode. ## Generate Data Fil...

(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)

Markdownlint
testground/README.md

72-72: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


73-73: Expected: 1; Actual: 3
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


83-83: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)


89-89: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)


74-74: null
Multiple top-level headings in the same document

(MD025, single-title, single-h1)

Additional comments not posted (4)
testground/README.md (2)

80-84: LGTM!

The instructions for generating data files locally are clear and accurate.

Tools
Markdownlint

83-83: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)


88-90: LGTM!

The instructions for running the setup in a local Docker environment are clear and accurate.

Tools
Markdownlint

89-89: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)

testground/benchmark/flake.nix (2)

72-75: LGTM!

The stateless-testcase app configuration is correct and consistent.


Line range hint 1-71:
LGTM!

The overall configuration is accurate and consistent.

testground/README.md Show resolved Hide resolved
testground/README.md Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Outside diff range and nitpick comments (1)
testground/benchmark/benchmark/stateless.py (1)

32-61: Consider adding logging instead of print statements.

Using a logging framework instead of print statements provides more control over the logging levels and outputs.

-            print("init validator", i)
+            logging.info("init validator %d", i)
...
-            print("init fullnode", i)
+            logging.info("init fullnode %d", i)
...
-        print("prepare genesis")
+        logging.info("prepare genesis")
...
-        print("patch genesis")
+        logging.info("patch genesis")
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 092f482 and 8ecd342.

Files selected for processing (3)
  • testground/benchmark/benchmark/main.py (3 hunks)
  • testground/benchmark/benchmark/sendtx.py (2 hunks)
  • testground/benchmark/benchmark/stateless.py (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • testground/benchmark/benchmark/sendtx.py
Additional context used
Ruff
testground/benchmark/benchmark/main.py

28-28: Use context handler for opening files

(SIM115)

testground/benchmark/benchmark/stateless.py

84-84: Use context handler for opening files

(SIM115)


100-103: Use contextlib.suppress(subprocess.TimeoutExpired) instead of try-except-pass

Replace with contextlib.suppress(subprocess.TimeoutExpired)

(SIM105)

Additional comments not posted (10)
testground/benchmark/benchmark/main.py (5)

7-9: Imports look good.

The updated imports are necessary for the new functionality.


19-19: Initialize ChainCommand instance correctly.

The initialization of the ChainCommand instance with CONTAINER_CRONOSD_PATH looks correct.


37-37: Generate load if not a validator.

The logic to generate load if the context is not a validator looks correct.


44-44: Collect output if fullnode leader.

The logic to collect output if the context is a fullnode leader looks correct.


Line range hint 60-60:
Main function looks good.

The main function initializes the context and runs the appropriate test case correctly.

testground/benchmark/benchmark/stateless.py (5)

1-22: Imports look good.

The updated imports are necessary for the functionality in the file.


106-117: Function looks good.

The init_node_local function correctly initializes the node with the given parameters.


119-131: Function looks good.

The patch_configs_local function correctly patches the configuration files with the given parameters.


133-143: Function looks good.

The node_index function correctly determines the node index based on the given logic.


146-147: Main function looks good.

The main function correctly initializes the CLI class with fire.Fire.

testground/benchmark/benchmark/main.py Show resolved Hide resolved
testground/benchmark/benchmark/stateless.py Outdated Show resolved Hide resolved
testground/benchmark/benchmark/stateless.py Outdated Show resolved Hide resolved
yihuang and others added 3 commits July 5, 2024 09:46
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: yihuang <huang@crypto.com>
This reverts commit 8ecd342.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 8ecd342 and 8248973.

Files selected for processing (1)
  • testground/README.md (2 hunks)
Additional context used
Markdownlint
testground/README.md

72-72: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


73-73: Expected: 1; Actual: 3
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


83-83: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)


89-89: null
Dollar signs used before commands without showing output

(MD014, commands-show-output)


74-74: null
Multiple top-level headings in the same document

(MD025, single-title, single-h1)

Additional comments not posted (1)
testground/README.md (1)

76-76: Fix: Correct verb tense.

The verb "introduce" should be changed to fit the context better.

- To simplify cluster setup, we introduce a stateless mode.
+ To simplify cluster setup, we are introducing a stateless mode.

Likely invalid or redundant comment.

testground/README.md Show resolved Hide resolved
testground/README.md Show resolved Hide resolved
testground/README.md Show resolved Hide resolved
testground/README.md Show resolved Hide resolved
@yihuang yihuang changed the title Problem: no simpler benchmark setup Problem: testground infra is not easy to setup Jul 5, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Outside diff range and nitpick comments (1)
testground/benchmark/benchmark/stateless.py (1)

32-61: Consider adding logging instead of print statements.

Using a logging framework instead of print statements provides more control over the logging levels and outputs.

- print("init validator", i)
+ logging.info("init validator %d", i)
...
- print("init fullnode", i)
+ logging.info("init fullnode %d", i)
...
- print("prepare genesis")
+ logging.info("prepare genesis")
...
- print("patch genesis")
+ logging.info("patch genesis")
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 8248973 and 9e798f1.

Files selected for processing (3)
  • testground/benchmark/benchmark/main.py (3 hunks)
  • testground/benchmark/benchmark/sendtx.py (2 hunks)
  • testground/benchmark/benchmark/stateless.py (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • testground/benchmark/benchmark/sendtx.py
Additional context used
Ruff
testground/benchmark/benchmark/main.py

30-30: Use context handler for opening files

(SIM115)

testground/benchmark/benchmark/stateless.py

84-84: Use context handler for opening files

(SIM115)

Additional comments not posted (9)
testground/benchmark/benchmark/main.py (5)

9-11: Approved: Necessary imports.

The imports from peer.py and sendtx.py are necessary for the new functionality.


21-21: Approved: Correct initialization.

The ChainCommand initialization with CONTAINER_CRONOSD_PATH is correct and necessary for the new functionality.


39-39: Approved: Correct load generation.

The generate_load function is correctly used to generate load with the specified number of accounts and transactions.


Line range hint 50-50:
Approved: Correct context initialization.

The Context initialization and test case execution are correct and necessary for the new functionality.


29-29: Use context handler for opening files.

To ensure proper resource management and avoid potential file descriptor leaks, use a context handler for opening files.

-        stdout=open(logfile, "ab", buffering=0),
+        with open(logfile, "ab", buffering=0) as log:
+            proc = subprocess.Popen(
+                [CONTAINER_CRONOSD_PATH, "start"],
+                stdout=log,
+            )

Likely invalid or redundant comment.

testground/benchmark/benchmark/stateless.py (4)

1-22: Approved: Necessary imports.

The added imports from various modules are necessary for the new functionality.


102-113: Approved: Correct node initialization.

The init_node_local function correctly initializes a node with the specified parameters.


115-127: Approved: Correct configuration patching.

The patch_configs_local function correctly writes the genesis file and patches the config files.


129-139: Approved: Correct node index retrieval.

The node_index function correctly returns the node index based on the environment or hostname.

testground/benchmark/benchmark/stateless.py Show resolved Hide resolved
@yihuang yihuang enabled auto-merge July 5, 2024 03:01
@yihuang yihuang added this pull request to the merge queue Jul 5, 2024
Merged via the queue into crypto-org-chain:main with commit aef58bb Jul 5, 2024
42 checks passed
@yihuang yihuang deleted the more-test-fund branch July 5, 2024 03:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants