Skip to content

refactor(api): remove dead WalletExtension gRPC service and config - #17

Open
0xbigapple wants to merge 20 commits into
developfrom
feature/remove-wallet-extension-service
Open

0xbigapple wants to merge 20 commits into
developfrom
feature/remove-wallet-extension-service

Conversation

@0xbigapple

@0xbigapple 0xbigapple commented Aug 7, 2026 •

Copy link
Copy Markdown
Owner

What does this PR do?

Removes the dead WalletExtension gRPC service and everything reachable only from it:

  • api.proto: service WalletExtension (GetTransactionsFromThis/2, GetTransactionsToThis/2), plus messages AccountPaginated, TransactionList, TransactionListExtention (referenced only by these four RPCs) and TimeMessage / TimePaginatedMessage (request types of the WalletExtension *ByTimestamp RPCs deleted in 2018, orphaned ever since)
  • RpcApiService: the registration branch and the empty WalletExtensionApi inner class
  • The node.walletExtensionApi config item: CommonParameter / NodeConfig fields, the Args binding, and the key in reference.conf / config.conf / config-shield.conf. Following the retirement convention for node.* keys, NodeConfig.fromConfig now logs a removal warning when the old key is still present in an operator config
  • Dead code only reachable from the above: Util.printTransactionList (sole caller was its own mock test), the WalletExtension stub and wrappers in test utilities GrpcClient / WalletClient, HttpMethed.getTransactions{From,To}ThisFromSolidity (targets /walletextension/* HTTP paths that have no servlet), and commented-out getTransactionsByTimestamp / getAssetIssueListByTimestamp blocks

Why are these changes required?

WalletExtension has had no implementation in any release since v3.7 (2020-03): RpcApiService$WalletExtensionApi overrides none of the four RPCs, so every call falls through to the generated ImplBase default handlers and returns UNIMPLEMENTED. This makes node.walletExtensionApi behavior-irrelevant — enabled, it registers a service with zero implemented methods; disabled, callers get the same UNIMPLEMENTED. The only observable effect of enabling it is that gRPC reflection advertises a service that always fails. Removing it also resolves the default-value inconsistency between config.conf (true) and reference.conf (false).

Six years of unconditional UNIMPLEMENTED rules out any functional dependency, so the service is removed directly without a deprecation period, following existing practice for dead interfaces.

This PR has been tested by:

  • Unit Tests: ParameterTest (2), ArgsTest (21), UtilMockTest (19) all green; ./gradlew clean build -x test + Checkstyle pass; regenerated protobuf no longer contains WalletExtensionGrpc or the three messages; full-repo grep for WalletExtension|walletExtensionApi|AccountPaginated|TransactionsFromThis|TransactionsToThis has zero hits
  • Manual Testing: smoke-tested a FullNode with a leftover node.walletExtensionApi = true key in its config — the node starts normally with zero log mentions (the key is silently ignored, since ConfigBeanFactory only validates bean-side properties), and grpcurl reflection lists only protocol.Database / protocol.Wallet

Follow up

Ecosystem code that still compiles against the removed stubs/messages needs a sync: the tronprotocol/protocol mirror, the documentation site, and older wallet-cli/trident versions. Compile-time impact only — runtime behavior is unchanged (UNIMPLEMENTED before and after).

Extra details

None.


Summary by cubic

Removed the dead WalletExtension gRPC service and the node.walletExtensionApi config so the API surface stops advertising a service that always returns UNIMPLEMENTED. The old config key is now ignored and logs a warning; runtime behavior is unchanged. The branch also carries the 4.8.2.3 release line: a TVM storage optimization gated by the new ALLOW_OPTIMIZE_TVM_STORAGE proposal, CPU-time checks for self-destructed and invalid-delegated-V2 accounts, dependency upgrades (grpc 1.83.1, netty 4.2.15, jackson 2.18.10, logback 1.3.16; joda-time and commons-math dropped), and sanitized HTTP/JSON-RPC error responses that no longer leak stack traces or exception class names.

  • Refactors
    • Deleted service WalletExtension and its messages from api.proto, the empty WalletExtensionApi, and the dead helpers (Util.printTransactionList, gRPC stubs, /walletextension/* HTTP methods).
    • Dropped node.walletExtensionApi bindings/defaults; NodeConfig.fromConfig warns when the key is still present.
  • Migration
    • Remove downstream references to WalletExtensionGrpc and the removed messages; the old config key is ignored with a warning.

Written for commit af2f8ce. Summary will update on new commits.

View guided diff Turn on auto-fix

Summary by CodeRabbit

  • Breaking Changes
    • Removed the Wallet Extension API and its transaction-query endpoints.
    • Removed related transaction-list response types and client request methods.
  • Configuration
    • Removed the walletExtensionApi setting from supported configuration files.
    • Existing configurations using this setting are ignored with a warning.
  • Maintenance
    • Retained database, wallet, Solidity wallet, and monitoring services.
    • Updated supporting utilities and tests to reflect the retired API surface.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026 •

Copy link
Copy Markdown

Review Change Stack

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7e818499-0d7a-4298-9f0c-4879e914a779

📝 Walkthrough

Walkthrough

The pull request removes the Wallet Extension gRPC service, transaction-list protocol messages, related configuration, server integration, utility methods, client helpers, and obsolete tests. Removed configuration keys are ignored with a warning.

Changes

Wallet Extension API removal

Layer / File(s) Summary
Protocol contract removal
protocol/src/main/protos/api/api.proto
Removes the WalletExtension service and the TransactionList, TimeMessage, AccountPaginated, and TransactionListExtention messages.
Runtime configuration and server cleanup
common/src/main/java/org/tron/common/parameter/CommonParameter.java, common/src/main/java/org/tron/core/config/args/NodeConfig.java, common/src/main/resources/reference.conf, framework/src/main/java/org/tron/core/config/args/Args.java, framework/src/main/java/org/tron/core/services/RpcApiService.java, framework/src/main/java/org/tron/core/services/http/Util.java, framework/src/main/resources/config.conf
Removes the wallet extension configuration, parameter propagation, RPC integration, and transaction-list JSON serialization helper. NodeConfig ignores the removed configuration key and logs a warning.
Client and test cleanup
framework/src/test/java/org/tron/common/utils/client/*, framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java, framework/src/test/java/org/tron/common/ParameterTest.java, framework/src/test/java/org/tron/core/services/http/UtilMockTest.java, framework/src/test/resources/config-shield.conf, common/src/test/java/org/tron/core/config/args/NodeConfigTest.java
Removes extension stubs and address transaction-query helpers. Removes obsolete configuration entries and tests. Adds coverage for ignoring the removed configuration key.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers: 317787106


🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the removal of the dead WalletExtension gRPC service and related configuration.


✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/remove-wallet-extension-service



Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 14 files

Re-trigger cubic

@0xbigapple

0xbigapple commented Aug 7, 2026 •

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 7, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@0xbigapple
0xbigapple force-pushed the feature/remove-wallet-extension-service branch from 1203572 to 097c797 Compare August 10, 2026 07:14
@0xbigapple 0xbigapple changed the title feat(api): remove dead WalletExtension gRPC service and config refactor(api): remove dead WalletExtension gRPC service and config Aug 10, 2026
The four WalletExtension RPCs have returned UNIMPLEMENTED since 2019;
the service was only registered on solidity nodes behind
node.walletExtensionApi, which config.conf enabled but reference.conf
disabled. Remove the service, its now-unreferenced messages (including
the TimeMessage/TimePaginatedMessage orphans left by the 2018 RPC
removal), the config key, and the dead client/test helpers. Log a
removal warning when the old key is still present in operator configs.
@0xbigapple
0xbigapple force-pushed the feature/remove-wallet-extension-service branch from 097c797 to ca08100 Compare August 10, 2026 07:51
CodeNinjaEvan and others added 18 commits September 8, 2026 20:35
* feat: optimize delegate and undelegate instruction handling (tronprotocol#6920)

Co-authored-by: Asuka <yanghang8612@163.com>

* perf: optimize jump table initialization and reuse (tronprotocol#6943)

Co-authored-by: Asuka <yanghang8612@163.com>

* feat: refine contract deployment transaction validation (tronprotocol#6945)

Co-authored-by: Asuka <yanghang8612@163.com>

* ci: run single-node smoke only and disable multinode (backport tronprotocol#6908 to release_v4.8.2.2) (tronprotocol#6953)

Backport of tronprotocol#6908 to the release_v4.8.2.2 branch so CI passes there:

- Switch the single-node integration CI to the smoke test subset
  (--clean --smoke instead of the full suite), renaming workflow,
  job, steps, and report artifact from "Full" to "Smoke"
- Remove the multinode integration CI workflow entirely; the full
  single-node suite and the multinode suite are unstable in CI today
  (hardened assertions don't match the troninfra/troninfra-ci image
  fixture), causing failures unrelated to PR code

---------

Co-authored-by: ouy95917 <ouy95917@gmail.com>
Co-authored-by: Asuka <yanghang8612@163.com>
Co-authored-by: Jeremy Zhang <50477615+warku123@users.noreply.github.com>
chore(branch): merge master into develop
…#6930)

Node and network API responses populated two fields from the wrong source values because of copy-and-paste mapping errors.

Map needSyncFromPeer from the corresponding peer state and assign UDP inbound traffic to the udpInTraffic protobuf field.
…me (tronprotocol#6950)

* chore(deps): upgrade grpc-java from 1.83.0 to 1.83.1

1. bump grpcVersion to 1.83.1 to pick up the upstream fix for
   grpc/grpc-java#12930 (PR grpc/grpc-java#12942), which enforces
   connection.remote().maxActiveStreams(maxStreams) at handler startup
2. drop GrpcNettyMaxConcurrentStreamsLimiter, the local protocol-negotiator
   shim that applied the same limit while 1.83.0 left the remote endpoint
   unbounded until the client acknowledged SETTINGS

* chore(deps): upgrade jackson from 2.18.6 to 2.18.10

bump jackson-databind from 2.18.6 to 2.18.10 to pick up cumulative fixes from the 2.18.x line

* chore(deps): upgrade logback to 1.3.16 and slf4j to 2.0.17

1. bump logback-classic from 1.2.13 to 1.3.16 and slf4j-api,
   jcl-over-slf4j, jul-to-slf4j from 1.7.36 to 2.0.17; logback 1.3
   requires the slf4j 2.0 provider model, and 1.3.16 is the last 1.3.x
   release and the ceiling for the x86_64 JDK 8 build, since 1.5.x
   requires JDK 11
2. rename DelayingShutdownHook to DefaultShutdownHook in the toolkit
   logback.xml; logback 1.3 removed the old class and only auto-maps
   the legacy name with a startup warning
3. drop the CONSOLE appender from the toolkit logback.xml; no logger
   ever referenced it, so it never emitted output on 1.2 either, and
   logback 1.3 now flags it with an unreferenced-appender warning
4. accept one known 1.3.x behavior change: SizeAndTimeBasedRollingPolicy
   now throttles its maxFileSize comparison to once per 60s
   (SimpleInvocationGate) instead of the adaptive ~100-800ms gate of
   1.2.13, so under sustained heavy logging a file can overshoot the
   500MB cap by up to 60s of writes before the %i rollover fires;
   time-based rollover and totalSizeCap/maxHistory cleanup are ungated
   and unaffected
5. note for operators running a custom --log-config file: well-formed
   1.2-era configs using standard elements keep working unchanged
   (jmxConfigurator degrades to an ignored-property warning, the legacy
   shutdown hook name is auto-mapped), and malformed XML still fails
   fast via TronError(LOG_LOAD) exactly as on 1.2; however, a config
   that references an uninstantiable class (e.g. a custom appender
   missing from the classpath) now aborts the whole appender-ref phase
   instead of losing just that one appender, so the node starts with no
   log output while the ERROR statuses are printed to stdout by
   LogService

* chore(deps): upgrade commons-lang3/collections4 and drop commons-math

1. bump commons-lang3 from 3.4 to 3.20.0; the runtime classpath already
   resolved 3.18.0 through libp2p 2.2.9's transitive requirement, so
   align the declaration with what actually ships and move past the
   CVE-2025-48924 range that the nominal 3.4 still sits in
2. bump commons-collections4 from 4.1 to 4.6.0
3. remove commons-math 2.2; no source file imports
   org.apache.commons.math and nothing else in the dependency graph
   requests it

* chore(deps): remove joda-time and use JDK time APIs

1. drop the joda-time 2.3 dependency.
2. replace the six new DateTime(millis) log-formatting call sites in
   DynamicPropertiesStore, DposTask and DposService with a new
   Time.getIsoTimeString helper backed by java.time; its formatter
   (yyyy-MM-dd'T'HH:mm:ss.SSSXXX in the system zone) reproduces joda's
   DateTime.toString() output byte for byte where the JDK and joda 2.3
   time-zone databases agree (UTC nodes are unaffected); zones whose
   rules changed after joda's 2013-era tzdb, e.g. Europe/Moscow, now
   render the corrected offset for the same instant.
3. replace DateTime.now() day arithmetic in four test classes with the
   java.time equivalent, ZonedDateTime.now().minusDays(n)/plusDays(n)
   .toInstant().toEpochMilli(), keeping joda's calendar semantics
   one-to-one, and map plain DateTime.now().getMillis() to
   System.currentTimeMillis()
* feat(api): sanitize HTTP API error responses

Standard HTTP error paths used to expose internal details to clients:
Util.processError prefixed every message with the Java exception class
name, several servlets printed raw Throwable.getMessage() directly, and
the two solidity query endpoints returned bare-text error bodies.

Centralize the client-facing text decision in Util.processError:

* keep the raw non-blank message only for the exact runtime types
  JsonFormat.ParseException, ContractValidateException and
  MaintenanceUnavailableException; a null, empty or whitespace-only
  message falls back to "internal server error"
* preserve the events-deprecation message only for the exact
  IllegalArgumentException type carrying EVENTS_DEPRECATED_MSG
* write the fixed rate-limit and INVALID address messages, along with
  existing GetBlock validation messages, through the package-private
  writeAuditedError helper; these audited callers bypass exception
  classification, and printErrorMsg is private to the shared writer
* return {"Error":"internal server error"} for every other exception,
  with no exception class name

Client-visible changes:

* all processError-based error bodies lose the "class <FQCN> : "
  prefix; unclassified raw messages become "internal server error"
* the rate-limit rejection body becomes
  {"Error":"lack of computing resources"} on every endpoint extending
  RateLimiterServlet, including full-node, solidity and PBFT /jsonrpc
* gettransactionbyid / gettransactioninfobyid on solidity return
  standard {"Error":...} JSON instead of bare text
* validateaddress, getBrokerage and getReward replace leaked library
  messages in their failure branches with existing fixed texts; the
  "INVALID address" body is now written via writeAuditedError and loses
  the space after the colon
* getblock keeps its exact error bodies (refactor only)

Cover Solidity transaction and transaction-info GET/POST input errors,
backend failures, successful lookups and missing records directly with
mocked Wallet calls and in-memory requests and responses. Replace the
transaction servlet tests that accidentally exercised POST in both cases,
changed global stdout and used a shared temporary response file.

Verify both endpoint and global rate-limit rejections across the three
JSON-RPC servlet variants, including status, response body and the absence
of business dispatch on rejection.

HTTP status codes, success responses, request validation rules and
gRPC behavior are unchanged. JSON-RPC behavior is unchanged except for
the shared HTTP rate-limit response described above.

Closes tronprotocol#6936

* fix(api): keep server-side failure logging at error level

The previous commit routed four catch-all blocks through the shared
processError entry point, which logs at debug. Those four catches cover
server-side work only: getburntrx, getnodeinfo and getpendingsize read
no request parameters, and in getreward malformed addresses are already
handled by the preceding DecoderException | IllegalArgumentException
catch. Their failures therefore left no trace under the default log
configuration, where the API topic is INFO.

Add a dedicated processServerError entry point that logs at error and
then applies the same sanitization, and use it at those four call sites.
Logging the exception once inside the helper keeps a single record at
any log level, instead of pairing an error log in the servlet with the
debug log in the shared path.

The shared Exception entry point keeps debug on purpose: its callers
also cover request parsing, so an unauthenticated client can fail it
cheaply and repeatedly, and an unconditional stack trace per request
would amplify that into log pressure. Distinguishing client from server
faults on that path is the parameter/internal split tracked as follow-up
in tronprotocol#6936.

Client-facing responses are unchanged.
)

* feat(vm): add optimized storage layout and alias write checks

* feat(api): separate outbound JSON parsing

* perf(vm): cache alias check at Storage construction

---------

Co-authored-by: halibobo1205 <halibobo1205@gmail.com>
tronprotocol#6982)

* refactor(api): replace response copy wrappers with Jetty content count

* fix(api): preserve legacy Unicode replacement in JsonFormat

Use JDK UTF-8 conversion to replace malformed surrogates in parser error descriptions and isolated low surrogates in string output. Match the legacy writer's question-mark replacement while preserving valid Unicode and parsing behavior.

Cover identifier, ABI escape, numeric errors, and low-surrogate output with regression tests, including strict UTF-8 checks through native Jetty responses.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 16 files

View guided diff | Turn on auto-fix | Re-trigger cubic

…emove-wallet-extension-service

# Conflicts:
#	framework/src/main/java/org/tron/core/services/http/Util.java
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.

8 participants