Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
f1214dd
docs: add Solidity & Flow EVM runner design spec and implementation plan
zenabot27 Mar 14, 2026
81682a8
feat(runner): add SolidityLSPClient for Solidity language server support
zenabot27 Mar 14, 2026
1bfb1fc
feat(runner): add /lsp-sol WebSocket handler for Solidity LSP
zenabot27 Mar 14, 2026
d925edb
feat(runner): add nginx proxy for /lsp-sol WebSocket endpoint
zenabot27 Mar 14, 2026
267f4b1
feat(runner): install solidity-language-server binary in Docker image
zenabot27 Mar 14, 2026
6c7d278
feat(runner): wrap app with WagmiProvider and QueryClientProvider
zenabot27 Mar 14, 2026
301ba02
feat(runner): add EVM wallet support to WalletButton
zenabot27 Mar 14, 2026
4c91179
feat(runner): add EVM address derivation to localKeyManager
zenabot27 Mar 14, 2026
93135ae
feat(runner): parameterize MonacoLspAdapter languageId for multi-lang…
zenabot27 Mar 14, 2026
0316f53
feat(runner): add useSolidityLsp hook for Solidity LSP via WebSocket
zenabot27 Mar 14, 2026
467731e
feat(runner): make CadenceEditor language-aware for Solidity files
zenabot27 Mar 14, 2026
b5537e9
feat(runner): add Solidity templates to file system
zenabot27 Mar 14, 2026
051ef2c
feat(runner): update FileExplorer for .sol file support
zenabot27 Mar 14, 2026
6e0e67d
feat(runner): add client-side Solidity compilation and wire into App
zenabot27 Mar 14, 2026
48c3830
feat(runner): wire viem deploy into Solidity compile flow
zenabot27 Mar 14, 2026
d7d0616
feat(runner): auto-switch EVM chain when Flow network changes
zenabot27 Mar 14, 2026
46f0f67
feat(runner): add Solidity e2e tests and fix solc browser compilation
zenabot27 Mar 14, 2026
4632f0f
docs(runner): add Solidity tooling enhancements implementation plan
zenabot27 Mar 14, 2026
9fb99bc
Merge remote-tracking branch 'origin/main' into feat/solidity-evm-runner
zenabot27 Mar 14, 2026
1e2e132
feat(runner): add evmContract read/write call functions
zenabot27 Mar 14, 2026
3ec8abb
feat(runner): add revert reason decoder with require/panic/custom err…
zenabot27 Mar 14, 2026
3f7116d
feat(runner): add SolidityParamInput component with type-aware inputs
zenabot27 Mar 14, 2026
39e0f86
feat(runner): extend solcWorker for multi-file compilation and CDN ve…
zenabot27 Mar 14, 2026
fedd553
feat(runner): add compileSolidityMultiFile and detectPragmaVersion to…
zenabot27 Mar 14, 2026
38d5b3e
feat(runner): integrate revert reason parsing into deploy and contrac…
zenabot27 Mar 14, 2026
b0780bc
feat(runner): wire contract interaction panel, multi-file compilation…
zenabot27 Mar 14, 2026
6d2d351
docs: add EVM account & transaction detail design spec
zenabot27 Mar 14, 2026
798ecca
docs: address spec review feedback for EVM pages design
zenabot27 Mar 14, 2026
bd1b770
docs: fix remaining spec review items (COA routing, search patterns, …
zenabot27 Mar 14, 2026
863eb95
docs: add EVM account & tx detail implementation plan
zenabot27 Mar 14, 2026
10d9072
docs: fix plan review issues (imports, signatures, props, paths)
zenabot27 Mar 14, 2026
5378ec1
feat(api): add EVM address proxy endpoints for Blockscout
zenabot27 Mar 14, 2026
1626f87
feat(api): add EVM transaction sub-resource proxy endpoints
zenabot27 Mar 14, 2026
a9026be
feat(api): add cached EVM search proxy endpoint
zenabot27 Mar 14, 2026
55860df
feat(frontend): add Blockscout API v2 TypeScript types
zenabot27 Mar 14, 2026
ffa6929
feat(frontend): add EVM API client for Blockscout proxy
zenabot27 Mar 14, 2026
b55b123
feat(frontend): add LoadMorePagination for cursor-based pagination
zenabot27 Mar 14, 2026
58f870c
feat(api): enrich EVM address detail with COA mapping
zenabot27 Mar 14, 2026
b49b161
feat(frontend): add EVM utility helpers (formatting, normalization)
zenabot27 Mar 14, 2026
2f37503
feat(frontend): add EVM account tab components (transactions, interna…
zenabot27 Mar 14, 2026
01768d0
feat(frontend): add EVMLogsList and EVMTxDetail components
zenabot27 Mar 14, 2026
1ba804a
feat(frontend): add EVM transaction fallback in tx route loader
zenabot27 Mar 14, 2026
be20277
feat(frontend): detect EVM addresses in account route and render EVMA…
zenabot27 Mar 14, 2026
f3148a4
feat(frontend): create COAAccountPage with dual Cadence/EVM view
zenabot27 Mar 14, 2026
4323842
feat(frontend): wire COAAccountPage into account route for COA addresses
zenabot27 Mar 14, 2026
8557831
feat(frontend): add EVM address pattern and parallel Blockscout search
zenabot27 Mar 14, 2026
5bf4f09
feat(frontend): display EVM search results with badge and update addr…
zenabot27 Mar 14, 2026
b7c4aec
chore: add .nx to gitignore, add constructorArgs to deploySolidity
zenabot27 Mar 14, 2026
938bc87
fix(build): remove Buffer dependency from flow-passkey, fix frontend …
zenabot27 Mar 14, 2026
e9778b5
feat(ai): add Flow EVM MCP to runner-chat and update system prompt
zenabot27 Mar 14, 2026
3005d9a
fix(docker): use nx to build shared packages, add missing flowtoken
zenabot27 Mar 14, 2026
5e1ccd7
docs: add search preview panel design spec
zenabot27 Mar 14, 2026
459927b
docs: address spec review feedback for search preview design
zenabot27 Mar 14, 2026
c3e0212
docs: add search preview implementation plan
zenabot27 Mar 14, 2026
14d3fb4
feat(frontend): add search preview types and API function
zenabot27 Mar 14, 2026
d7cb78a
feat(api): add unified search preview endpoint with cross-chain resol…
zenabot27 Mar 14, 2026
415d771
feat(frontend): add preview mode to useSearch with preview API integr…
zenabot27 Mar 14, 2026
22c0fb7
feat(frontend): render search preview cards with cross-chain relation…
zenabot27 Mar 14, 2026
0c9b293
fix(docker): revert nx back to explicit package builds, add flowtoken
zenabot27 Mar 14, 2026
16cc91a
fix(docker): add nx.json to Docker builds for dependency ordering
zenabot27 Mar 14, 2026
654244c
fix(runner): rebrand to Flow Runner, fix Cadence LSP parsing .sol files
zenabot27 Mar 14, 2026
fe5b53c
feat(runner): add project URL persistence, import from address, sideb…
zenabot27 Mar 15, 2026
09608c3
fix(frontend): move hooks before EVM early return to fix rules-of-hooks
zenabot27 Mar 14, 2026
4f8c465
fix(api): add new EVM proxy routes to OpenAPI spec allowlist
zenabot27 Mar 14, 2026
8a9b1fa
fix(frontend): fix search preview crashes and EVM tx navigation
zenabot27 Mar 14, 2026
4eaf28e
fix(frontend): widen search bar, mobile responsive, remove EVM→Cadenc…
zenabot27 Mar 14, 2026
2d3034b
fix(frontend): adjust search bar width to md:max-w-2xl
zenabot27 Mar 14, 2026
b6276f6
fix(frontend): widen search bar to md:max-w-3xl (768px)
zenabot27 Mar 14, 2026
75e482f
fix(frontend): fix EVM account page crashes, empty stats, and UX impr…
zenabot27 Mar 14, 2026
f2f5220
feat(api): pass BLOCKSCOUT_API_KEY to all Blockscout proxy and previe…
zenabot27 Mar 14, 2026
9ef70ab
fix(frontend): reorder address preview by search type, show COA relat…
zenabot27 Mar 15, 2026
217e19d
fix(frontend): fix COA link not showing in address preview
zenabot27 Mar 15, 2026
82cd218
fix(frontend): remove Cadence dual-view for EVM URLs, split tokens/NF…
zenabot27 Mar 15, 2026
a036f2b
fix(frontend): COABadge links to internal EVM account page instead of…
zenabot27 Mar 15, 2026
6040f95
feat(frontend): add Blockscout external link icon for EVM addresses
zenabot27 Mar 15, 2026
e588c6d
feat(frontend): use Blockscout logo for EVM address external link, pu…
zenabot27 Mar 15, 2026
4c8f1a5
fix(frontend): add small arrow to Blockscout icon for clickability af…
zenabot27 Mar 15, 2026
e27fad8
fix(frontend): Blockscout icon neutral by default, purple on hover
zenabot27 Mar 15, 2026
38d87a8
feat(runner): replace ProjectSelector dropdown with Project Manager m…
zenabot27 Mar 15, 2026
9d43e2f
feat(frontend): add Cadence/EVM view switcher for COA accounts
zenabot27 Mar 15, 2026
57258a0
feat(frontend): redesign VM view switcher, Blockscout icon hover-only
zenabot27 Mar 15, 2026
7962046
feat(evm): add EVM NFT support via Blockscout API
zenabot27 Mar 15, 2026
fdf86cf
feat(runner): add /interact page for testing deployed EVM contracts
zenabot27 Mar 15, 2026
2971076
feat: add Launch Panel agent API tools (9 tools)
zenabot27 Mar 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ runner/public/*.wasm
!runner/public/codegen-wasm_exec.js
skills/.registry.json
.superpowers/
.nx/
9 changes: 3 additions & 6 deletions ai/chat/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ RUN npm install -g bun
WORKDIR /app

# Workspace root config + lockfile
COPY package.json bun.lock ./
COPY package.json bun.lock nx.json ./

# Shared monorepo packages (needed for workspace:* resolution)
COPY packages/ ./packages/
Expand All @@ -18,11 +18,8 @@ RUN node -e "const p=require('./package.json');p.workspaces=['packages/*','ai/ch
# Install all workspace deps
RUN cd ai/chat/web && bun install

# Build shared packages (generate dist/ via tsup)
RUN cd packages/flow-passkey && bun run build \
&& cd ../auth-core && bun run build \
&& cd ../flowtoken && bun run build \
&& cd ../flow-ui && bun run build
# Build shared packages (nx resolves dependency order via tag:package)
RUN npx nx run-many -t build --projects=tag:package

# Copy app source and build
COPY ai/chat/web/ ./ai/chat/web/
Expand Down
27 changes: 23 additions & 4 deletions ai/chat/web/app/api/runner-chat/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { buildSkillsPrompt, createLoadSkillTool } from "@/lib/skills";

const CADENCE_MCP_URL =
process.env.CADENCE_MCP_URL || "https://cadence-mcp.up.railway.app/mcp";
const FLOW_EVM_MCP_URL =
process.env.FLOW_EVM_MCP_URL || "https://flow-evm-mcp.up.railway.app/mcp";

// Mode -> model + thinking config (mirrors main chat)
const MODE_CONFIG = {
Expand Down Expand Up @@ -166,8 +168,8 @@ const walletTools = {
}),
};

const SYSTEM_PROMPT = `You are a Cadence programming assistant embedded in Cadence Runner.
Your primary job is to help users write, edit, and debug Cadence smart contract code for Flow.
const SYSTEM_PROMPT = `You are a Cadence & Solidity programming assistant embedded in Cadence Runner.
Your primary job is to help users write, edit, and debug smart contract code for Flow — both Cadence and Solidity (Flow EVM).

## CRITICAL: Always use editor tools for code changes

Expand Down Expand Up @@ -223,6 +225,16 @@ Always call \`get_wallet_info\` first to check if a signer is available before a
- FlowToken: 0x1654653399040a61
- FUSD: 0x3c5959b568896393

## Solidity / Flow EVM guidelines

- Flow EVM is a full EVM environment on Flow — Solidity contracts deploy and run natively.
- Flow EVM Mainnet chain ID: 747, Testnet chain ID: 545.
- Use \`pragma solidity ^0.8.24;\` or later. The runner bundles solc 0.8.24.
- .sol files compile client-side via solc WASM. When an EVM wallet is connected, contracts auto-deploy.
- After deployment, the Interact tab lets users call read/write functions on the deployed contract.
- You have Flow EVM MCP tools to query on-chain EVM data (balances, transactions, contracts, tokens, etc.).
- For cross-VM patterns, users can call Solidity contracts from Cadence via \`EVM.run()\`.

Keep responses concise and implementation-focused.${buildSkillsPrompt()}`;

function sanitizeProjectFiles(files?: RunnerProjectFile[]): RunnerProjectFile[] {
Expand Down Expand Up @@ -305,12 +317,16 @@ export async function POST(req: Request) {
projectFiles: sanitizeProjectFiles(projectFiles),
})}`;

const cadenceMcp = await safeMcpTools(CADENCE_MCP_URL);
const [cadenceMcp, flowEvmMcp] = await Promise.all([
safeMcpTools(CADENCE_MCP_URL),
safeMcpTools(FLOW_EVM_MCP_URL),
]);

const allTools = {
...editorTools,
...walletTools,
...cadenceMcp.tools,
...flowEvmMcp.tools,
loadSkill: createLoadSkillTool(),
};

Expand Down Expand Up @@ -340,7 +356,10 @@ export async function POST(req: Request) {
tools: allTools,
stopWhen: stepCountIs(10),
onFinish: async () => {
await cadenceMcp.client?.close();
await Promise.all([
cadenceMcp.client?.close(),
flowEvmMcp.client?.close(),
]);
},
});

Expand Down
8 changes: 8 additions & 0 deletions backend/internal/api/blockscout_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ func (s *Server) proxyBlockscout(w http.ResponseWriter, r *http.Request, upstrea
if q := r.URL.RawQuery; q != "" {
target += "?" + q
}
// Append API key for rate limit bypass
if s.blockscoutAPIKey != "" {
sep := "?"
if r.URL.RawQuery != "" {
sep = "&"
}
target += sep + "apikey=" + s.blockscoutAPIKey
}

req, err := http.NewRequestWithContext(r.Context(), http.MethodGet, target, nil)
if err != nil {
Expand Down
10 changes: 10 additions & 0 deletions backend/internal/api/routes_registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,18 @@ func registerFlowRoutes(r *mux.Router, s *Server) {
r.HandleFunc("/flow/contract/{identifier}/{id}", s.handleFlowGetContractVersion).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/transaction", s.handleFlowListEVMTransactions).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/transaction/{hash}", s.handleFlowGetEVMTransaction).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/transaction/{hash}/internal-transactions", s.handleFlowGetEVMTransactionInternalTxs).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/transaction/{hash}/logs", s.handleFlowGetEVMTransactionLogs).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/transaction/{hash}/token-transfers", s.handleFlowGetEVMTransactionTokenTransfers).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/token", s.handleFlowListEVMTokens).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/token/{address}", s.handleFlowGetEVMToken).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}/token", s.handleFlowGetEVMAddressTokens).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}/nft", s.handleFlowGetEVMAddressNFTs).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}/transactions", s.handleFlowGetEVMAddressTransactions).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}/internal-transactions", s.handleFlowGetEVMAddressInternalTxs).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}/token-transfers", s.handleFlowGetEVMAddressTokenTransfers).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/address/{address}", s.handleFlowGetEVMAddress).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/evm/search", cachedHandler(30*time.Second, s.handleFlowEVMSearch)).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/node", s.handleListNodes).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/node/{node_id}", s.handleGetNode).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/node/{node_id}/reward/delegation", s.handleNotImplemented).Methods("GET", "OPTIONS")
Expand All @@ -194,6 +203,7 @@ func registerFlowRoutes(r *mux.Router, s *Server) {
r.HandleFunc("/flow/coa/{address}", s.handleGetCOAMapping).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/account/{address}/labels", s.handleFlowAccountLabels).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/search", cachedHandler(30*time.Second, s.handleSearch)).Methods("GET", "OPTIONS")
r.HandleFunc("/flow/search/preview", s.handleSearchPreview).Methods("GET", "OPTIONS")
}

func registerAccountingRoutes(r *mux.Router, s *Server) {
Expand Down
23 changes: 17 additions & 6 deletions backend/internal/api/routes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,23 @@ var specExcludedRoutes = map[string]bool{
// Alias: /contract/{id}/version/{id} same as /contract/{id}/{id}
"/flow/contract/{identifier}/version/{id}": true,
// Analytics aliases (content blockers block "analytics")
"/analytics/daily": true,
"/analytics/daily/module/{module}": true,
"/analytics/transfers/daily": true,
"/analytics/big-transfers": true,
"/analytics/top-contracts": true,
"/analytics/token-volume": true,
"/analytics/daily": true,
"/analytics/daily/module/{module}": true,
"/analytics/transfers/daily": true,
"/analytics/big-transfers": true,
"/analytics/top-contracts": true,
"/analytics/token-volume": true,
// EVM proxy routes (proxied to Blockscout, not our own API)
"/flow/evm/transaction/{hash}/internal-transactions": true,
"/flow/evm/transaction/{hash}/logs": true,
"/flow/evm/transaction/{hash}/token-transfers": true,
"/flow/evm/address/{address}/transactions": true,
"/flow/evm/address/{address}/internal-transactions": true,
"/flow/evm/address/{address}/token-transfers": true,
"/flow/evm/address/{address}": true,
"/flow/evm/address/{address}/nft": true,
"/flow/evm/search": true,
"/flow/search/preview": true,
}

// TestAllRoutesInSpec ensures every registered public route has an OpenAPI spec entry.
Expand Down
4 changes: 3 additions & 1 deletion backend/internal/api/server_bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ type Server struct {
httpServer *http.Server
startBlock uint64
blockscoutURL string // e.g. "https://evm.flowindex.dev"
blockscoutAPIKey string // optional API key for Blockscout rate limit bypass
backfillProgress *BackfillProgress
priceCache *market.PriceCache
webhookHandlers WebhookRouteRegistrar
Expand Down Expand Up @@ -162,7 +163,8 @@ func NewServer(repo *repository.Repository, client FlowClient, port string, star
repo: repo,
client: client,
startBlock: startBlock,
blockscoutURL: bsURL,
blockscoutURL: bsURL,
blockscoutAPIKey: os.Getenv("BLOCKSCOUT_API_KEY"),
priceCache: market.NewPriceCache(),
}
for _, opt := range opts {
Expand Down
108 changes: 108 additions & 0 deletions backend/internal/api/v1_handlers_evm.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package api

import (
"encoding/json"
"io"
"log"
"net/http"
"strings"

Expand Down Expand Up @@ -35,3 +38,108 @@ func (s *Server) handleFlowGetEVMToken(w http.ResponseWriter, r *http.Request) {
}
s.proxyBlockscout(w, r, "/api/v2/tokens/0x"+address)
}

func (s *Server) handleFlowGetEVMTransactionInternalTxs(w http.ResponseWriter, r *http.Request) {
hash := strings.ToLower(strings.TrimPrefix(mux.Vars(r)["hash"], "0x"))
s.proxyBlockscout(w, r, "/api/v2/transactions/0x"+hash+"/internal-transactions")
}

func (s *Server) handleFlowGetEVMTransactionLogs(w http.ResponseWriter, r *http.Request) {
hash := strings.ToLower(strings.TrimPrefix(mux.Vars(r)["hash"], "0x"))
s.proxyBlockscout(w, r, "/api/v2/transactions/0x"+hash+"/logs")
}

func (s *Server) handleFlowGetEVMTransactionTokenTransfers(w http.ResponseWriter, r *http.Request) {
hash := strings.ToLower(strings.TrimPrefix(mux.Vars(r)["hash"], "0x"))
s.proxyBlockscout(w, r, "/api/v2/transactions/0x"+hash+"/token-transfers")
}

func (s *Server) handleFlowGetEVMAddressNFTs(w http.ResponseWriter, r *http.Request) {
address := normalizeAddr(mux.Vars(r)["address"])
s.proxyBlockscout(w, r, "/api/v2/addresses/0x"+address+"/nft")
}

func (s *Server) handleFlowGetEVMAddress(w http.ResponseWriter, r *http.Request) {
addr := normalizeAddr(mux.Vars(r)["address"])

// Build upstream request manually so we can read + enrich the response body.
target := s.blockscoutURL + "/api/v2/addresses/0x" + addr
if q := r.URL.RawQuery; q != "" {
target += "?" + q
}
if s.blockscoutAPIKey != "" {
sep := "?"
if strings.Contains(target, "?") {
sep = "&"
}
target += sep + "apikey=" + s.blockscoutAPIKey
}

req, err := http.NewRequestWithContext(r.Context(), http.MethodGet, target, nil)
if err != nil {
writeAPIError(w, http.StatusInternalServerError, "failed to build upstream request")
return
}
req.Header.Set("Accept", "application/json")

resp, err := blockscoutClient.Do(req)
if err != nil {
log.Printf("blockscout proxy error: %v", err)
writeAPIError(w, http.StatusBadGateway, "upstream blockscout unavailable")
return
}
defer resp.Body.Close()

// Non-200: stream through unchanged.
if resp.StatusCode != http.StatusOK {
w.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
return
}

// Read full body for potential enrichment.
body, err := io.ReadAll(resp.Body)
if err != nil {
writeAPIError(w, http.StatusBadGateway, "failed to read upstream response")
return
}

// Attempt COA enrichment; any failure falls through to returning original body.
enriched := false
if coaRow, coaErr := s.repo.GetFlowAddressByCOA(r.Context(), addr); coaErr == nil && coaRow != nil {
var data map[string]interface{}
if jsonErr := json.Unmarshal(body, &data); jsonErr == nil {
data["flow_address"] = "0x" + coaRow.FlowAddress
data["is_coa"] = true
if out, marshalErr := json.Marshal(data); marshalErr == nil {
body = out
enriched = true
}
}
}
_ = enriched // not needed further; kept for clarity

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(body)
}

func (s *Server) handleFlowGetEVMAddressTransactions(w http.ResponseWriter, r *http.Request) {
addr := normalizeAddr(mux.Vars(r)["address"])
s.proxyBlockscout(w, r, "/api/v2/addresses/0x"+addr+"/transactions")
}

func (s *Server) handleFlowGetEVMAddressInternalTxs(w http.ResponseWriter, r *http.Request) {
addr := normalizeAddr(mux.Vars(r)["address"])
s.proxyBlockscout(w, r, "/api/v2/addresses/0x"+addr+"/internal-transactions")
}

func (s *Server) handleFlowGetEVMAddressTokenTransfers(w http.ResponseWriter, r *http.Request) {
addr := normalizeAddr(mux.Vars(r)["address"])
s.proxyBlockscout(w, r, "/api/v2/addresses/0x"+addr+"/token-transfers")
}

func (s *Server) handleFlowEVMSearch(w http.ResponseWriter, r *http.Request) {
s.proxyBlockscout(w, r, "/api/v2/search")
}
Loading