{
  "schemaVersion": 1,
  "article": {
    "wpId": 6032,
    "permalink": "/archives/6032",
    "sourceIssue": 174
  },
  "checkedAt": "2026-08-31",
  "environment": {
    "node": "v24.14.0",
    "viem": "2.56.0",
    "network": "127.0.0.1 ephemeral local HTTP server only"
  },
  "safety": {
    "publicRpcQueried": false,
    "walletOpened": false,
    "accountConnected": false,
    "signatureRequested": false,
    "transactionBroadcast": false,
    "assetMoved": false,
    "secretsPresent": false
  },
  "structuredLogSchema": [
    "occurredAt",
    "operation",
    "method",
    "sanitizedParamsShape",
    "chainId",
    "blockNumberOrTag",
    "httpStatus",
    "retryAfter",
    "rpcCode",
    "rpcMessage",
    "rpcDataShape",
    "viemErrorName",
    "viemShortMessage",
    "viemDetails",
    "causeNames",
    "transactionHash",
    "attempt",
    "elapsedMs",
    "decision"
  ],
  "redactedFields": [
    "Authorization",
    "Cookie",
    "Set-Cookie",
    "API key in URL or headers",
    "raw signed transaction",
    "private key",
    "seed phrase",
    "personal data"
  ],
  "cases": [
    {
      "id": "provider-4001",
      "layer": "wallet provider",
      "retry": "never-auto",
      "nextAction": "Keep the request cancelled and wait for a fresh user gesture.",
      "raw": {
        "request": {
          "method": "wallet_requestPermissions",
          "params": [
            {
              "eth_accounts": {}
            }
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": 4001,
              "message": "User rejected the request."
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "UserRejectedRequestError",
          "shortMessage": "User rejected the request.",
          "details": "User rejected the request.",
          "code": 4001
        },
        "causeChain": [
          {
            "name": "UserRejectedRequestError",
            "shortMessage": "User rejected the request.",
            "details": "User rejected the request.",
            "code": 4001
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "User rejected the request.",
            "code": 4001
          },
          {
            "name": "object",
            "code": 4001
          }
        ],
        "walkLeafName": "UserRejectedRequestError",
        "expectedClassFoundByWalk": "UserRejectedRequestError"
      }
    },
    {
      "id": "provider-4100",
      "layer": "wallet provider",
      "retry": "fix-authorization",
      "nextAction": "Check origin and account authorization before requesting again.",
      "raw": {
        "request": {
          "method": "eth_accounts",
          "params": []
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": 4100,
              "message": "The account is not authorized for this origin."
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "UnauthorizedProviderError",
          "shortMessage": "The requested method and/or account has not been authorized by the user.",
          "details": "The account is not authorized for this origin.",
          "code": 4100
        },
        "causeChain": [
          {
            "name": "UnauthorizedProviderError",
            "shortMessage": "The requested method and/or account has not been authorized by the user.",
            "details": "The account is not authorized for this origin.",
            "code": 4100
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "The account is not authorized for this origin.",
            "code": 4100
          },
          {
            "name": "object",
            "code": 4100
          }
        ],
        "walkLeafName": "UnauthorizedProviderError",
        "expectedClassFoundByWalk": "UnauthorizedProviderError"
      }
    },
    {
      "id": "provider-4200",
      "layer": "wallet provider",
      "retry": "fix-capability",
      "nextAction": "Use capability detection or a supported method; delay alone cannot add support.",
      "raw": {
        "request": {
          "method": "wallet_watchAsset",
          "params": [
            {
              "type": "ERC20",
              "options": {}
            }
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": 4200,
              "message": "The provider does not support this method."
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "UnsupportedProviderMethodError",
          "shortMessage": "The Provider does not support the requested method.",
          "details": "The provider does not support this method.",
          "code": 4200
        },
        "causeChain": [
          {
            "name": "UnsupportedProviderMethodError",
            "shortMessage": "The Provider does not support the requested method.",
            "details": "The provider does not support this method.",
            "code": 4200
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "The provider does not support this method.",
            "code": 4200
          },
          {
            "name": "object",
            "code": 4200
          }
        ],
        "walkLeafName": "UnsupportedProviderMethodError",
        "expectedClassFoundByWalk": "UnsupportedProviderMethodError"
      }
    },
    {
      "id": "provider-4900",
      "layer": "wallet provider",
      "retry": "wait-connectivity",
      "nextAction": "Wait for provider connectivity or reconnect through an explicit user flow.",
      "raw": {
        "request": {
          "method": "eth_chainId",
          "params": []
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": 4900,
              "message": "The provider is disconnected from all chains."
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "ProviderDisconnectedError",
          "shortMessage": "The Provider is disconnected from all chains.",
          "details": "The provider is disconnected from all chains.",
          "code": 4900
        },
        "causeChain": [
          {
            "name": "ProviderDisconnectedError",
            "shortMessage": "The Provider is disconnected from all chains.",
            "details": "The provider is disconnected from all chains.",
            "code": 4900
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "The provider is disconnected from all chains.",
            "code": 4900
          },
          {
            "name": "object",
            "code": 4900
          }
        ],
        "walkLeafName": "ProviderDisconnectedError",
        "expectedClassFoundByWalk": "ProviderDisconnectedError"
      }
    },
    {
      "id": "provider-4901",
      "layer": "wallet provider",
      "retry": "fix-chain",
      "nextAction": "Confirm the intended chain and ask the user to select it; do not silently change intent.",
      "raw": {
        "request": {
          "method": "eth_getBalance",
          "params": [
            "0x0000000000000000000000000000000000000001",
            "latest"
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": 4901,
              "message": "The provider is not connected to the requested chain."
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "ChainDisconnectedError",
          "shortMessage": "The Provider is not connected to the requested chain.",
          "details": "The provider is not connected to the requested chain.",
          "code": 4901
        },
        "causeChain": [
          {
            "name": "ChainDisconnectedError",
            "shortMessage": "The Provider is not connected to the requested chain.",
            "details": "The provider is not connected to the requested chain.",
            "code": 4901
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "The provider is not connected to the requested chain.",
            "code": 4901
          },
          {
            "name": "object",
            "code": 4901
          }
        ],
        "walkLeafName": "ChainDisconnectedError",
        "expectedClassFoundByWalk": "ChainDisconnectedError"
      }
    },
    {
      "id": "transport-429",
      "layer": "HTTP transport",
      "retry": "backoff-idempotent-only",
      "nextAction": "Honor Retry-After for a read; for a write, first determine whether submission may have succeeded.",
      "raw": {
        "request": {
          "method": "eth_getBlockByNumber",
          "params": [
            "latest",
            false
          ]
        },
        "response": {
          "httpStatus": 429,
          "headers": {
            "retry-after": "2"
          },
          "body": {
            "error": "rate limit exceeded"
          }
        }
      },
      "viem": {
        "top": {
          "name": "HttpRequestError",
          "shortMessage": "HTTP request failed.",
          "details": "\"rate limit exceeded\"",
          "status": 429
        },
        "causeChain": [
          {
            "name": "HttpRequestError",
            "shortMessage": "HTTP request failed.",
            "details": "\"rate limit exceeded\"",
            "status": 429
          }
        ],
        "walkLeafName": "HttpRequestError",
        "expectedClassFoundByWalk": "HttpRequestError"
      }
    },
    {
      "id": "transport-timeout",
      "layer": "HTTP transport",
      "retry": "unknown-outcome",
      "nextAction": "Retry an idempotent read with backoff; check transaction identity before resubmitting a write.",
      "raw": {
        "request": {
          "method": "eth_blockNumber",
          "params": []
        },
        "response": {
          "httpStatus": null,
          "timeoutMs": 40,
          "simulatedServerDelayMs": 160,
          "body": null
        }
      },
      "viem": {
        "top": {
          "name": "TimeoutError",
          "shortMessage": "The request took too long to respond.",
          "details": "The request timed out."
        },
        "causeChain": [
          {
            "name": "TimeoutError",
            "shortMessage": "The request took too long to respond.",
            "details": "The request timed out."
          }
        ],
        "walkLeafName": "TimeoutError",
        "expectedClassFoundByWalk": "TimeoutError"
      }
    },
    {
      "id": "jsonrpc--32601",
      "layer": "JSON-RPC protocol",
      "retry": "fix-method",
      "nextAction": "Correct the method or select an endpoint that explicitly supports it.",
      "raw": {
        "request": {
          "method": "eth_methodDoesNotExist",
          "params": []
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": -32601,
              "message": "Method not found"
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "MethodNotFoundRpcError",
          "shortMessage": "The method \"eth_methodDoesNotExist\" does not exist / is not available.",
          "details": "Method not found",
          "code": -32601
        },
        "causeChain": [
          {
            "name": "MethodNotFoundRpcError",
            "shortMessage": "The method \"eth_methodDoesNotExist\" does not exist / is not available.",
            "details": "Method not found",
            "code": -32601
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "Method not found",
            "code": -32601
          },
          {
            "name": "object",
            "code": -32601
          }
        ],
        "walkLeafName": "MethodNotFoundRpcError",
        "expectedClassFoundByWalk": "MethodNotFoundRpcError"
      }
    },
    {
      "id": "jsonrpc--32602",
      "layer": "JSON-RPC protocol",
      "retry": "fix-input",
      "nextAction": "Correct parameter count, order, type, and Ethereum encoding before retrying.",
      "raw": {
        "request": {
          "method": "eth_getBalance",
          "params": [
            "not-an-address"
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": -32602,
              "message": "Invalid params",
              "data": {
                "field": "params[0]"
              }
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "InvalidParamsRpcError",
          "shortMessage": "Invalid parameters were provided to the RPC method.\nDouble check you have provided the correct parameters.",
          "details": "Invalid params",
          "code": -32602
        },
        "causeChain": [
          {
            "name": "InvalidParamsRpcError",
            "shortMessage": "Invalid parameters were provided to the RPC method.\nDouble check you have provided the correct parameters.",
            "details": "Invalid params",
            "code": -32602
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "Invalid params",
            "code": -32602,
            "data": {
              "field": "params[0]"
            }
          },
          {
            "name": "object",
            "code": -32602,
            "data": {
              "field": "params[0]"
            }
          }
        ],
        "walkLeafName": "InvalidParamsRpcError",
        "expectedClassFoundByWalk": "InvalidParamsRpcError"
      }
    },
    {
      "id": "jsonrpc--32603",
      "layer": "JSON-RPC protocol",
      "retry": "backoff-after-classification",
      "nextAction": "Preserve raw context, then retry an idempotent read with bounded backoff or use a measured fallback.",
      "raw": {
        "request": {
          "method": "eth_call",
          "params": [
            {
              "to": "0x0000000000000000000000000000000000000001",
              "data": "0x"
            },
            "latest"
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": -32603,
              "message": "Internal error"
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "InternalRpcError",
          "shortMessage": "An internal error was received.",
          "details": "Internal error",
          "code": -32603
        },
        "causeChain": [
          {
            "name": "InternalRpcError",
            "shortMessage": "An internal error was received.",
            "details": "Internal error",
            "code": -32603
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "Internal error",
            "code": -32603
          },
          {
            "name": "object",
            "code": -32603
          }
        ],
        "walkLeafName": "InternalRpcError",
        "expectedClassFoundByWalk": "InternalRpcError"
      }
    },
    {
      "id": "node--32005",
      "layer": "node or gateway policy",
      "retry": "reduce-scope",
      "nextAction": "Reduce the block range or payload, then apply bounded backoff.",
      "raw": {
        "request": {
          "method": "eth_getLogs",
          "params": [
            {
              "fromBlock": "0x1",
              "toBlock": "latest"
            }
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": -32005,
              "message": "Limit exceeded"
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "LimitExceededRpcError",
          "shortMessage": "Request exceeds defined limit.",
          "details": "Limit exceeded",
          "code": -32005
        },
        "causeChain": [
          {
            "name": "LimitExceededRpcError",
            "shortMessage": "Request exceeds defined limit.",
            "details": "Limit exceeded",
            "code": -32005
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "Limit exceeded",
            "code": -32005
          },
          {
            "name": "object",
            "code": -32005
          }
        ],
        "walkLeafName": "LimitExceededRpcError",
        "expectedClassFoundByWalk": "LimitExceededRpcError"
      }
    },
    {
      "id": "node--32000-insufficient-funds",
      "layer": "transaction validation",
      "retry": "fix-state-or-input",
      "nextAction": "Check sender balance, value, gas, and fee; repeating the same signed transaction cannot add funds.",
      "raw": {
        "request": {
          "method": "eth_sendRawTransaction",
          "params": [
            "0x02f86c820539808080809400000000000000000000000000000000000000018080c080a0"
          ]
        },
        "response": {
          "httpStatus": 200,
          "headers": {
            "content-type": "application/json"
          },
          "body": {
            "jsonrpc": "2.0",
            "id": 1,
            "error": {
              "code": -32000,
              "message": "insufficient funds for gas * price + value"
            }
          }
        }
      },
      "viem": {
        "top": {
          "name": "InvalidInputRpcError",
          "shortMessage": "Missing or invalid parameters.\nDouble check you have provided the correct parameters.",
          "details": "insufficient funds for gas * price + value",
          "code": -32000
        },
        "causeChain": [
          {
            "name": "InvalidInputRpcError",
            "shortMessage": "Missing or invalid parameters.\nDouble check you have provided the correct parameters.",
            "details": "insufficient funds for gas * price + value",
            "code": -32000
          },
          {
            "name": "RpcRequestError",
            "shortMessage": "RPC Request failed.",
            "details": "insufficient funds for gas * price + value",
            "code": -32000
          },
          {
            "name": "object",
            "code": -32000
          }
        ],
        "walkLeafName": "InvalidInputRpcError",
        "expectedClassFoundByWalk": "InvalidInputRpcError"
      }
    }
  ],
  "retryRules": {
    "idempotentReads": "bounded exponential backoff with jitter; honor Retry-After; cap attempts",
    "walletRejection": "never retry automatically",
    "invalidMethodOrParams": "fix method or input before retrying",
    "transactionUnknownOutcome": "derive transaction hash or query sender nonce before any resubmission",
    "fallback": "preserve chain, block, method, params, and response comparison across endpoints"
  }
}
