diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..684d6ff9 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,60 @@ +version: 2.1 +jobs: + build_and_test: + docker: + - image: ${CIPHEROWL_ECR_URL}/cipherowl/circleci:1d37a87f73dd5dfb2c36b6ad25ab48ada1768717 + working_directory: ~/chainstorage + steps: + - checkout + - setup_remote_docker: + version: default + - run: + name: Install dependencies + command: | + set +x + make bootstrap + - run: + name: Run unit tests + command: "make test" + - run: + name: Run integration tests + command: | + set +x + + docker-compose -f docker-compose-testing.yml up -d --force-recreate + sleep 10 + + # Due to how the remote docker engine works with docker-compose + # in circleci, we have to run our integration tests from + # a remote container so that the tests can access network services + # spun up by docker-compose. + docker create -v /home/circleci --name chainstorage alpine:3.21 /bin/true + # docker cp /home/circleci/go chainstorage:/home/circleci/go + docker cp /home/circleci/chainstorage chainstorage:/home/circleci/chainstorage + + docker run --network chainstorage_default \ + --volumes-from chainstorage \ + -w /home/circleci/chainstorage \ + ${CIPHEROWL_ECR_URL}/cipherowl/circleci:1d37a87f73dd5dfb2c36b6ad25ab48ada1768717 \ + /bin/bash -c "sudo chown -R circleci:circleci ~/ && make bootstrap && TEST_TYPE=integration go test ./... -v -p=1 -parallel=1 -timeout=15m -failfast -run=TestIntegration" + - run: + name: Run functional tests + command: | + set +x + echo "functional tests skipped" + + # docker run --network chainstorage_default \ + # --volumes-from chainstorage \ + # -w /home/circleci/chainstorage \ + # ${CIPHEROWL_ECR_URL}/cipherowl/circleci:1d37a87f73dd5dfb2c36b6ad25ab48ada1768717 \ + # /bin/bash -c "sudo chown -R circleci:circleci ~/ && make bootstrap && TEST_TYPE=functional go test ./... -v -p=1 -parallel=1 -timeout=45m -failfast -run=TestIntegration" + + docker-compose -f docker-compose-testing.yml down + +workflows: + version: 2 + default: + jobs: + - build_and_test: + name: build_and_test + context: cipherowl_build_context diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..49aa57b3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,173 @@ +# ChainStorage Development Guide + +This guide helps Claude understand the ChainStorage project structure and common development tasks. + +## Project Overview + +ChainStorage is a blockchain data storage and processing system that: +- Continuously replicates blockchain changes (new blocks) +- Acts as a distributed file system for blockchain data +- Stores raw data in horizontally-scalable storage (S3 + DynamoDB) +- Supports multiple blockchains: Ethereum, Bitcoin, Solana, Polygon, etc. +- Can serve up to 1,500 blocks per second in production + +## Key Commands + +### Testing +```bash +# Run all unit tests +make test + +# Run specific package tests +make test TARGET=internal/blockchain/... + +# Run integration tests +make integration TARGET=internal/storage/... + +# Run functional tests (requires secrets.yml) +make functional TARGET=internal/workflow/... +``` + +### Linting and Type Checking +```bash +# Run linter (includes go vet, errcheck, ineffassign) +make lint +# Note: May encounter errors with Go versions > 1.22 + +# No separate typecheck command - type checking happens during build +``` + +### Building +```bash +# Initial setup (once) +make bootstrap + +# Build everything +make build + +# Generate protobuf files +make proto + +# Generate configs from templates +make config +``` + +### Local Development +```bash +# Start local infrastructure (LocalStack) +make localstack + +# Start server (Ethereum mainnet) +make server + +# Start server (other networks) +make server CHAINSTORAGE_CONFIG=ethereum_goerli +``` + +## Project Structure + +``` +/cmd/ - Command line tools + /admin/ - Admin CLI tool + /api/ - API server + /server/ - Main server + /worker/ - Worker processes + +/internal/ - Core implementation + /blockchain/ - Blockchain clients and parsers + /client/ - Chain-specific clients + /parser/ - Chain-specific parsers + /storage/ - Storage implementations + /blobstorage/ - S3/GCS storage + /metastorage/ - DynamoDB/Firestore storage + /workflow/ - Temporal workflows + /activity/ - Workflow activities + +/config/ - Generated configurations +/config_templates/ - Configuration templates +/protos/ - Protocol buffer definitions +/sdk/ - Go SDK for consumers +``` + +## Key Workflows + +1. **Backfiller**: Backfills historical blocks +2. **Poller**: Polls for new blocks continuously +3. **Streamer**: Streams blocks in real-time +4. **Monitor**: Monitors system health +5. **Benchmarker**: Benchmarks performance + +## Environment Variables + +- `CHAINSTORAGE_NAMESPACE`: Service namespace (default: chainstorage) +- `CHAINSTORAGE_CONFIG`: Format: `{blockchain}-{network}` (e.g., ethereum-mainnet) +- `CHAINSTORAGE_ENVIRONMENT`: Environment (local/development/production) + +## Common Tasks + +### Adding Support for New Blockchain +1. Create config templates in `/config_templates/chainstorage/{blockchain}/{network}/` +2. Implement client in `/internal/blockchain/client/{blockchain}/` +3. Implement parser in `/internal/blockchain/parser/{blockchain}/` +4. Run `make config` to generate configs +5. Add tests + +### Debugging LocalStack Services +```bash +# Check S3 files +aws s3 --no-sign-request --region local --endpoint-url http://localhost:4566 ls --recursive example-chainstorage-ethereum-mainnet-dev/ + +# Check DynamoDB +aws dynamodb --no-sign-request --region local --endpoint-url http://localhost:4566 scan --table-name example_chainstorage_blocks_ethereum_mainnet + +# Check SQS DLQ +aws sqs --no-sign-request --region local --endpoint-url http://localhost:4566 receive-message --queue-url "http://localhost:4566/000000000000/example_chainstorage_blocks_ethereum_mainnet_dlq" +``` + +### Working with Temporal Workflows +```bash +# Start backfiller +go run ./cmd/admin workflow start --workflow backfiller --input '{"StartHeight": 11000000, "EndHeight": 11000100}' --blockchain ethereum --network mainnet --env local + +# Start poller +go run ./cmd/admin workflow start --workflow poller --input '{"Tag": 0, "MaxBlocksToSync": 100}' --blockchain ethereum --network mainnet --env local + +# Check workflow status +tctl --address localhost:7233 --namespace chainstorage-ethereum-mainnet workflow show --workflow_id workflow.backfiller +``` + +## Important Notes + +1. **Always run tests before committing**: Use `make test` and `make lint` +2. **Config generation**: After modifying templates, run `make config` +3. **Secrets**: Never commit `secrets.yml` files (used for endpoint configurations) +4. **Endpoint groups**: Master (sticky) for canonical chain, Slave (round-robin) for data ingestion +5. **Parser types**: Native (default), Mesh, or Raw + +## Dependencies + +- Go 1.22 (required - newer versions may cause lint errors) +- Protobuf 25.2 +- Temporal (workflow engine) +- LocalStack (local AWS services) +- Docker & Docker Compose + +## Architecture Insights + +### Client Architecture +- **Multi-endpoint system**: Master (primary), Slave (load distribution), Validator, Consensus +- **Protocol support**: JSON-RPC (most chains) and REST API (Rosetta) +- **Shared implementations**: EVM chains (Polygon, BSC, Arbitrum) share Ethereum client code +- **Factory pattern**: Each blockchain has a client factory registered with dependency injection + +### Key Design Patterns +1. **Interceptor Pattern**: Wraps clients for instrumentation and parsing +2. **Option Pattern**: Modifies client behavior (e.g., WithBestEffort()) +3. **Batch Processing**: Configurable batch sizes for performance +4. **Error Handling**: Standardized errors with network-specific handling + +### Supported Blockchains +- **EVM-based**: Ethereum, Polygon, BSC, Arbitrum, Optimism, Base, Fantom, Avalanche +- **Bitcoin-based**: Bitcoin, Bitcoin Cash, Dogecoin, Litecoin +- **Other**: Solana, Aptos, Tron +- **Special**: Ethereum Beacon Chain support \ No newline at end of file diff --git a/cmd/admin/workflow.go b/cmd/admin/workflow.go index 274cf55f..aef78417 100644 --- a/cmd/admin/workflow.go +++ b/cmd/admin/workflow.go @@ -91,6 +91,7 @@ func init() { func startWorkflow() error { workflowIdentity := workflow.GetWorkflowIdentify(workflowFlags.workflow) + workflowId := workflowFlags.workflowID if workflowIdentity == workflow.UnknownIdentity { return xerrors.Errorf("invalid workflow: %v", workflowFlags.workflow) } @@ -101,7 +102,7 @@ func startWorkflow() error { } defer app.Close() - ctx := context.Background() + ctx := context.WithValue(context.Background(), "workflowId", workflowId) workflowIdentityString, err := workflowIdentity.String() if err != nil { return xerrors.Errorf("error parsing workflowIdentity: %w", err) diff --git a/config/chainstorage/bitcoincash/mainnet/base.yml b/config/chainstorage/bitcoincash/mainnet/base.yml new file mode 100644 index 00000000..d439f516 --- /dev/null +++ b/config/chainstorage/bitcoincash/mainnet/base.yml @@ -0,0 +1,195 @@ +# This file is generated by "make config". DO NOT EDIT. +api: + auth: "" + max_num_block_files: 1000 + max_num_blocks: 5 + num_workers: 10 + rate_limit: + global_rps: 3000 + per_client_rps: 2000 + streaming_batch_size: 50 + streaming_interval: 1s + streaming_max_no_event_time: 30m +aws: + aws_account: development + bucket: "" + dlq: + delay_secs: 900 + name: example_chainstorage_blocks_bitcoincash_mainnet_dlq + visibility_timeout_secs: 600 + dynamodb: + block_table: example_chainstorage_blocks_bitcoincash_mainnet + event_table: example_chainstorage_block_events_bitcoincash_mainnet + event_table_height_index: example_chainstorage_block_events_by_height_bitcoincash_mainnet + transaction_table: example_chainstorage_transactions_table_bitcoincash_mainnet + versioned_event_table: example_chainstorage_versioned_block_events_bitcoincash_mainnet + versioned_event_table_block_index: example_chainstorage_versioned_block_events_by_block_id_bitcoincash_mainnet + presigned_url_expiration: 30m + region: us-east-1 + storage: + data_compression: GZIP +cadence: + address: "" + domain: chainstorage-bitcoincash-mainnet + retention_period: 7 + tls: + enabled: true + validate_hostname: true +chain: + block_start_height: 0 + block_tag: + latest: 2 + stable: 2 + block_time: 10m + blockchain: BLOCKCHAIN_BITCOINCASH + client: + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: "" + slave: + endpoint_group: "" + validator: + endpoint_group: "" + event_tag: + latest: 0 + stable: 0 + feature: + default_stable_event: true + rosetta_parser: true + irreversible_distance: 2 + network: NETWORK_BITCOINCASH_MAINNET +config_name: bitcoincash_mainnet +cron: + block_range_size: 2 + disable_dlq_processor: true +functional_test: "" +gcp: + presigned_url_expiration: 30m + project: development +sdk: + auth_header: "" + auth_token: "" + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/bitcoincash/mainnet/v1 + num_workers: 10 + restful: true +server: + bind_address: localhost:9090 +sla: + block_height_delta: 5 + block_time_delta: 1h + event_height_delta: 5 + event_time_delta: 1h + expected_workflows: + - monitor + - poller + - streamer + out_of_sync_node_distance: 10 + tier: 2 + time_since_last_block: 1h15m + time_since_last_event: 1h15m +workflows: + backfiller: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 2500 + checkpoint_size: 5000 + max_reprocessed_per_batch: 30 + mini_batch_size: 1 + num_concurrent_extractors: 21 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.backfiller + benchmarker: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + child_workflow_execution_start_to_close_timeout: 60m + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.benchmarker + cross_validator: + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 100 + checkpoint_size: 1000 + parallelism: 4 + task_list: default + validation_percentage: 10 + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.cross_validator + event_backfiller: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 250 + checkpoint_size: 5000 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.event_backfiller + monitor: + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 50 + block_gap_limit: 3000 + checkpoint_size: 250 + event_gap_limit: 300 + parallelism: 4 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.monitor + poller: + activity_heartbeat_timeout: 15m + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 2m + activity_start_to_close_timeout: 30m + backoff_interval: 10s + checkpoint_size: 1000 + fast_sync: false + liveness_check_enabled: true + liveness_check_interval: 1m + liveness_check_violation_limit: 10 + max_blocks_to_sync_per_cycle: 5 + parallelism: 10 + session_creation_timeout: 2m + session_enabled: false + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.poller + replicator: + activity_retry_maximum_attempts: 5 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 1000 + checkpoint_size: 10000 + mini_batch_size: 100 + parallelism: 10 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.replicator + streamer: + activity_retry_maximum_attempts: 5 + activity_schedule_to_start_timeout: 2m + activity_start_to_close_timeout: 2m + backoff_interval: 10s + batch_size: 500 + checkpoint_size: 500 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.streamer + workers: + - task_list: default diff --git a/config/chainstorage/bitcoincash/mainnet/development.yml b/config/chainstorage/bitcoincash/mainnet/development.yml new file mode 100644 index 00000000..844be085 --- /dev/null +++ b/config/chainstorage/bitcoincash/mainnet/development.yml @@ -0,0 +1,16 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: development + bucket: example-chainstorage-bitcoincash-mainnet-dev +cadence: + address: temporal-dev.example.com:7233 +sdk: + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/bitcoincash/mainnet/v1 +server: + bind_address: 0.0.0.0:9090 +workflows: + poller: + activity_retry_maximum_attempts: 6 + activity_schedule_to_start_timeout: 5m + streamer: + activity_schedule_to_start_timeout: 5m diff --git a/config/chainstorage/bitcoincash/mainnet/local.yml b/config/chainstorage/bitcoincash/mainnet/local.yml new file mode 100644 index 00000000..e1199fb7 --- /dev/null +++ b/config/chainstorage/bitcoincash/mainnet/local.yml @@ -0,0 +1,38 @@ +# This file is generated by "make config". DO NOT EDIT. +chain: + client: + master: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 + slave: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 + validator: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 +gcp: + project: chainstorage-local +sdk: + chainstorage_address: localhost:9090 + restful: false +storage_type: + blob: S3 + dlq: SQS + meta: DYNAMODB +workflows: + monitor: + failover_enabled: false + poller: + failover_enabled: false diff --git a/config/chainstorage/bitcoincash/mainnet/production.yml b/config/chainstorage/bitcoincash/mainnet/production.yml new file mode 100644 index 00000000..80280561 --- /dev/null +++ b/config/chainstorage/bitcoincash/mainnet/production.yml @@ -0,0 +1,10 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: production + bucket: example-chainstorage-bitcoincash-mainnet-prod +cadence: + address: temporal.example.com:7233 +sdk: + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/bitcoincash/mainnet/v1 +server: + bind_address: 0.0.0.0:9090 diff --git a/config/chainstorage/litecoin/mainnet/base.yml b/config/chainstorage/litecoin/mainnet/base.yml new file mode 100644 index 00000000..3af534a7 --- /dev/null +++ b/config/chainstorage/litecoin/mainnet/base.yml @@ -0,0 +1,195 @@ +# This file is generated by "make config". DO NOT EDIT. +api: + auth: "" + max_num_block_files: 1000 + max_num_blocks: 5 + num_workers: 10 + rate_limit: + global_rps: 3000 + per_client_rps: 2000 + streaming_batch_size: 50 + streaming_interval: 1s + streaming_max_no_event_time: 30m +aws: + aws_account: development + bucket: "" + dlq: + delay_secs: 900 + name: example_chainstorage_blocks_litecoin_mainnet_dlq + visibility_timeout_secs: 600 + dynamodb: + block_table: example_chainstorage_blocks_litecoin_mainnet + event_table: example_chainstorage_block_events_litecoin_mainnet + event_table_height_index: example_chainstorage_block_events_by_height_litecoin_mainnet + transaction_table: example_chainstorage_transactions_table_litecoin_mainnet + versioned_event_table: example_chainstorage_versioned_block_events_litecoin_mainnet + versioned_event_table_block_index: example_chainstorage_versioned_block_events_by_block_id_litecoin_mainnet + presigned_url_expiration: 30m + region: us-east-1 + storage: + data_compression: GZIP +cadence: + address: "" + domain: chainstorage-litecoin-mainnet + retention_period: 7 + tls: + enabled: true + validate_hostname: true +chain: + block_start_height: 0 + block_tag: + latest: 2 + stable: 2 + block_time: 10m + blockchain: BLOCKCHAIN_LITECOIN + client: + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: "" + slave: + endpoint_group: "" + validator: + endpoint_group: "" + event_tag: + latest: 0 + stable: 0 + feature: + default_stable_event: true + rosetta_parser: true + irreversible_distance: 2 + network: NETWORK_LITECOIN_MAINNET +config_name: litecoin_mainnet +cron: + block_range_size: 2 + disable_dlq_processor: true +functional_test: "" +gcp: + presigned_url_expiration: 30m + project: development +sdk: + auth_header: "" + auth_token: "" + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/litecoin/mainnet/v1 + num_workers: 10 + restful: true +server: + bind_address: localhost:9090 +sla: + block_height_delta: 5 + block_time_delta: 1h + event_height_delta: 5 + event_time_delta: 1h + expected_workflows: + - monitor + - poller + - streamer + out_of_sync_node_distance: 10 + tier: 2 + time_since_last_block: 1h15m + time_since_last_event: 1h15m +workflows: + backfiller: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 2500 + checkpoint_size: 5000 + max_reprocessed_per_batch: 30 + mini_batch_size: 1 + num_concurrent_extractors: 21 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.backfiller + benchmarker: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + child_workflow_execution_start_to_close_timeout: 60m + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.benchmarker + cross_validator: + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 100 + checkpoint_size: 1000 + parallelism: 4 + task_list: default + validation_percentage: 10 + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.cross_validator + event_backfiller: + activity_retry_maximum_attempts: 3 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 250 + checkpoint_size: 5000 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.event_backfiller + monitor: + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 50 + block_gap_limit: 3000 + checkpoint_size: 250 + event_gap_limit: 300 + parallelism: 4 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.monitor + poller: + activity_heartbeat_timeout: 15m + activity_retry_maximum_attempts: 8 + activity_schedule_to_start_timeout: 2m + activity_start_to_close_timeout: 30m + backoff_interval: 10s + checkpoint_size: 1000 + fast_sync: false + liveness_check_enabled: true + liveness_check_interval: 1m + liveness_check_violation_limit: 10 + max_blocks_to_sync_per_cycle: 5 + parallelism: 10 + session_creation_timeout: 2m + session_enabled: false + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.poller + replicator: + activity_retry_maximum_attempts: 5 + activity_schedule_to_start_timeout: 5m + activity_start_to_close_timeout: 10m + batch_size: 1000 + checkpoint_size: 10000 + mini_batch_size: 100 + parallelism: 10 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.replicator + streamer: + activity_retry_maximum_attempts: 5 + activity_schedule_to_start_timeout: 2m + activity_start_to_close_timeout: 2m + backoff_interval: 10s + batch_size: 500 + checkpoint_size: 500 + task_list: default + workflow_decision_timeout: 2m + workflow_execution_timeout: 24h + workflow_identity: workflow.streamer + workers: + - task_list: default diff --git a/config/chainstorage/litecoin/mainnet/development.yml b/config/chainstorage/litecoin/mainnet/development.yml new file mode 100644 index 00000000..e2d7bb13 --- /dev/null +++ b/config/chainstorage/litecoin/mainnet/development.yml @@ -0,0 +1,16 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: development + bucket: example-chainstorage-litecoin-mainnet-dev +cadence: + address: temporal-dev.example.com:7233 +sdk: + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/litecoin/mainnet/v1 +server: + bind_address: 0.0.0.0:9090 +workflows: + poller: + activity_retry_maximum_attempts: 6 + activity_schedule_to_start_timeout: 5m + streamer: + activity_schedule_to_start_timeout: 5m diff --git a/config/chainstorage/litecoin/mainnet/local.yml b/config/chainstorage/litecoin/mainnet/local.yml new file mode 100644 index 00000000..9f5cd26c --- /dev/null +++ b/config/chainstorage/litecoin/mainnet/local.yml @@ -0,0 +1,38 @@ +# This file is generated by "make config". DO NOT EDIT. +chain: + client: + master: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 + slave: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 + validator: + endpoint_group: + endpoints: + - name: getblock + rps: 1 + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 +gcp: + project: chainstorage-local +sdk: + chainstorage_address: localhost:9090 + restful: false +storage_type: + blob: S3 + dlq: SQS + meta: DYNAMODB +workflows: + monitor: + failover_enabled: false + poller: + failover_enabled: false diff --git a/config/chainstorage/litecoin/mainnet/production.yml b/config/chainstorage/litecoin/mainnet/production.yml new file mode 100644 index 00000000..5cb04d06 --- /dev/null +++ b/config/chainstorage/litecoin/mainnet/production.yml @@ -0,0 +1,10 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: production + bucket: example-chainstorage-litecoin-mainnet-prod +cadence: + address: temporal.example.com:7233 +sdk: + chainstorage_address: https://nft-api.coinbase.com/api/exp/chainstorage/litecoin/mainnet/v1 +server: + bind_address: 0.0.0.0:9090 diff --git a/config/chainstorage/story/mainnet/base.yml b/config/chainstorage/story/mainnet/base.yml new file mode 100644 index 00000000..94213fe9 --- /dev/null +++ b/config/chainstorage/story/mainnet/base.yml @@ -0,0 +1,243 @@ +# This file is generated by "make config". DO NOT EDIT. +api: + auth: "" + max_num_block_files: 1000 + max_num_blocks: 50 + num_workers: 10 + rate_limit: + global_rps: 3000 + per_client_rps: 2000 + streaming_batch_size: 50 + streaming_interval: 1s + streaming_max_no_event_time: 10m +aws: + aws_account: development + bucket: "" + dlq: + delay_secs: 900 + name: example_chainstorage_blocks_story_mainnet_dlq + visibility_timeout_secs: 600 + dynamodb: + block_table: example_chainstorage_blocks_story_mainnet + transaction_table: example_chainstorage_transactions_table_story_mainnet + versioned_event_table: example_chainstorage_versioned_block_events_story_mainnet + versioned_event_table_block_index: example_chainstorage_versioned_block_events_by_block_id_story_mainnet + presigned_url_expiration: 30m + region: us-east-1 + storage: + data_compression: GZIP +cadence: + address: "" + domain: chainstorage-story-mainnet + retention_period: 7 + tls: + enabled: true + validate_hostname: true +chain: + block_start_height: 0 + block_tag: + latest: 1 + stable: 1 + block_time: 2s + blockchain: BLOCKCHAIN_STORY + client: + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: "" + slave: + endpoint_group: "" + validator: + endpoint_group: "" + event_tag: + latest: 1 + stable: 1 + feature: + block_validation_enabled: true + block_validation_muted: true + default_stable_event: true + rosetta_parser: true + irreversible_distance: 10 + network: NETWORK_STORY_MAINNET +config_name: story_mainnet +cron: + block_range_size: 4 +functional_test: "" +gcp: + presigned_url_expiration: 30m + project: development +sdk: + auth_header: "" + auth_token: "" + chainstorage_address: https://example-chainstorage-story-mainnet + num_workers: 10 + restful: true +server: + bind_address: localhost:9090 +sla: + block_height_delta: 60 + block_time_delta: 2m + event_height_delta: 60 + event_time_delta: 2m + expected_workflows: + - monitor + - poller + - streamer + - cross_validator + out_of_sync_node_distance: 60 + tier: 1 + time_since_last_block: 2m30s + time_since_last_event: 2m30s +workflows: + backfiller: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 20m + batch_size: 2500 + checkpoint_size: 5000 + max_reprocessed_per_batch: 30 + mini_batch_size: 1 + num_concurrent_extractors: 20 + task_list: default + workflow_identity: workflow.backfiller + workflow_run_timeout: 24h + benchmarker: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + child_workflow_execution_start_to_close_timeout: 60m + task_list: default + workflow_identity: workflow.benchmarker + workflow_run_timeout: 24h + cross_validator: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 8 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 1s + batch_size: 100 + checkpoint_size: 1000 + parallelism: 10 + task_list: default + validation_percentage: 100 + workflow_identity: workflow.cross_validator + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 3 + maximum_interval: 30s + workflow_run_timeout: 24h + event_backfiller: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + batch_size: 250 + checkpoint_size: 5000 + task_list: default + workflow_identity: workflow.event_backfiller + workflow_run_timeout: 24h + monitor: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 6 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 50 + block_gap_limit: 3000 + checkpoint_size: 500 + event_gap_limit: 300 + failover_enabled: true + parallelism: 4 + task_list: default + workflow_identity: workflow.monitor + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 6 + maximum_interval: 30s + workflow_run_timeout: 24h + poller: + activity_heartbeat_timeout: 2m + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 6 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 0s + checkpoint_size: 1000 + consensus_validation: true + consensus_validation_muted: true + failover_enabled: true + fast_sync: false + liveness_check_enabled: true + liveness_check_interval: 1m + liveness_check_violation_limit: 10 + max_blocks_to_sync_per_cycle: 100 + parallelism: 10 + session_creation_timeout: 2m + session_enabled: true + task_list: default + workflow_identity: workflow.poller + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 6 + maximum_interval: 30s + workflow_run_timeout: 24h + replicator: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + batch_size: 1000 + checkpoint_size: 10000 + mini_batch_size: 100 + parallelism: 10 + task_list: default + workflow_identity: workflow.replicator + workflow_run_timeout: 24h + streamer: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 5 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 2m + backoff_interval: 0s + batch_size: 500 + checkpoint_size: 500 + task_list: default + workflow_identity: workflow.streamer + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 3 + maximum_interval: 30s + workflow_run_timeout: 24h + workers: + - task_list: default diff --git a/config/chainstorage/story/mainnet/development.yml b/config/chainstorage/story/mainnet/development.yml new file mode 100644 index 00000000..9e7331ca --- /dev/null +++ b/config/chainstorage/story/mainnet/development.yml @@ -0,0 +1,8 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: development + bucket: example-chainstorage-story-mainnet-dev +cadence: + address: temporal-dev.example.com:7233 +server: + bind_address: 0.0.0.0:9090 diff --git a/config/chainstorage/story/mainnet/local.yml b/config/chainstorage/story/mainnet/local.yml new file mode 100644 index 00000000..cc1d22d9 --- /dev/null +++ b/config/chainstorage/story/mainnet/local.yml @@ -0,0 +1,10 @@ +# This file is generated by "make config". DO NOT EDIT. +gcp: + project: chainstorage-local +sdk: + chainstorage_address: localhost:9090 + restful: false +storage_type: + blob: S3 + dlq: SQS + meta: DYNAMODB diff --git a/config/chainstorage/story/mainnet/production.yml b/config/chainstorage/story/mainnet/production.yml new file mode 100644 index 00000000..50fe8f1d --- /dev/null +++ b/config/chainstorage/story/mainnet/production.yml @@ -0,0 +1,8 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: production + bucket: example-chainstorage-story-mainnet-prod +cadence: + address: temporal.example.com:7233 +server: + bind_address: 0.0.0.0:9090 diff --git a/config/chainstorage/tron/mainnet/base.yml b/config/chainstorage/tron/mainnet/base.yml new file mode 100644 index 00000000..5e3e2851 --- /dev/null +++ b/config/chainstorage/tron/mainnet/base.yml @@ -0,0 +1,248 @@ +# This file is generated by "make config". DO NOT EDIT. +api: + auth: "" + max_num_block_files: 1000 + max_num_blocks: 50 + num_workers: 10 + rate_limit: + global_rps: 3000 + per_client_rps: 2000 + streaming_batch_size: 50 + streaming_interval: 1s + streaming_max_no_event_time: 10m +aws: + aws_account: development + bucket: example-chainstorage-tron-mainnet-dev + dlq: + delay_secs: 900 + name: example_chainstorage_blocks_tron_mainnet_dlq + visibility_timeout_secs: 600 + dynamodb: + block_table: example_chainstorage_blocks_tron_mainnet + event_table: example_chainstorage_block_events_tron_mainnet + event_table_height_index: example_chainstorage_block_events_by_height_tron_mainnet + transaction_table: example_chainstorage_transactions_table_tron_mainnet + versioned_event_table: example_chainstorage_versioned_block_events_tron_mainnet + versioned_event_table_block_index: example_chainstorage_versioned_block_events_by_block_id_tron_mainnet + presigned_url_expiration: 30m + region: us-east-1 + storage: + data_compression: ZSTD +cadence: + address: "" + domain: chainstorage-tron-mainnet + retention_period: 7 + tls: + enabled: true + validate_hostname: true +chain: + block_start_height: 0 + block_tag: + latest: 2 + stable: 2 + block_time: 12s + blockchain: BLOCKCHAIN_TRON + client: + additional: + endpoint_group: "" + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: "" + slave: + endpoint_group: "" + validator: + endpoint_group: "" + event_tag: + latest: 3 + stable: 3 + feature: + block_validation_enabled: true + block_validation_muted: true + default_stable_event: true + rosetta_parser: true + irreversible_distance: 12 + network: NETWORK_TRON_MAINNET +config_name: tron_mainnet +cron: + block_range_size: 4 +functional_test: "" +gcp: + presigned_url_expiration: 30m + project: development +sdk: + auth_header: "" + auth_token: "" + chainstorage_address: https://example-chainstorage-tron-mainnet + num_workers: 10 + restful: true +server: + bind_address: localhost:9090 +sla: + block_height_delta: 10 + block_time_delta: 2m + event_height_delta: 10 + event_time_delta: 2m + expected_workflows: + - monitor + - poller + - streamer + - cross_validator + out_of_sync_node_distance: 10 + tier: 1 + time_since_last_block: 2m + time_since_last_event: 2m +workflows: + backfiller: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + batch_size: 2500 + checkpoint_size: 5000 + max_reprocessed_per_batch: 30 + mini_batch_size: 1 + num_concurrent_extractors: 24 + task_list: default + workflow_identity: workflow.backfiller + workflow_run_timeout: 24h + benchmarker: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + child_workflow_execution_start_to_close_timeout: 60m + task_list: default + workflow_identity: workflow.benchmarker + workflow_run_timeout: 24h + cross_validator: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 8 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 1000 + checkpoint_size: 1000 + parallelism: 4 + task_list: default + validation_percentage: 1 + validation_start_height: 15500000 + workflow_identity: workflow.cross_validator + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 3 + maximum_interval: 30s + workflow_run_timeout: 24h + event_backfiller: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + batch_size: 250 + checkpoint_size: 5000 + task_list: default + workflow_identity: workflow.event_backfiller + workflow_run_timeout: 24h + monitor: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 6 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 10s + batch_size: 50 + block_gap_limit: 3000 + checkpoint_size: 500 + event_gap_limit: 300 + failover_enabled: true + parallelism: 4 + task_list: default + workflow_identity: workflow.monitor + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 6 + maximum_interval: 30s + workflow_run_timeout: 24h + poller: + activity_heartbeat_timeout: 2m + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 6 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + backoff_interval: 1s + checkpoint_size: 1000 + consensus_validation: true + consensus_validation_muted: true + failover_enabled: true + fast_sync: false + liveness_check_enabled: true + liveness_check_interval: 1m + liveness_check_violation_limit: 10 + max_blocks_to_sync_per_cycle: 100 + parallelism: 10 + session_creation_timeout: 2m + session_enabled: true + task_list: default + workflow_identity: workflow.poller + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 6 + maximum_interval: 30s + workflow_run_timeout: 24h + replicator: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 3 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 10m + batch_size: 1000 + checkpoint_size: 10000 + mini_batch_size: 100 + parallelism: 10 + task_list: default + workflow_identity: workflow.replicator + workflow_run_timeout: 24h + streamer: + activity_retry: + backoff_coefficient: 2 + initial_interval: 10s + maximum_attempts: 5 + maximum_interval: 3m + activity_schedule_to_close_timeout: 1h + activity_start_to_close_timeout: 2m + backoff_interval: 1s + batch_size: 500 + checkpoint_size: 500 + task_list: default + workflow_identity: workflow.streamer + workflow_retry: + backoff_coefficient: 1 + initial_interval: 30s + maximum_attempts: 3 + maximum_interval: 30s + workflow_run_timeout: 24h + workers: + - task_list: default diff --git a/config/chainstorage/tron/mainnet/development.yml b/config/chainstorage/tron/mainnet/development.yml new file mode 100644 index 00000000..f145bdf5 --- /dev/null +++ b/config/chainstorage/tron/mainnet/development.yml @@ -0,0 +1,34 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: development + bucket: example-chainstorage-tron-mainnet-dev +cadence: + address: temporal-dev.example.com:7233 +chain: + event_tag: + latest: 2 + stable: 0 + feature: + default_stable_event: false +server: + bind_address: 0.0.0.0:9090 +sla: + block_height_delta: 12 + block_time_delta: 3m + event_height_delta: 12 + event_time_delta: 3m + expected_workflows: + - monitor + - poller + - streamer + - streamer/event_tag=1 + - streamer/event_tag=2 + - cross_validator + out_of_sync_node_distance: 12 + time_since_last_block: 3m + time_since_last_event: 3m +workflows: + monitor: + failover_enabled: false + poller: + failover_enabled: false diff --git a/config/chainstorage/tron/mainnet/local.yml b/config/chainstorage/tron/mainnet/local.yml new file mode 100644 index 00000000..6212c84f --- /dev/null +++ b/config/chainstorage/tron/mainnet/local.yml @@ -0,0 +1,38 @@ +# This file is generated by "make config". DO NOT EDIT. +gcp: + project: chainstorage-local +sdk: + chainstorage_address: localhost:9090 + restful: false +storage_type: + blob: S3 + dlq: SQS + meta: DYNAMODB +chain: + client: + additional: + endpoint_group: + endpoints: + - name: trongrid-restapi + rps: 1 + url: https://api.trongrid.io + weight: 1 + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: + endpoints: + - name: trongrid-jsonrpc-m + rps: 1 + url: https://api.trongrid.io/jsonrpc + weight: 1 + slave: + endpoint_group: + endpoints: + - name: trongrid-jsonrpc-s + rps: 1 + url: https://api.trongrid.io/jsonrpc + weight: 1 + validator: + endpoint_group: "" \ No newline at end of file diff --git a/config/chainstorage/tron/mainnet/production.yml b/config/chainstorage/tron/mainnet/production.yml new file mode 100644 index 00000000..632b861f --- /dev/null +++ b/config/chainstorage/tron/mainnet/production.yml @@ -0,0 +1,8 @@ +# This file is generated by "make config". DO NOT EDIT. +aws: + aws_account: production + bucket: example-chainstorage-tron-mainnet-prod +cadence: + address: temporal.example.com:7233 +server: + bind_address: 0.0.0.0:9090 diff --git a/config_templates/config/chainstorage/bitcoincash/mainnet/base.template.yml b/config_templates/config/chainstorage/bitcoincash/mainnet/base.template.yml new file mode 100644 index 00000000..5b7a4926 --- /dev/null +++ b/config_templates/config/chainstorage/bitcoincash/mainnet/base.template.yml @@ -0,0 +1,43 @@ +api: + max_num_blocks: 5 + streaming_max_no_event_time: 30m +aws: + dynamodb: + event_table: example_chainstorage_block_events_{{blockchain}}_{{network}} + event_table_height_index: example_chainstorage_block_events_by_height_{{blockchain}}_{{network}} +chain: + block_tag: + latest: 2 + stable: 2 + event_tag: + latest: 0 + stable: 0 + block_time: 10m + irreversible_distance: 2 + feature: + rosetta_parser: true +cron: + block_range_size: 2 + disable_dlq_processor: true +sla: + block_height_delta: 5 + block_time_delta: 1h + out_of_sync_node_distance: 10 + tier: 2 + time_since_last_block: 1h15m + event_height_delta: 5 + event_time_delta: 1h + time_since_last_event: 1h15m +workflows: + backfiller: + num_concurrent_extractors: 21 + monitor: + checkpoint_size: 250 + poller: + activity_heartbeat_timeout: 15m + activity_start_to_close_timeout: 30m + backoff_interval: 10s + max_blocks_to_sync_per_cycle: 5 + parallelism: 10 + streamer: + backoff_interval: 10s diff --git a/config_templates/config/chainstorage/bitcoincash/mainnet/development.template.yml b/config_templates/config/chainstorage/bitcoincash/mainnet/development.template.yml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/config_templates/config/chainstorage/bitcoincash/mainnet/development.template.yml @@ -0,0 +1 @@ + diff --git a/config_templates/config/chainstorage/bitcoincash/mainnet/local.template.yml b/config_templates/config/chainstorage/bitcoincash/mainnet/local.template.yml new file mode 100644 index 00000000..cb485766 --- /dev/null +++ b/config_templates/config/chainstorage/bitcoincash/mainnet/local.template.yml @@ -0,0 +1,30 @@ + +chain: + client: + master: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 + rps: 1 + slave: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 + rps: 1 + validator: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/9fab7739b91042e7903fca6001e81b23 + weight: 1 + rps: 1 +workflows: + poller: + failover_enabled: false + monitor: + failover_enabled: false + diff --git a/config_templates/config/chainstorage/bitcoincash/mainnet/production.template.yml b/config_templates/config/chainstorage/bitcoincash/mainnet/production.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/config_templates/config/chainstorage/litecoin/mainnet/base.template.yml b/config_templates/config/chainstorage/litecoin/mainnet/base.template.yml new file mode 100644 index 00000000..5b7a4926 --- /dev/null +++ b/config_templates/config/chainstorage/litecoin/mainnet/base.template.yml @@ -0,0 +1,43 @@ +api: + max_num_blocks: 5 + streaming_max_no_event_time: 30m +aws: + dynamodb: + event_table: example_chainstorage_block_events_{{blockchain}}_{{network}} + event_table_height_index: example_chainstorage_block_events_by_height_{{blockchain}}_{{network}} +chain: + block_tag: + latest: 2 + stable: 2 + event_tag: + latest: 0 + stable: 0 + block_time: 10m + irreversible_distance: 2 + feature: + rosetta_parser: true +cron: + block_range_size: 2 + disable_dlq_processor: true +sla: + block_height_delta: 5 + block_time_delta: 1h + out_of_sync_node_distance: 10 + tier: 2 + time_since_last_block: 1h15m + event_height_delta: 5 + event_time_delta: 1h + time_since_last_event: 1h15m +workflows: + backfiller: + num_concurrent_extractors: 21 + monitor: + checkpoint_size: 250 + poller: + activity_heartbeat_timeout: 15m + activity_start_to_close_timeout: 30m + backoff_interval: 10s + max_blocks_to_sync_per_cycle: 5 + parallelism: 10 + streamer: + backoff_interval: 10s diff --git a/config_templates/config/chainstorage/litecoin/mainnet/development.template.yml b/config_templates/config/chainstorage/litecoin/mainnet/development.template.yml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/config_templates/config/chainstorage/litecoin/mainnet/development.template.yml @@ -0,0 +1 @@ + diff --git a/config_templates/config/chainstorage/litecoin/mainnet/local.template.yml b/config_templates/config/chainstorage/litecoin/mainnet/local.template.yml new file mode 100644 index 00000000..214634d9 --- /dev/null +++ b/config_templates/config/chainstorage/litecoin/mainnet/local.template.yml @@ -0,0 +1,30 @@ + +chain: + client: + master: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 + rps: 1 + slave: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 + rps: 1 + validator: + endpoint_group: + endpoints: + - name: getblock + url: https://go.getblock.io/50d006b05722430b940d0c63e47ff893 + weight: 1 + rps: 1 +workflows: + poller: + failover_enabled: false + monitor: + failover_enabled: false + diff --git a/config_templates/config/chainstorage/litecoin/mainnet/production.template.yml b/config_templates/config/chainstorage/litecoin/mainnet/production.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/config_templates/config/chainstorage/story/mainnet/base.template.yml b/config_templates/config/chainstorage/story/mainnet/base.template.yml new file mode 100644 index 00000000..01e2129a --- /dev/null +++ b/config_templates/config/chainstorage/story/mainnet/base.template.yml @@ -0,0 +1,40 @@ +chain: + block_time: 2s + feature: + block_validation_enabled: true + block_validation_muted: true + rosetta_parser: true + irreversible_distance: 10 +sla: + block_height_delta: 60 + block_time_delta: 2m + out_of_sync_node_distance: 60 + tier: 1 + time_since_last_block: 2m30s + event_height_delta: 60 + event_time_delta: 2m + time_since_last_event: 2m30s + expected_workflows: + - monitor + - poller + - streamer + - cross_validator +workflows: + backfiller: + num_concurrent_extractors: 20 + activity_start_to_close_timeout: 20m + cross_validator: + backoff_interval: 1s + parallelism: 10 + validation_percentage: 100 + poller: + backoff_interval: 0s + consensus_validation: true + consensus_validation_muted: true + failover_enabled: true + parallelism: 10 + session_enabled: true + monitor: + failover_enabled: true + streamer: + backoff_interval: 0s diff --git a/config_templates/config/chainstorage/story/mainnet/development.template.yml b/config_templates/config/chainstorage/story/mainnet/development.template.yml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/config_templates/config/chainstorage/story/mainnet/development.template.yml @@ -0,0 +1 @@ + diff --git a/config_templates/config/chainstorage/story/mainnet/local.template.yml b/config_templates/config/chainstorage/story/mainnet/local.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/config_templates/config/chainstorage/story/mainnet/production.template.yml b/config_templates/config/chainstorage/story/mainnet/production.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/config_templates/config/chainstorage/tron/mainnet/base.template.yml b/config_templates/config/chainstorage/tron/mainnet/base.template.yml new file mode 100644 index 00000000..041effaf --- /dev/null +++ b/config_templates/config/chainstorage/tron/mainnet/base.template.yml @@ -0,0 +1,69 @@ +aws: + aws_account: development + bucket: example-chainstorage-{{blockchain}}-{{network}}-dev + dlq: + name: example_chainstorage_blocks_{{blockchain}}_{{network}}_dlq + dynamodb: + event_table: example_chainstorage_block_events_{{blockchain}}_{{network}} + event_table_height_index: example_chainstorage_block_events_by_height_{{blockchain}}_{{network}} + storage: + data_compression: ZSTD +chain: + client: + consensus: + endpoint_group: "" + http_timeout: 0s + master: + endpoint_group: "" + slave: + endpoint_group: "" + validator: + endpoint_group: "" + additional: + endpoint_group: "" + block_tag: + latest: 2 + stable: 2 + block_time: 12s + event_tag: + latest: 3 + stable: 3 + irreversible_distance: 12 + feature: + rosetta_parser: true + default_stable_event: true + block_validation_enabled: true + block_validation_muted: true +sla: + block_height_delta: 10 + block_time_delta: 2m + out_of_sync_node_distance: 10 + tier: 1 + time_since_last_block: 2m + event_height_delta: 10 + event_time_delta: 2m + time_since_last_event: 2m + expected_workflows: + - monitor + - poller + - streamer + - cross_validator +workflows: + backfiller: + checkpoint_size: 5000 + num_concurrent_extractors: 24 + cross_validator: + batch_size: 1000 + validation_start_height: 15500000 + validation_percentage: 1 + poller: + parallelism: 10 + failover_enabled: true + session_enabled: true + backoff_interval: 1s + consensus_validation: true + consensus_validation_muted: true + monitor: + failover_enabled: true + streamer: + backoff_interval: 1s diff --git a/config_templates/config/chainstorage/tron/mainnet/development.template.yml b/config_templates/config/chainstorage/tron/mainnet/development.template.yml new file mode 100644 index 00000000..401fee12 --- /dev/null +++ b/config_templates/config/chainstorage/tron/mainnet/development.template.yml @@ -0,0 +1,28 @@ +chain: + event_tag: + latest: 2 + stable: 0 + feature: + default_stable_event: false +aws: + aws_account: development +sla: + block_height_delta: 12 + block_time_delta: 3m + out_of_sync_node_distance: 12 + time_since_last_block: 3m + event_height_delta: 12 + event_time_delta: 3m + time_since_last_event: 3m + expected_workflows: + - monitor + - poller + - streamer + - streamer/event_tag=1 + - streamer/event_tag=2 + - cross_validator +workflows: + poller: + failover_enabled: false + monitor: + failover_enabled: false diff --git a/config_templates/config/chainstorage/tron/mainnet/local.template.yml b/config_templates/config/chainstorage/tron/mainnet/local.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/config_templates/config/chainstorage/tron/mainnet/production.template.yml b/config_templates/config/chainstorage/tron/mainnet/production.template.yml new file mode 100644 index 00000000..e69de29b diff --git a/docker-compose-testing.yml b/docker-compose-testing.yml index db728013..7f7b7510 100644 --- a/docker-compose-testing.yml +++ b/docker-compose-testing.yml @@ -2,7 +2,7 @@ version: "3" services: localstack: - image: localstack/localstack:2.3.2 + image: localstack/localstack:3.1.0 ports: - 4566:4566 - 4510-4559:4510-4559 # external services port range diff --git a/gen/src/python/coinbase/c3/common/common_pb2.py b/gen/src/python/coinbase/c3/common/common_pb2.py new file mode 100644 index 00000000..26dd40c5 --- /dev/null +++ b/gen/src/python/coinbase/c3/common/common_pb2.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/c3/common/common.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/c3/common/common.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x63oinbase/c3/common/common.proto\x12\x12\x63oinbase.c3.common*\x9f\x03\n\nBlockchain\x12\x16\n\x12\x42LOCKCHAIN_UNKNOWN\x10\x00\x12\x15\n\x11\x42LOCKCHAIN_SOLANA\x10\x0b\x12\x16\n\x12\x42LOCKCHAIN_BITCOIN\x10\x10\x12\x17\n\x13\x42LOCKCHAIN_ETHEREUM\x10\x11\x12\x1a\n\x16\x42LOCKCHAIN_BITCOINCASH\x10\x12\x12\x17\n\x13\x42LOCKCHAIN_LITECOIN\x10\x13\x12\x17\n\x13\x42LOCKCHAIN_DOGECOIN\x10\x1a\x12\x13\n\x0f\x42LOCKCHAIN_TRON\x10\x1e\x12\x12\n\x0e\x42LOCKCHAIN_BSC\x10\x1f\x12\x18\n\x14\x42LOCKCHAIN_AVACCHAIN\x10 \x12\x16\n\x12\x42LOCKCHAIN_POLYGON\x10#\x12\x17\n\x13\x42LOCKCHAIN_OPTIMISM\x10\'\x12\x17\n\x13\x42LOCKCHAIN_ARBITRUM\x10)\x12\x14\n\x10\x42LOCKCHAIN_APTOS\x10/\x12\x15\n\x11\x42LOCKCHAIN_FANTOM\x10\x33\x12\x13\n\x0f\x42LOCKCHAIN_BASE\x10\x38\x12\x14\n\x10\x42LOCKCHAIN_STORY\x10<*\xd5\x07\n\x07Network\x12\x13\n\x0fNETWORK_UNKNOWN\x10\x00\x12\x1a\n\x16NETWORK_SOLANA_MAINNET\x10\x16\x12\x1a\n\x16NETWORK_SOLANA_TESTNET\x10\x17\x12\x1b\n\x17NETWORK_BITCOIN_MAINNET\x10!\x12\x1b\n\x17NETWORK_BITCOIN_TESTNET\x10\"\x12\x1c\n\x18NETWORK_ETHEREUM_MAINNET\x10#\x12\x1c\n\x18NETWORK_ETHEREUM_TESTNET\x10$\x12\x1f\n\x1bNETWORK_BITCOINCASH_MAINNET\x10%\x12\x1f\n\x1bNETWORK_BITCOINCASH_TESTNET\x10&\x12\x1c\n\x18NETWORK_LITECOIN_MAINNET\x10\'\x12\x1c\n\x18NETWORK_LITECOIN_TESTNET\x10(\x12\x18\n\x14NETWORK_TRON_MAINNET\x10@\x12\x18\n\x14NETWORK_TRON_TESTNET\x10\x41\x12\x1b\n\x17NETWORK_ETHEREUM_GOERLI\x10\x42\x12\x1c\n\x18NETWORK_DOGECOIN_MAINNET\x10\x38\x12\x1c\n\x18NETWORK_DOGECOIN_TESTNET\x10\x39\x12\x17\n\x13NETWORK_BSC_MAINNET\x10\x46\x12\x17\n\x13NETWORK_BSC_TESTNET\x10G\x12\x1d\n\x19NETWORK_AVACCHAIN_MAINNET\x10H\x12\x1d\n\x19NETWORK_AVACCHAIN_TESTNET\x10I\x12\x1b\n\x17NETWORK_POLYGON_MAINNET\x10N\x12\x1b\n\x17NETWORK_POLYGON_TESTNET\x10O\x12\x1c\n\x18NETWORK_OPTIMISM_MAINNET\x10V\x12\x1c\n\x18NETWORK_OPTIMISM_TESTNET\x10W\x12\x1c\n\x18NETWORK_ARBITRUM_MAINNET\x10[\x12\x1c\n\x18NETWORK_ARBITRUM_TESTNET\x10\\\x12\x19\n\x15NETWORK_APTOS_MAINNET\x10g\x12\x19\n\x15NETWORK_APTOS_TESTNET\x10h\x12\x1a\n\x16NETWORK_FANTOM_MAINNET\x10o\x12\x1a\n\x16NETWORK_FANTOM_TESTNET\x10p\x12\x18\n\x14NETWORK_BASE_MAINNET\x10{\x12\x17\n\x13NETWORK_BASE_GOERLI\x10}\x12\x1d\n\x18NETWORK_ETHEREUM_HOLESKY\x10\x88\x01\x12\x1a\n\x15NETWORK_STORY_MAINNET\x10\x8c\x01\x42={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/api_pb2.py b/gen/src/python/coinbase/chainstorage/api_pb2.py new file mode 100644 index 00000000..eda3b192 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/api_pb2.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/api.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/api.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from coinbase.chainstorage import blockchain_pb2 as coinbase_dot_chainstorage_dot_blockchain__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x63oinbase/chainstorage/api.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&coinbase/chainstorage/blockchain.proto\"\xf3\x01\n\tBlockFile\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0c\n\x04hash\x18\x02 \x01(\t\x12\x13\n\x0bparent_hash\x18\x03 \x01(\t\x12\x0e\n\x06height\x18\x04 \x01(\x04\x12\x10\n\x08\x66ile_url\x18\x05 \x01(\t\x12\x15\n\rparent_height\x18\x06 \x01(\x04\x12\x0f\n\x07skipped\x18\x07 \x01(\x08\x12\x37\n\x0b\x63ompression\x18\x08 \x01(\x0e\x32\".coinbase.chainstorage.Compression\x12\x33\n\x0f\x62lock_timestamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xfb\x01\n\x0f\x42lockchainEvent\x12\x14\n\x08sequence\x18\x01 \x01(\tB\x02\x18\x01\x12\x39\n\x04type\x18\x02 \x01(\x0e\x32+.coinbase.chainstorage.BlockchainEvent.Type\x12\x35\n\x05\x62lock\x18\x03 \x01(\x0b\x32&.coinbase.chainstorage.BlockIdentifier\x12\x11\n\tevent_tag\x18\x04 \x01(\r\x12\x14\n\x0csequence_num\x18\x05 \x01(\x03\"7\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x42LOCK_ADDED\x10\x01\x12\x11\n\rBLOCK_REMOVED\x10\x02\"$\n\x15GetLatestBlockRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\"\x87\x01\n\x16GetLatestBlockResponse\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0c\n\x04hash\x18\x02 \x01(\t\x12\x13\n\x0bparent_hash\x18\x03 \x01(\t\x12\x0e\n\x06height\x18\x04 \x01(\x04\x12-\n\ttimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"@\n\x13GetBlockFileRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\t\"F\n\x14GetBlockFileResponse\x12.\n\x04\x66ile\x18\x01 \x01(\x0b\x32 .coinbase.chainstorage.BlockFile\"T\n\x1bGetBlockFilesByRangeRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x14\n\x0cstart_height\x18\x02 \x01(\x04\x12\x12\n\nend_height\x18\x03 \x01(\x04\"O\n\x1cGetBlockFilesByRangeResponse\x12/\n\x05\x66iles\x18\x01 \x03(\x0b\x32 .coinbase.chainstorage.BlockFile\"?\n\x12GetRawBlockRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\t\"B\n\x13GetRawBlockResponse\x12+\n\x05\x62lock\x18\x01 \x01(\x0b\x32\x1c.coinbase.chainstorage.Block\"S\n\x1aGetRawBlocksByRangeRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x14\n\x0cstart_height\x18\x02 \x01(\x04\x12\x12\n\nend_height\x18\x03 \x01(\x04\"K\n\x1bGetRawBlocksByRangeResponse\x12,\n\x06\x62locks\x18\x01 \x03(\x0b\x32\x1c.coinbase.chainstorage.Block\"B\n\x15GetNativeBlockRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\t\"K\n\x16GetNativeBlockResponse\x12\x31\n\x05\x62lock\x18\x01 \x01(\x0b\x32\".coinbase.chainstorage.NativeBlock\"V\n\x1dGetNativeBlocksByRangeRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x14\n\x0cstart_height\x18\x02 \x01(\x04\x12\x12\n\nend_height\x18\x03 \x01(\x04\"T\n\x1eGetNativeBlocksByRangeResponse\x12\x32\n\x06\x62locks\x18\x01 \x03(\x0b\x32\".coinbase.chainstorage.NativeBlock\"C\n\x16GetRosettaBlockRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\t\"M\n\x17GetRosettaBlockResponse\x12\x32\n\x05\x62lock\x18\x01 \x01(\x0b\x32#.coinbase.chainstorage.RosettaBlock\"W\n\x1eGetRosettaBlocksByRangeRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x14\n\x0cstart_height\x18\x02 \x01(\x04\x12\x12\n\nend_height\x18\x03 \x01(\x04\"V\n\x1fGetRosettaBlocksByRangeResponse\x12\x33\n\x06\x62locks\x18\x01 \x03(\x0b\x32#.coinbase.chainstorage.RosettaBlock\"w\n\x12\x43hainEventsRequest\x12\"\n\x1ainitial_position_in_stream\x18\x01 \x01(\t\x12\x14\n\x08sequence\x18\x02 \x01(\tB\x02\x18\x01\x12\x11\n\tevent_tag\x18\x03 \x01(\r\x12\x14\n\x0csequence_num\x18\x04 \x01(\x03\"L\n\x13\x43hainEventsResponse\x12\x35\n\x05\x65vent\x18\x01 \x01(\x0b\x32&.coinbase.chainstorage.BlockchainEvent\"\x92\x01\n\x15GetChainEventsRequest\x12\x14\n\x08sequence\x18\x01 \x01(\tB\x02\x18\x01\x12\"\n\x1ainitial_position_in_stream\x18\x02 \x01(\t\x12\x16\n\x0emax_num_events\x18\x03 \x01(\x04\x12\x11\n\tevent_tag\x18\x04 \x01(\r\x12\x14\n\x0csequence_num\x18\x05 \x01(\x03\"P\n\x16GetChainEventsResponse\x12\x36\n\x06\x65vents\x18\x01 \x03(\x0b\x32&.coinbase.chainstorage.BlockchainEvent\"\x19\n\x17GetChainMetadataRequest\"\xd1\x01\n\x18GetChainMetadataResponse\x12\x18\n\x10latest_block_tag\x18\x08 \x01(\r\x12\x18\n\x10stable_block_tag\x18\t \x01(\r\x12\x18\n\x10latest_event_tag\x18\n \x01(\r\x12\x18\n\x10stable_event_tag\x18\x0b \x01(\r\x12\x1a\n\x12\x62lock_start_height\x18\x0c \x01(\x04\x12\x1d\n\x15irreversible_distance\x18\r \x01(\x04\x12\x12\n\nblock_time\x18\x0e \x01(\t\"\x83\x01\n\x1dGetVersionedChainEventRequest\x12\x16\n\x0e\x66rom_event_tag\x18\x01 \x01(\r\x12\x19\n\rfrom_sequence\x18\x02 \x01(\tB\x02\x18\x01\x12\x14\n\x0cto_event_tag\x18\x03 \x01(\r\x12\x19\n\x11\x66rom_sequence_num\x18\x04 \x01(\x03\"W\n\x1eGetVersionedChainEventResponse\x12\x35\n\x05\x65vent\x18\x01 \x01(\x0b\x32&.coinbase.chainstorage.BlockchainEvent\"E\n\x1cGetBlockByTransactionRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x18\n\x10transaction_hash\x18\x02 \x01(\t\"W\n\x1dGetBlockByTransactionResponse\x12\x36\n\x06\x62locks\x18\x01 \x03(\x0b\x32&.coinbase.chainstorage.BlockIdentifier\"D\n\x1bGetNativeTransactionRequest\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x18\n\x10transaction_hash\x18\x02 \x01(\t\"^\n\x1cGetNativeTransactionResponse\x12>\n\x0ctransactions\x18\x01 \x03(\x0b\x32(.coinbase.chainstorage.NativeTransaction\"l\n\x1eGetVerifiedAccountStateRequest\x12J\n\x03req\x18\x01 \x01(\x0b\x32=.coinbase.chainstorage.InternalGetVerifiedAccountStateRequest\"h\n\x1fGetVerifiedAccountStateResponse\x12\x45\n\x08response\x18\x01 \x01(\x0b\x32\x33.coinbase.chainstorage.ValidateAccountStateResponse*+\n\x0b\x43ompression\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04GZIP\x10\x01\x12\x08\n\x04ZSTD\x10\x02*+\n\x0fInitialPosition\x12\x0c\n\x08\x45\x41RLIEST\x10\x00\x12\n\n\x06LATEST\x10\x01\x32\xaa\x0f\n\x0c\x43hainStorage\x12m\n\x0eGetLatestBlock\x12,.coinbase.chainstorage.GetLatestBlockRequest\x1a-.coinbase.chainstorage.GetLatestBlockResponse\x12g\n\x0cGetBlockFile\x12*.coinbase.chainstorage.GetBlockFileRequest\x1a+.coinbase.chainstorage.GetBlockFileResponse\x12\x7f\n\x14GetBlockFilesByRange\x12\x32.coinbase.chainstorage.GetBlockFilesByRangeRequest\x1a\x33.coinbase.chainstorage.GetBlockFilesByRangeResponse\x12\x64\n\x0bGetRawBlock\x12).coinbase.chainstorage.GetRawBlockRequest\x1a*.coinbase.chainstorage.GetRawBlockResponse\x12|\n\x13GetRawBlocksByRange\x12\x31.coinbase.chainstorage.GetRawBlocksByRangeRequest\x1a\x32.coinbase.chainstorage.GetRawBlocksByRangeResponse\x12m\n\x0eGetNativeBlock\x12,.coinbase.chainstorage.GetNativeBlockRequest\x1a-.coinbase.chainstorage.GetNativeBlockResponse\x12\x85\x01\n\x16GetNativeBlocksByRange\x12\x34.coinbase.chainstorage.GetNativeBlocksByRangeRequest\x1a\x35.coinbase.chainstorage.GetNativeBlocksByRangeResponse\x12p\n\x0fGetRosettaBlock\x12-.coinbase.chainstorage.GetRosettaBlockRequest\x1a..coinbase.chainstorage.GetRosettaBlockResponse\x12\x88\x01\n\x17GetRosettaBlocksByRange\x12\x35.coinbase.chainstorage.GetRosettaBlocksByRangeRequest\x1a\x36.coinbase.chainstorage.GetRosettaBlocksByRangeResponse\x12l\n\x11StreamChainEvents\x12).coinbase.chainstorage.ChainEventsRequest\x1a*.coinbase.chainstorage.ChainEventsResponse0\x01\x12m\n\x0eGetChainEvents\x12,.coinbase.chainstorage.GetChainEventsRequest\x1a-.coinbase.chainstorage.GetChainEventsResponse\x12s\n\x10GetChainMetadata\x12..coinbase.chainstorage.GetChainMetadataRequest\x1a/.coinbase.chainstorage.GetChainMetadataResponse\x12\x85\x01\n\x16GetVersionedChainEvent\x12\x34.coinbase.chainstorage.GetVersionedChainEventRequest\x1a\x35.coinbase.chainstorage.GetVersionedChainEventResponse\x12\x82\x01\n\x15GetBlockByTransaction\x12\x33.coinbase.chainstorage.GetBlockByTransactionRequest\x1a\x34.coinbase.chainstorage.GetBlockByTransactionResponse\x12\x7f\n\x14GetNativeTransaction\x12\x32.coinbase.chainstorage.GetNativeTransactionRequest\x1a\x33.coinbase.chainstorage.GetNativeTransactionResponse\x12\x88\x01\n\x17GetVerifiedAccountState\x12\x35.coinbase.chainstorage.GetVerifiedAccountStateRequest\x1a\x36.coinbase.chainstorage.GetVerifiedAccountStateResponseB?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.api_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_BLOCKCHAINEVENT'].fields_by_name['sequence']._loaded_options = None + _globals['_BLOCKCHAINEVENT'].fields_by_name['sequence']._serialized_options = b'\030\001' + _globals['_CHAINEVENTSREQUEST'].fields_by_name['sequence']._loaded_options = None + _globals['_CHAINEVENTSREQUEST'].fields_by_name['sequence']._serialized_options = b'\030\001' + _globals['_GETCHAINEVENTSREQUEST'].fields_by_name['sequence']._loaded_options = None + _globals['_GETCHAINEVENTSREQUEST'].fields_by_name['sequence']._serialized_options = b'\030\001' + _globals['_GETVERSIONEDCHAINEVENTREQUEST'].fields_by_name['from_sequence']._loaded_options = None + _globals['_GETVERSIONEDCHAINEVENTREQUEST'].fields_by_name['from_sequence']._serialized_options = b'\030\001' + _globals['_COMPRESSION']._serialized_start=3485 + _globals['_COMPRESSION']._serialized_end=3528 + _globals['_INITIALPOSITION']._serialized_start=3530 + _globals['_INITIALPOSITION']._serialized_end=3573 + _globals['_BLOCKFILE']._serialized_start=132 + _globals['_BLOCKFILE']._serialized_end=375 + _globals['_BLOCKCHAINEVENT']._serialized_start=378 + _globals['_BLOCKCHAINEVENT']._serialized_end=629 + _globals['_BLOCKCHAINEVENT_TYPE']._serialized_start=574 + _globals['_BLOCKCHAINEVENT_TYPE']._serialized_end=629 + _globals['_GETLATESTBLOCKREQUEST']._serialized_start=631 + _globals['_GETLATESTBLOCKREQUEST']._serialized_end=667 + _globals['_GETLATESTBLOCKRESPONSE']._serialized_start=670 + _globals['_GETLATESTBLOCKRESPONSE']._serialized_end=805 + _globals['_GETBLOCKFILEREQUEST']._serialized_start=807 + _globals['_GETBLOCKFILEREQUEST']._serialized_end=871 + _globals['_GETBLOCKFILERESPONSE']._serialized_start=873 + _globals['_GETBLOCKFILERESPONSE']._serialized_end=943 + _globals['_GETBLOCKFILESBYRANGEREQUEST']._serialized_start=945 + _globals['_GETBLOCKFILESBYRANGEREQUEST']._serialized_end=1029 + _globals['_GETBLOCKFILESBYRANGERESPONSE']._serialized_start=1031 + _globals['_GETBLOCKFILESBYRANGERESPONSE']._serialized_end=1110 + _globals['_GETRAWBLOCKREQUEST']._serialized_start=1112 + _globals['_GETRAWBLOCKREQUEST']._serialized_end=1175 + _globals['_GETRAWBLOCKRESPONSE']._serialized_start=1177 + _globals['_GETRAWBLOCKRESPONSE']._serialized_end=1243 + _globals['_GETRAWBLOCKSBYRANGEREQUEST']._serialized_start=1245 + _globals['_GETRAWBLOCKSBYRANGEREQUEST']._serialized_end=1328 + _globals['_GETRAWBLOCKSBYRANGERESPONSE']._serialized_start=1330 + _globals['_GETRAWBLOCKSBYRANGERESPONSE']._serialized_end=1405 + _globals['_GETNATIVEBLOCKREQUEST']._serialized_start=1407 + _globals['_GETNATIVEBLOCKREQUEST']._serialized_end=1473 + _globals['_GETNATIVEBLOCKRESPONSE']._serialized_start=1475 + _globals['_GETNATIVEBLOCKRESPONSE']._serialized_end=1550 + _globals['_GETNATIVEBLOCKSBYRANGEREQUEST']._serialized_start=1552 + _globals['_GETNATIVEBLOCKSBYRANGEREQUEST']._serialized_end=1638 + _globals['_GETNATIVEBLOCKSBYRANGERESPONSE']._serialized_start=1640 + _globals['_GETNATIVEBLOCKSBYRANGERESPONSE']._serialized_end=1724 + _globals['_GETROSETTABLOCKREQUEST']._serialized_start=1726 + _globals['_GETROSETTABLOCKREQUEST']._serialized_end=1793 + _globals['_GETROSETTABLOCKRESPONSE']._serialized_start=1795 + _globals['_GETROSETTABLOCKRESPONSE']._serialized_end=1872 + _globals['_GETROSETTABLOCKSBYRANGEREQUEST']._serialized_start=1874 + _globals['_GETROSETTABLOCKSBYRANGEREQUEST']._serialized_end=1961 + _globals['_GETROSETTABLOCKSBYRANGERESPONSE']._serialized_start=1963 + _globals['_GETROSETTABLOCKSBYRANGERESPONSE']._serialized_end=2049 + _globals['_CHAINEVENTSREQUEST']._serialized_start=2051 + _globals['_CHAINEVENTSREQUEST']._serialized_end=2170 + _globals['_CHAINEVENTSRESPONSE']._serialized_start=2172 + _globals['_CHAINEVENTSRESPONSE']._serialized_end=2248 + _globals['_GETCHAINEVENTSREQUEST']._serialized_start=2251 + _globals['_GETCHAINEVENTSREQUEST']._serialized_end=2397 + _globals['_GETCHAINEVENTSRESPONSE']._serialized_start=2399 + _globals['_GETCHAINEVENTSRESPONSE']._serialized_end=2479 + _globals['_GETCHAINMETADATAREQUEST']._serialized_start=2481 + _globals['_GETCHAINMETADATAREQUEST']._serialized_end=2506 + _globals['_GETCHAINMETADATARESPONSE']._serialized_start=2509 + _globals['_GETCHAINMETADATARESPONSE']._serialized_end=2718 + _globals['_GETVERSIONEDCHAINEVENTREQUEST']._serialized_start=2721 + _globals['_GETVERSIONEDCHAINEVENTREQUEST']._serialized_end=2852 + _globals['_GETVERSIONEDCHAINEVENTRESPONSE']._serialized_start=2854 + _globals['_GETVERSIONEDCHAINEVENTRESPONSE']._serialized_end=2941 + _globals['_GETBLOCKBYTRANSACTIONREQUEST']._serialized_start=2943 + _globals['_GETBLOCKBYTRANSACTIONREQUEST']._serialized_end=3012 + _globals['_GETBLOCKBYTRANSACTIONRESPONSE']._serialized_start=3014 + _globals['_GETBLOCKBYTRANSACTIONRESPONSE']._serialized_end=3101 + _globals['_GETNATIVETRANSACTIONREQUEST']._serialized_start=3103 + _globals['_GETNATIVETRANSACTIONREQUEST']._serialized_end=3171 + _globals['_GETNATIVETRANSACTIONRESPONSE']._serialized_start=3173 + _globals['_GETNATIVETRANSACTIONRESPONSE']._serialized_end=3267 + _globals['_GETVERIFIEDACCOUNTSTATEREQUEST']._serialized_start=3269 + _globals['_GETVERIFIEDACCOUNTSTATEREQUEST']._serialized_end=3377 + _globals['_GETVERIFIEDACCOUNTSTATERESPONSE']._serialized_start=3379 + _globals['_GETVERIFIEDACCOUNTSTATERESPONSE']._serialized_end=3483 + _globals['_CHAINSTORAGE']._serialized_start=3576 + _globals['_CHAINSTORAGE']._serialized_end=5538 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/api_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/api_pb2_grpc.py new file mode 100644 index 00000000..080639fc --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/api_pb2_grpc.py @@ -0,0 +1,742 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from coinbase.chainstorage import api_pb2 as coinbase_dot_chainstorage_dot_api__pb2 + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/api_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class ChainStorageStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetLatestBlock = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetLatestBlock', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockResponse.FromString, + _registered_method=True) + self.GetBlockFile = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetBlockFile', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileResponse.FromString, + _registered_method=True) + self.GetBlockFilesByRange = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetBlockFilesByRange', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeResponse.FromString, + _registered_method=True) + self.GetRawBlock = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetRawBlock', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockResponse.FromString, + _registered_method=True) + self.GetRawBlocksByRange = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetRawBlocksByRange', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeResponse.FromString, + _registered_method=True) + self.GetNativeBlock = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetNativeBlock', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockResponse.FromString, + _registered_method=True) + self.GetNativeBlocksByRange = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetNativeBlocksByRange', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeResponse.FromString, + _registered_method=True) + self.GetRosettaBlock = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetRosettaBlock', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockResponse.FromString, + _registered_method=True) + self.GetRosettaBlocksByRange = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetRosettaBlocksByRange', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeResponse.FromString, + _registered_method=True) + self.StreamChainEvents = channel.unary_stream( + '/coinbase.chainstorage.ChainStorage/StreamChainEvents', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.ChainEventsRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.ChainEventsResponse.FromString, + _registered_method=True) + self.GetChainEvents = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetChainEvents', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsResponse.FromString, + _registered_method=True) + self.GetChainMetadata = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetChainMetadata', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataResponse.FromString, + _registered_method=True) + self.GetVersionedChainEvent = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetVersionedChainEvent', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventResponse.FromString, + _registered_method=True) + self.GetBlockByTransaction = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetBlockByTransaction', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionResponse.FromString, + _registered_method=True) + self.GetNativeTransaction = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetNativeTransaction', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionResponse.FromString, + _registered_method=True) + self.GetVerifiedAccountState = channel.unary_unary( + '/coinbase.chainstorage.ChainStorage/GetVerifiedAccountState', + request_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateRequest.SerializeToString, + response_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateResponse.FromString, + _registered_method=True) + + +class ChainStorageServicer(object): + """Missing associated documentation comment in .proto file.""" + + def GetLatestBlock(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockFile(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockFilesByRange(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetRawBlock(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetRawBlocksByRange(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNativeBlock(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNativeBlocksByRange(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetRosettaBlock(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetRosettaBlocksByRange(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StreamChainEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetChainEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetChainMetadata(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetVersionedChainEvent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockByTransaction(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNativeTransaction(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetVerifiedAccountState(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ChainStorageServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetLatestBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetLatestBlock, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockResponse.SerializeToString, + ), + 'GetBlockFile': grpc.unary_unary_rpc_method_handler( + servicer.GetBlockFile, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileResponse.SerializeToString, + ), + 'GetBlockFilesByRange': grpc.unary_unary_rpc_method_handler( + servicer.GetBlockFilesByRange, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeResponse.SerializeToString, + ), + 'GetRawBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetRawBlock, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockResponse.SerializeToString, + ), + 'GetRawBlocksByRange': grpc.unary_unary_rpc_method_handler( + servicer.GetRawBlocksByRange, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeResponse.SerializeToString, + ), + 'GetNativeBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetNativeBlock, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockResponse.SerializeToString, + ), + 'GetNativeBlocksByRange': grpc.unary_unary_rpc_method_handler( + servicer.GetNativeBlocksByRange, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeResponse.SerializeToString, + ), + 'GetRosettaBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetRosettaBlock, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockResponse.SerializeToString, + ), + 'GetRosettaBlocksByRange': grpc.unary_unary_rpc_method_handler( + servicer.GetRosettaBlocksByRange, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeResponse.SerializeToString, + ), + 'StreamChainEvents': grpc.unary_stream_rpc_method_handler( + servicer.StreamChainEvents, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.ChainEventsRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.ChainEventsResponse.SerializeToString, + ), + 'GetChainEvents': grpc.unary_unary_rpc_method_handler( + servicer.GetChainEvents, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsResponse.SerializeToString, + ), + 'GetChainMetadata': grpc.unary_unary_rpc_method_handler( + servicer.GetChainMetadata, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataResponse.SerializeToString, + ), + 'GetVersionedChainEvent': grpc.unary_unary_rpc_method_handler( + servicer.GetVersionedChainEvent, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventResponse.SerializeToString, + ), + 'GetBlockByTransaction': grpc.unary_unary_rpc_method_handler( + servicer.GetBlockByTransaction, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionResponse.SerializeToString, + ), + 'GetNativeTransaction': grpc.unary_unary_rpc_method_handler( + servicer.GetNativeTransaction, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionResponse.SerializeToString, + ), + 'GetVerifiedAccountState': grpc.unary_unary_rpc_method_handler( + servicer.GetVerifiedAccountState, + request_deserializer=coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateRequest.FromString, + response_serializer=coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'coinbase.chainstorage.ChainStorage', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('coinbase.chainstorage.ChainStorage', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class ChainStorage(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def GetLatestBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetLatestBlock', + coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetLatestBlockResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockFile(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetBlockFile', + coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetBlockFileResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockFilesByRange(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetBlockFilesByRange', + coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetBlockFilesByRangeResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetRawBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetRawBlock', + coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetRawBlockResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetRawBlocksByRange(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetRawBlocksByRange', + coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetRawBlocksByRangeResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetNativeBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetNativeBlock', + coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlockResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetNativeBlocksByRange(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetNativeBlocksByRange', + coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetNativeBlocksByRangeResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetRosettaBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetRosettaBlock', + coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlockResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetRosettaBlocksByRange(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetRosettaBlocksByRange', + coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetRosettaBlocksByRangeResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StreamChainEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/coinbase.chainstorage.ChainStorage/StreamChainEvents', + coinbase_dot_chainstorage_dot_api__pb2.ChainEventsRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.ChainEventsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetChainEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetChainEvents', + coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetChainEventsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetChainMetadata(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetChainMetadata', + coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetChainMetadataResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetVersionedChainEvent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetVersionedChainEvent', + coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetVersionedChainEventResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockByTransaction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetBlockByTransaction', + coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetBlockByTransactionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetNativeTransaction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetNativeTransaction', + coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetNativeTransactionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetVerifiedAccountState(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/coinbase.chainstorage.ChainStorage/GetVerifiedAccountState', + coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateRequest.SerializeToString, + coinbase_dot_chainstorage_dot_api__pb2.GetVerifiedAccountStateResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2.py new file mode 100644 index 00000000..a983affd --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_aptos.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_aptos.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,coinbase/chainstorage/blockchain_aptos.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\"\x1e\n\rAptosBlobdata\x12\r\n\x05\x62lock\x18\x01 \x01(\x0c\"\x7f\n\nAptosBlock\x12\x32\n\x06header\x18\x01 \x01(\x0b\x32\".coinbase.chainstorage.AptosHeader\x12=\n\x0ctransactions\x18\x02 \x03(\x0b\x32\'.coinbase.chainstorage.AptosTransaction\"g\n\x0b\x41ptosHeader\x12\x14\n\x0c\x62lock_height\x18\x01 \x01(\x04\x12\x12\n\nblock_hash\x18\x02 \x01(\t\x12.\n\nblock_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xd5\x05\n\x10\x41ptosTransaction\x12\x0f\n\x07version\x18\x01 \x01(\x04\x12\x14\n\x0c\x62lock_height\x18\x02 \x01(\x04\x12-\n\ttimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x39\n\x04info\x18\x04 \x01(\x0b\x32+.coinbase.chainstorage.AptosTransactionInfo\x12\x45\n\x04type\x18\x05 \x01(\x0e\x32\x37.coinbase.chainstorage.AptosTransaction.TransactionType\x12N\n\x0e\x62lock_metadata\x18\x64 \x01(\x0b\x32\x34.coinbase.chainstorage.AptosBlockMetadataTransactionH\x00\x12\x41\n\x07genesis\x18\x65 \x01(\x0b\x32..coinbase.chainstorage.AptosGenesisTransactionH\x00\x12R\n\x10state_checkpoint\x18\x66 \x01(\x0b\x32\x36.coinbase.chainstorage.AptosStateCheckpointTransactionH\x00\x12;\n\x04user\x18g \x01(\x0b\x32+.coinbase.chainstorage.AptosUserTransactionH\x00\x12\x45\n\tvalidator\x18h \x01(\x0b\x32\x30.coinbase.chainstorage.AptosValidatorTransactionH\x00\"r\n\x0fTransactionType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07GENESIS\x10\x01\x12\x12\n\x0e\x42LOCK_METADATA\x10\x02\x12\x14\n\x10STATE_CHECKPOINT\x10\x03\x12\x08\n\x04USER\x10\x04\x12\r\n\tVALIDATOR\x10\x05\x42\n\n\x08txn_data\"\xad\x02\n\x14\x41ptosTransactionInfo\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x19\n\x11state_change_hash\x18\x02 \x01(\t\x12\x17\n\x0f\x65vent_root_hash\x18\x03 \x01(\t\x12\x1f\n\x15state_checkpoint_hash\x18\x04 \x01(\tH\x00\x12\x10\n\x08gas_used\x18\x05 \x01(\x04\x12\x0f\n\x07success\x18\x06 \x01(\x08\x12\x11\n\tvm_status\x18\x07 \x01(\t\x12\x1d\n\x15\x61\x63\x63umulator_root_hash\x18\x08 \x01(\t\x12;\n\x07\x63hanges\x18\t \x03(\x0b\x32*.coinbase.chainstorage.AptosWriteSetChangeB \n\x1eoptional_state_checkpoint_hash\"\x95\x05\n\x13\x41ptosWriteSetChange\x12=\n\x04type\x18\x01 \x01(\x0e\x32/.coinbase.chainstorage.AptosWriteSetChange.Type\x12\x41\n\rdelete_module\x18\x64 \x01(\x0b\x32(.coinbase.chainstorage.AptosDeleteModuleH\x00\x12\x45\n\x0f\x64\x65lete_resource\x18\x65 \x01(\x0b\x32*.coinbase.chainstorage.AptosDeleteResourceH\x00\x12H\n\x11\x64\x65lete_table_item\x18\x66 \x01(\x0b\x32+.coinbase.chainstorage.AptosDeleteTableItemH\x00\x12?\n\x0cwrite_module\x18g \x01(\x0b\x32\'.coinbase.chainstorage.AptosWriteModuleH\x00\x12\x43\n\x0ewrite_resource\x18h \x01(\x0b\x32).coinbase.chainstorage.AptosWriteResourceH\x00\x12\x46\n\x10write_table_item\x18i \x01(\x0b\x32*.coinbase.chainstorage.AptosWriteTableItemH\x00\"\x92\x01\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x11\n\rDELETE_MODULE\x10\x01\x12\x13\n\x0f\x44\x45LETE_RESOURCE\x10\x02\x12\x15\n\x11\x44\x45LETE_TABLE_ITEM\x10\x03\x12\x10\n\x0cWRITE_MODULE\x10\x04\x12\x12\n\x0eWRITE_RESOURCE\x10\x05\x12\x14\n\x10WRITE_TABLE_ITEM\x10\x06\x42\x08\n\x06\x63hange\"v\n\x11\x41ptosDeleteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\t\x12\x38\n\x06module\x18\x03 \x01(\x0b\x32(.coinbase.chainstorage.AptosMoveModuleId\"P\n\x13\x41ptosDeleteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\t\x12\x10\n\x08resource\x18\x03 \x01(\t\"\x86\x01\n\x14\x41ptosDeleteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\t\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x39\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32+.coinbase.chainstorage.AptosDeleteTableData\"5\n\x14\x41ptosDeleteTableData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t\"y\n\x10\x41ptosWriteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\t\x12<\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32..coinbase.chainstorage.AptosMoveModuleBytecode\"]\n\x12\x41ptosWriteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\t\x12\x10\n\x08type_str\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t\"\x97\x01\n\x13\x41ptosWriteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\t\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\t\x12<\n\x04\x64\x61ta\x18\x05 \x01(\x0b\x32..coinbase.chainstorage.AptosWriteTableItemData\"[\n\x17\x41ptosWriteTableItemData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x12\n\nvalue_type\x18\x04 \x01(\t\"\xd4\x01\n\x1d\x41ptosBlockMetadataTransaction\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05\x65poch\x18\x02 \x01(\x04\x12\r\n\x05round\x18\x03 \x01(\x04\x12\x31\n\x06\x65vents\x18\x04 \x03(\x0b\x32!.coinbase.chainstorage.AptosEvent\x12#\n\x1bprevious_block_votes_bitvec\x18\x05 \x01(\x0c\x12\x10\n\x08proposer\x18\x06 \x01(\t\x12\x1f\n\x17\x66\x61iled_proposer_indices\x18\x07 \x03(\r\"t\n\nAptosEvent\x12\x31\n\x03key\x18\x01 \x01(\x0b\x32$.coinbase.chainstorage.AptosEventKey\x12\x17\n\x0fsequence_number\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t\"A\n\rAptosEventKey\x12\x17\n\x0f\x63reation_number\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x63\x63ount_address\x18\x02 \x01(\t\"!\n\x1f\x41ptosStateCheckpointTransaction\"\x83\x01\n\x17\x41ptosGenesisTransaction\x12\x35\n\x07payload\x18\x01 \x01(\x0b\x32$.coinbase.chainstorage.AptosWriteSet\x12\x31\n\x06\x65vents\x18\x02 \x03(\x0b\x32!.coinbase.chainstorage.AptosEvent\"\xb4\x02\n\rAptosWriteSet\x12\x41\n\x0ewrite_set_type\x18\x01 \x01(\x0e\x32).coinbase.chainstorage.AptosWriteSet.Type\x12\x46\n\x10script_write_set\x18\x64 \x01(\x0b\x32*.coinbase.chainstorage.AptosScriptWriteSetH\x00\x12\x46\n\x10\x64irect_write_set\x18\x65 \x01(\x0b\x32*.coinbase.chainstorage.AptosDirectWriteSetH\x00\"C\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x14\n\x10SCRIPT_WRITE_SET\x10\x01\x12\x14\n\x10\x44IRECT_WRITE_SET\x10\x02\x42\x0b\n\twrite_set\"d\n\x13\x41ptosScriptWriteSet\x12\x12\n\nexecute_as\x18\x01 \x01(\t\x12\x39\n\x06script\x18\x02 \x01(\x0b\x32).coinbase.chainstorage.AptosScriptPayload\"\x8e\x01\n\x13\x41ptosDirectWriteSet\x12\x44\n\x10write_set_change\x18\x01 \x03(\x0b\x32*.coinbase.chainstorage.AptosWriteSetChange\x12\x31\n\x06\x65vents\x18\x02 \x03(\x0b\x32!.coinbase.chainstorage.AptosEvent\"\x8e\x01\n\x14\x41ptosUserTransaction\x12\x43\n\x07request\x18\x01 \x01(\x0b\x32\x32.coinbase.chainstorage.AptosUserTransactionRequest\x12\x31\n\x06\x65vents\x18\x02 \x03(\x0b\x32!.coinbase.chainstorage.AptosEvent\"\xb0\x02\n\x1b\x41ptosUserTransactionRequest\x12\x0e\n\x06sender\x18\x01 \x01(\t\x12\x17\n\x0fsequence_number\x18\x02 \x01(\x04\x12\x16\n\x0emax_gas_amount\x18\x03 \x01(\x04\x12\x16\n\x0egas_unit_price\x18\x04 \x01(\x04\x12=\n\x19\x65xpiration_timestamp_secs\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12?\n\x07payload\x18\x06 \x01(\x0b\x32..coinbase.chainstorage.AptosTransactionPayload\x12\x38\n\tsignature\x18\x07 \x01(\x0b\x32%.coinbase.chainstorage.AptosSignature\"\xf7\x04\n\x17\x41ptosTransactionPayload\x12\x41\n\x04type\x18\x01 \x01(\x0e\x32\x33.coinbase.chainstorage.AptosTransactionPayload.Type\x12R\n\x16\x65ntry_function_payload\x18\x64 \x01(\x0b\x32\x30.coinbase.chainstorage.AptosEntryFunctionPayloadH\x00\x12\x43\n\x0escript_payload\x18\x65 \x01(\x0b\x32).coinbase.chainstorage.AptosScriptPayloadH\x00\x12P\n\x15module_bundle_payload\x18\x66 \x01(\x0b\x32/.coinbase.chainstorage.AptosModuleBundlePayloadH\x00\x12H\n\x11write_set_payload\x18g \x01(\x0b\x32+.coinbase.chainstorage.AptosWriteSetPayloadH\x00\x12G\n\x10multisig_payload\x18h \x01(\x0b\x32+.coinbase.chainstorage.AptosMultisigPayloadH\x00\"\x8f\x01\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x1a\n\x16\x45NTRY_FUNCTION_PAYLOAD\x10\x01\x12\x12\n\x0eSCRIPT_PAYLOAD\x10\x02\x12\x19\n\x15MODULE_BUNDLE_PAYLOAD\x10\x03\x12\x15\n\x11WRITE_SET_PAYLOAD\x10\x04\x12\x14\n\x10MULTISIG_PAYLOAD\x10\x05\x42\t\n\x07payload\"\x85\x01\n\x19\x41ptosEntryFunctionPayload\x12=\n\x08\x66unction\x18\x01 \x01(\x0b\x32+.coinbase.chainstorage.AptosEntryFunctionId\x12\x16\n\x0etype_arguments\x18\x02 \x03(\t\x12\x11\n\targuments\x18\x03 \x03(\x0c\"g\n\x14\x41ptosEntryFunctionId\x12\x38\n\x06module\x18\x01 \x01(\x0b\x32(.coinbase.chainstorage.AptosMoveModuleId\x12\x15\n\rfunction_name\x18\x02 \x01(\t\"2\n\x11\x41ptosMoveModuleId\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"}\n\x12\x41ptosScriptPayload\x12<\n\x04\x63ode\x18\x01 \x01(\x0b\x32..coinbase.chainstorage.AptosMoveScriptBytecode\x12\x16\n\x0etype_arguments\x18\x02 \x03(\t\x12\x11\n\targuments\x18\x03 \x03(\x0c\"b\n\x17\x41ptosMoveScriptBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\t\x12\x35\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32(.coinbase.chainstorage.AptosMoveFunction\"\xab\x02\n\x11\x41ptosMoveFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x41\n\nvisibility\x18\x02 \x01(\x0e\x32-.coinbase.chainstorage.AptosMoveFunction.Type\x12\x10\n\x08is_entry\x18\x03 \x01(\x08\x12U\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x38.coinbase.chainstorage.AptosMoveFunctionGenericTypeParam\x12\x0e\n\x06params\x18\x05 \x03(\t\x12\x0e\n\x06return\x18\x06 \x03(\t\"<\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07PRIVATE\x10\x01\x12\n\n\x06PUBLIC\x10\x02\x12\n\n\x06\x46RIEND\x10\x03\"8\n!AptosMoveFunctionGenericTypeParam\x12\x13\n\x0b\x63onstraints\x18\x01 \x03(\t\"[\n\x18\x41ptosModuleBundlePayload\x12?\n\x07modules\x18\x01 \x03(\x0b\x32..coinbase.chainstorage.AptosMoveModuleBytecode\"`\n\x17\x41ptosMoveModuleBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\t\x12\x33\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32&.coinbase.chainstorage.AptosMoveModule\"\xe9\x01\n\x0f\x41ptosMoveModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x39\n\x07\x66riends\x18\x03 \x03(\x0b\x32(.coinbase.chainstorage.AptosMoveModuleId\x12\x43\n\x11\x65xposed_functions\x18\x04 \x03(\x0b\x32(.coinbase.chainstorage.AptosMoveFunction\x12\x37\n\x07structs\x18\x05 \x03(\x0b\x32&.coinbase.chainstorage.AptosMoveStruct\"\xd7\x01\n\x0f\x41ptosMoveStruct\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tis_native\x18\x02 \x01(\x08\x12\x11\n\tabilities\x18\x03 \x03(\t\x12S\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x36.coinbase.chainstorage.AptosMoveStructGenericTypeParam\x12;\n\x06\x66ields\x18\x05 \x03(\x0b\x32+.coinbase.chainstorage.AptosMoveStructField\"6\n\x1f\x41ptosMoveStructGenericTypeParam\x12\x13\n\x0b\x63onstraints\x18\x01 \x03(\t\"2\n\x14\x41ptosMoveStructField\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\"O\n\x14\x41ptosWriteSetPayload\x12\x37\n\twrite_set\x18\x01 \x01(\x0b\x32$.coinbase.chainstorage.AptosWriteSet\"\xa7\x01\n\x14\x41ptosMultisigPayload\x12\x18\n\x10multisig_address\x18\x01 \x01(\t\x12U\n\x13transaction_payload\x18\x02 \x01(\x0b\x32\x36.coinbase.chainstorage.AptosMultisigTransactionPayloadH\x00\x42\x1e\n\x1coptional_transaction_payload\"\x80\x02\n\x1f\x41ptosMultisigTransactionPayload\x12I\n\x04type\x18\x01 \x01(\x0e\x32;.coinbase.chainstorage.AptosMultisigTransactionPayload.Type\x12R\n\x16\x65ntry_function_payload\x18\x64 \x01(\x0b\x32\x30.coinbase.chainstorage.AptosEntryFunctionPayloadH\x00\"3\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x1a\n\x16\x45NTRY_FUNCTION_PAYLOAD\x10\x01\x42\t\n\x07payload\"\xa8\x04\n\x0e\x41ptosSignature\x12\x38\n\x04type\x18\x01 \x01(\x0e\x32*.coinbase.chainstorage.AptosSignature.Type\x12?\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32,.coinbase.chainstorage.AptosEd25519SignatureH\x00\x12J\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32\x31.coinbase.chainstorage.AptosMultiEd25519SignatureH\x00\x12\x46\n\x0bmulti_agent\x18\x04 \x01(\x0b\x32/.coinbase.chainstorage.AptosMultiAgentSignatureH\x00\x12\x42\n\tfee_payer\x18\x05 \x01(\x0b\x32-.coinbase.chainstorage.AptosFeePayerSignatureH\x00\x12J\n\rsingle_sender\x18\x06 \x01(\x0b\x32\x31.coinbase.chainstorage.AptosSingleSenderSignatureH\x00\"j\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07\x45\x44\x32\x35\x35\x31\x39\x10\x01\x12\x11\n\rMULTI_ED25519\x10\x02\x12\x0f\n\x0bMULTI_AGENT\x10\x03\x12\r\n\tFEE_PAYER\x10\x04\x12\x11\n\rSINGLE_SENDER\x10\x05\x42\x0b\n\tsignature\">\n\x15\x41ptosEd25519Signature\x12\x12\n\npublic_key\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\t\"t\n\x1a\x41ptosMultiEd25519Signature\x12\x13\n\x0bpublic_keys\x18\x01 \x03(\t\x12\x12\n\nsignatures\x18\x02 \x03(\t\x12\x11\n\tthreshold\x18\x03 \x01(\r\x12\x1a\n\x12public_key_indices\x18\x04 \x01(\t\"\xc5\x01\n\x18\x41ptosMultiAgentSignature\x12<\n\x06sender\x18\x01 \x01(\x0b\x32,.coinbase.chainstorage.AptosAccountSignature\x12\"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12G\n\x11secondary_signers\x18\x03 \x03(\x0b\x32,.coinbase.chainstorage.AptosAccountSignature\"\xa6\x02\n\x16\x41ptosFeePayerSignature\x12<\n\x06sender\x18\x01 \x01(\x0b\x32,.coinbase.chainstorage.AptosAccountSignature\x12\"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12G\n\x11secondary_signers\x18\x03 \x03(\x0b\x32,.coinbase.chainstorage.AptosAccountSignature\x12\x46\n\x10\x66\x65\x65_payer_signer\x18\x04 \x01(\x0b\x32,.coinbase.chainstorage.AptosAccountSignature\x12\x19\n\x11\x66\x65\x65_payer_address\x18\x05 \x01(\t\"C\n\x1a\x41ptosSingleSenderSignature\x12\x12\n\npublic_key\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\t\"@\n\x17\x41ptosSingleKeySignature\x12\x12\n\npublic_key\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\t\"^\n\x16\x41ptosMultiKeySignature\x12\x13\n\x0bpublic_keys\x18\x01 \x03(\t\x12\x12\n\nsignatures\x18\x02 \x03(\t\x12\x1b\n\x13signatures_required\x18\x03 \x01(\r\"\xda\x03\n\x15\x41ptosAccountSignature\x12?\n\x04type\x18\x01 \x01(\x0e\x32\x31.coinbase.chainstorage.AptosAccountSignature.Type\x12?\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32,.coinbase.chainstorage.AptosEd25519SignatureH\x00\x12J\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32\x31.coinbase.chainstorage.AptosMultiEd25519SignatureH\x00\x12\x44\n\nsingle_key\x18\x05 \x01(\x0b\x32..coinbase.chainstorage.AptosSingleKeySignatureH\x00\x12\x42\n\tmulti_key\x18\x06 \x01(\x0b\x32-.coinbase.chainstorage.AptosMultiKeySignatureH\x00\"\\\n\x04Type\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07\x45\x44\x32\x35\x35\x31\x39\x10\x01\x12\x11\n\rMULTI_ED25519\x10\x02\x12\x0e\n\nSINGLE_KEY\x10\x04\x12\r\n\tMULTI_KEY\x10\x05\"\x04\x08\x03\x10\x03\x42\x0b\n\tsignature\"N\n\x19\x41ptosValidatorTransaction\x12\x31\n\x06\x65vents\x18\x01 \x03(\x0b\x32!.coinbase.chainstorage.AptosEventB?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_aptos_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_APTOSBLOBDATA']._serialized_start=104 + _globals['_APTOSBLOBDATA']._serialized_end=134 + _globals['_APTOSBLOCK']._serialized_start=136 + _globals['_APTOSBLOCK']._serialized_end=263 + _globals['_APTOSHEADER']._serialized_start=265 + _globals['_APTOSHEADER']._serialized_end=368 + _globals['_APTOSTRANSACTION']._serialized_start=371 + _globals['_APTOSTRANSACTION']._serialized_end=1096 + _globals['_APTOSTRANSACTION_TRANSACTIONTYPE']._serialized_start=970 + _globals['_APTOSTRANSACTION_TRANSACTIONTYPE']._serialized_end=1084 + _globals['_APTOSTRANSACTIONINFO']._serialized_start=1099 + _globals['_APTOSTRANSACTIONINFO']._serialized_end=1400 + _globals['_APTOSWRITESETCHANGE']._serialized_start=1403 + _globals['_APTOSWRITESETCHANGE']._serialized_end=2064 + _globals['_APTOSWRITESETCHANGE_TYPE']._serialized_start=1908 + _globals['_APTOSWRITESETCHANGE_TYPE']._serialized_end=2054 + _globals['_APTOSDELETEMODULE']._serialized_start=2066 + _globals['_APTOSDELETEMODULE']._serialized_end=2184 + _globals['_APTOSDELETERESOURCE']._serialized_start=2186 + _globals['_APTOSDELETERESOURCE']._serialized_end=2266 + _globals['_APTOSDELETETABLEITEM']._serialized_start=2269 + _globals['_APTOSDELETETABLEITEM']._serialized_end=2403 + _globals['_APTOSDELETETABLEDATA']._serialized_start=2405 + _globals['_APTOSDELETETABLEDATA']._serialized_end=2458 + _globals['_APTOSWRITEMODULE']._serialized_start=2460 + _globals['_APTOSWRITEMODULE']._serialized_end=2581 + _globals['_APTOSWRITERESOURCE']._serialized_start=2583 + _globals['_APTOSWRITERESOURCE']._serialized_end=2676 + _globals['_APTOSWRITETABLEITEM']._serialized_start=2679 + _globals['_APTOSWRITETABLEITEM']._serialized_end=2830 + _globals['_APTOSWRITETABLEITEMDATA']._serialized_start=2832 + _globals['_APTOSWRITETABLEITEMDATA']._serialized_end=2923 + _globals['_APTOSBLOCKMETADATATRANSACTION']._serialized_start=2926 + _globals['_APTOSBLOCKMETADATATRANSACTION']._serialized_end=3138 + _globals['_APTOSEVENT']._serialized_start=3140 + _globals['_APTOSEVENT']._serialized_end=3256 + _globals['_APTOSEVENTKEY']._serialized_start=3258 + _globals['_APTOSEVENTKEY']._serialized_end=3323 + _globals['_APTOSSTATECHECKPOINTTRANSACTION']._serialized_start=3325 + _globals['_APTOSSTATECHECKPOINTTRANSACTION']._serialized_end=3358 + _globals['_APTOSGENESISTRANSACTION']._serialized_start=3361 + _globals['_APTOSGENESISTRANSACTION']._serialized_end=3492 + _globals['_APTOSWRITESET']._serialized_start=3495 + _globals['_APTOSWRITESET']._serialized_end=3803 + _globals['_APTOSWRITESET_TYPE']._serialized_start=3723 + _globals['_APTOSWRITESET_TYPE']._serialized_end=3790 + _globals['_APTOSSCRIPTWRITESET']._serialized_start=3805 + _globals['_APTOSSCRIPTWRITESET']._serialized_end=3905 + _globals['_APTOSDIRECTWRITESET']._serialized_start=3908 + _globals['_APTOSDIRECTWRITESET']._serialized_end=4050 + _globals['_APTOSUSERTRANSACTION']._serialized_start=4053 + _globals['_APTOSUSERTRANSACTION']._serialized_end=4195 + _globals['_APTOSUSERTRANSACTIONREQUEST']._serialized_start=4198 + _globals['_APTOSUSERTRANSACTIONREQUEST']._serialized_end=4502 + _globals['_APTOSTRANSACTIONPAYLOAD']._serialized_start=4505 + _globals['_APTOSTRANSACTIONPAYLOAD']._serialized_end=5136 + _globals['_APTOSTRANSACTIONPAYLOAD_TYPE']._serialized_start=4982 + _globals['_APTOSTRANSACTIONPAYLOAD_TYPE']._serialized_end=5125 + _globals['_APTOSENTRYFUNCTIONPAYLOAD']._serialized_start=5139 + _globals['_APTOSENTRYFUNCTIONPAYLOAD']._serialized_end=5272 + _globals['_APTOSENTRYFUNCTIONID']._serialized_start=5274 + _globals['_APTOSENTRYFUNCTIONID']._serialized_end=5377 + _globals['_APTOSMOVEMODULEID']._serialized_start=5379 + _globals['_APTOSMOVEMODULEID']._serialized_end=5429 + _globals['_APTOSSCRIPTPAYLOAD']._serialized_start=5431 + _globals['_APTOSSCRIPTPAYLOAD']._serialized_end=5556 + _globals['_APTOSMOVESCRIPTBYTECODE']._serialized_start=5558 + _globals['_APTOSMOVESCRIPTBYTECODE']._serialized_end=5656 + _globals['_APTOSMOVEFUNCTION']._serialized_start=5659 + _globals['_APTOSMOVEFUNCTION']._serialized_end=5958 + _globals['_APTOSMOVEFUNCTION_TYPE']._serialized_start=5898 + _globals['_APTOSMOVEFUNCTION_TYPE']._serialized_end=5958 + _globals['_APTOSMOVEFUNCTIONGENERICTYPEPARAM']._serialized_start=5960 + _globals['_APTOSMOVEFUNCTIONGENERICTYPEPARAM']._serialized_end=6016 + _globals['_APTOSMODULEBUNDLEPAYLOAD']._serialized_start=6018 + _globals['_APTOSMODULEBUNDLEPAYLOAD']._serialized_end=6109 + _globals['_APTOSMOVEMODULEBYTECODE']._serialized_start=6111 + _globals['_APTOSMOVEMODULEBYTECODE']._serialized_end=6207 + _globals['_APTOSMOVEMODULE']._serialized_start=6210 + _globals['_APTOSMOVEMODULE']._serialized_end=6443 + _globals['_APTOSMOVESTRUCT']._serialized_start=6446 + _globals['_APTOSMOVESTRUCT']._serialized_end=6661 + _globals['_APTOSMOVESTRUCTGENERICTYPEPARAM']._serialized_start=6663 + _globals['_APTOSMOVESTRUCTGENERICTYPEPARAM']._serialized_end=6717 + _globals['_APTOSMOVESTRUCTFIELD']._serialized_start=6719 + _globals['_APTOSMOVESTRUCTFIELD']._serialized_end=6769 + _globals['_APTOSWRITESETPAYLOAD']._serialized_start=6771 + _globals['_APTOSWRITESETPAYLOAD']._serialized_end=6850 + _globals['_APTOSMULTISIGPAYLOAD']._serialized_start=6853 + _globals['_APTOSMULTISIGPAYLOAD']._serialized_end=7020 + _globals['_APTOSMULTISIGTRANSACTIONPAYLOAD']._serialized_start=7023 + _globals['_APTOSMULTISIGTRANSACTIONPAYLOAD']._serialized_end=7279 + _globals['_APTOSMULTISIGTRANSACTIONPAYLOAD_TYPE']._serialized_start=4982 + _globals['_APTOSMULTISIGTRANSACTIONPAYLOAD_TYPE']._serialized_end=5033 + _globals['_APTOSSIGNATURE']._serialized_start=7282 + _globals['_APTOSSIGNATURE']._serialized_end=7834 + _globals['_APTOSSIGNATURE_TYPE']._serialized_start=7715 + _globals['_APTOSSIGNATURE_TYPE']._serialized_end=7821 + _globals['_APTOSED25519SIGNATURE']._serialized_start=7836 + _globals['_APTOSED25519SIGNATURE']._serialized_end=7898 + _globals['_APTOSMULTIED25519SIGNATURE']._serialized_start=7900 + _globals['_APTOSMULTIED25519SIGNATURE']._serialized_end=8016 + _globals['_APTOSMULTIAGENTSIGNATURE']._serialized_start=8019 + _globals['_APTOSMULTIAGENTSIGNATURE']._serialized_end=8216 + _globals['_APTOSFEEPAYERSIGNATURE']._serialized_start=8219 + _globals['_APTOSFEEPAYERSIGNATURE']._serialized_end=8513 + _globals['_APTOSSINGLESENDERSIGNATURE']._serialized_start=8515 + _globals['_APTOSSINGLESENDERSIGNATURE']._serialized_end=8582 + _globals['_APTOSSINGLEKEYSIGNATURE']._serialized_start=8584 + _globals['_APTOSSINGLEKEYSIGNATURE']._serialized_end=8648 + _globals['_APTOSMULTIKEYSIGNATURE']._serialized_start=8650 + _globals['_APTOSMULTIKEYSIGNATURE']._serialized_end=8744 + _globals['_APTOSACCOUNTSIGNATURE']._serialized_start=8747 + _globals['_APTOSACCOUNTSIGNATURE']._serialized_end=9221 + _globals['_APTOSACCOUNTSIGNATURE_TYPE']._serialized_start=9116 + _globals['_APTOSACCOUNTSIGNATURE_TYPE']._serialized_end=9208 + _globals['_APTOSVALIDATORTRANSACTION']._serialized_start=9223 + _globals['_APTOSVALIDATORTRANSACTION']._serialized_end=9301 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2_grpc.py new file mode 100644 index 00000000..5e3fb7e1 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_aptos_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_aptos_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2.py new file mode 100644 index 00000000..a1dd4f24 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_bitcoin.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_bitcoin.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.coinbase/chainstorage/blockchain_bitcoin.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\"c\n\x0f\x42itcoinBlobdata\x12\x0e\n\x06header\x18\x01 \x01(\x0c\x12@\n\x12input_transactions\x18\x02 \x03(\x0b\x32$.coinbase.chainstorage.RepeatedBytes\"\x1d\n\rRepeatedBytes\x12\x0c\n\x04\x64\x61ta\x18\x01 \x03(\x0c\"\x8a\x03\n\rBitcoinHeader\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x15\n\rstripped_size\x18\x03 \x01(\x04\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x0e\n\x06weight\x18\x05 \x01(\x04\x12\x0e\n\x06height\x18\x06 \x01(\x04\x12\x0f\n\x07version\x18\x07 \x01(\x04\x12\x13\n\x0bversion_hex\x18\x08 \x01(\t\x12\x13\n\x0bmerkle_root\x18\t \x01(\t\x12\x0c\n\x04time\x18\n \x01(\x04\x12\x13\n\x0bmedian_time\x18\x0b \x01(\x04\x12\r\n\x05nonce\x18\x0c \x01(\x04\x12\x0c\n\x04\x62its\x18\r \x01(\t\x12\x12\n\ndifficulty\x18\x0e \x01(\t\x12\x12\n\nchain_work\x18\x0f \x01(\t\x12\x1e\n\x16number_of_transactions\x18\x10 \x01(\x04\x12\x1b\n\x13previous_block_hash\x18\x11 \x01(\t\x12\x17\n\x0fnext_block_hash\x18\x12 \x01(\t\x12-\n\ttimestamp\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xde\x03\n\x12\x42itcoinTransaction\x12\x0b\n\x03hex\x18\x02 \x01(\t\x12\x16\n\x0etransaction_id\x18\x03 \x01(\t\x12\x0c\n\x04hash\x18\x04 \x01(\t\x12\x0c\n\x04size\x18\x05 \x01(\x04\x12\x14\n\x0cvirtual_size\x18\x06 \x01(\x04\x12\x0e\n\x06weight\x18\x07 \x01(\x04\x12\x0f\n\x07version\x18\x08 \x01(\x04\x12\x11\n\tlock_time\x18\t \x01(\x04\x12>\n\x06inputs\x18\n \x03(\x0b\x32..coinbase.chainstorage.BitcoinTransactionInput\x12@\n\x07outputs\x18\x0b \x03(\x0b\x32/.coinbase.chainstorage.BitcoinTransactionOutput\x12\x12\n\nblock_hash\x18\x0c \x01(\t\x12\x12\n\nblock_time\x18\x0e \x01(\x04\x12\x0c\n\x04time\x18\x0f \x01(\x04\x12\x13\n\x0bis_coinbase\x18\x10 \x01(\x08\x12\r\n\x05index\x18\x11 \x01(\x04\x12\x13\n\x0binput_count\x18\x12 \x01(\x04\x12\x14\n\x0coutput_count\x18\x13 \x01(\x04\x12\x13\n\x0binput_value\x18\x14 \x01(\x04\x12\x14\n\x0coutput_value\x18\x15 \x01(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x16 \x01(\x04\"\xb3\x02\n\x17\x42itcoinTransactionInput\x12\x10\n\x08\x63oinbase\x18\x01 \x01(\t\x12\x16\n\x0etransaction_id\x18\x02 \x01(\t\x12\x19\n\x11\x66rom_output_index\x18\x03 \x01(\x04\x12G\n\x10script_signature\x18\x04 \x01(\x0b\x32-.coinbase.chainstorage.BitcoinScriptSignature\x12\x10\n\x08sequence\x18\x05 \x01(\x04\x12#\n\x1btransaction_input_witnesses\x18\x06 \x03(\t\x12\x44\n\x0b\x66rom_output\x18\x07 \x01(\x0b\x32/.coinbase.chainstorage.BitcoinTransactionOutput\x12\r\n\x05index\x18\x08 \x01(\x04\"7\n\x16\x42itcoinScriptSignature\x12\x10\n\x08\x61ssembly\x18\x01 \x01(\t\x12\x0b\n\x03hex\x18\x02 \x01(\t\"\x82\x01\n\x18\x42itcoinTransactionOutput\x12\r\n\x05index\x18\x02 \x01(\x04\x12H\n\x11script_public_key\x18\x03 \x01(\x0b\x32-.coinbase.chainstorage.BitcoinScriptPublicKey\x12\r\n\x05value\x18\x04 \x01(\x04\"V\n\x16\x42itcoinScriptPublicKey\x12\x10\n\x08\x61ssembly\x18\x01 \x01(\t\x12\x0b\n\x03hex\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x06 \x01(\t\"\x85\x01\n\x0c\x42itcoinBlock\x12\x34\n\x06header\x18\x01 \x01(\x0b\x32$.coinbase.chainstorage.BitcoinHeader\x12?\n\x0ctransactions\x18\x02 \x03(\x0b\x32).coinbase.chainstorage.BitcoinTransactionB?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_bitcoin_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_BITCOINBLOBDATA']._serialized_start=106 + _globals['_BITCOINBLOBDATA']._serialized_end=205 + _globals['_REPEATEDBYTES']._serialized_start=207 + _globals['_REPEATEDBYTES']._serialized_end=236 + _globals['_BITCOINHEADER']._serialized_start=239 + _globals['_BITCOINHEADER']._serialized_end=633 + _globals['_BITCOINTRANSACTION']._serialized_start=636 + _globals['_BITCOINTRANSACTION']._serialized_end=1114 + _globals['_BITCOINTRANSACTIONINPUT']._serialized_start=1117 + _globals['_BITCOINTRANSACTIONINPUT']._serialized_end=1424 + _globals['_BITCOINSCRIPTSIGNATURE']._serialized_start=1426 + _globals['_BITCOINSCRIPTSIGNATURE']._serialized_end=1481 + _globals['_BITCOINTRANSACTIONOUTPUT']._serialized_start=1484 + _globals['_BITCOINTRANSACTIONOUTPUT']._serialized_end=1614 + _globals['_BITCOINSCRIPTPUBLICKEY']._serialized_start=1616 + _globals['_BITCOINSCRIPTPUBLICKEY']._serialized_end=1702 + _globals['_BITCOINBLOCK']._serialized_start=1705 + _globals['_BITCOINBLOCK']._serialized_end=1838 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2_grpc.py new file mode 100644 index 00000000..bb2d32c4 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_bitcoin_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_bitcoin_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2.py new file mode 100644 index 00000000..1db64782 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_ethereum_beacon.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_ethereum_beacon.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from coinbase.chainstorage import blockchain_ethereum_pb2 as coinbase_dot_chainstorage_dot_blockchain__ethereum__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n6coinbase/chainstorage/blockchain_ethereum_beacon.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\x1a/coinbase/chainstorage/blockchain_ethereum.proto\"L\n\x16\x45thereumBeaconBlobdata\x12\x0e\n\x06header\x18\x01 \x01(\x0c\x12\r\n\x05\x62lock\x18\x02 \x01(\x0c\x12\r\n\x05\x62lobs\x18\x04 \x01(\x0cJ\x04\x08\x03\x10\x04\"\xd0\x01\n\x13\x45thereumBeaconBlock\x12@\n\x06header\x18\x01 \x01(\x0b\x32\x30.coinbase.chainstorage.EthereumBeaconBlockHeader\x12=\n\x05\x62lock\x18\x02 \x01(\x0b\x32..coinbase.chainstorage.EthereumBeaconBlockData\x12\x38\n\x05\x62lobs\x18\x03 \x03(\x0b\x32).coinbase.chainstorage.EthereumBeaconBlob\"\xad\x01\n\x19\x45thereumBeaconBlockHeader\x12\x0c\n\x04slot\x18\x01 \x01(\x04\x12\x16\n\x0eproposer_index\x18\x02 \x01(\x04\x12\x13\n\x0bparent_root\x18\x03 \x01(\t\x12\x12\n\nstate_root\x18\x04 \x01(\t\x12\x11\n\tbody_root\x18\x05 \x01(\t\x12\x11\n\tsignature\x18\x06 \x01(\t\x12\x0c\n\x04root\x18\x07 \x01(\t\x12\r\n\x05\x65poch\x18\x08 \x01(\x04\"\xc0\x04\n\x17\x45thereumBeaconBlockData\x12=\n\x07version\x18\x01 \x01(\x0e\x32,.coinbase.chainstorage.EthereumBeaconVersion\x12\x0c\n\x04slot\x18\x02 \x01(\x04\x12\x16\n\x0eproposer_index\x18\x03 \x01(\x04\x12\x13\n\x0bparent_root\x18\x04 \x01(\t\x12\x12\n\nstate_root\x18\x05 \x01(\t\x12\x11\n\tsignature\x18\x06 \x01(\t\x12H\n\x0cphase0_block\x18\x64 \x01(\x0b\x32\x30.coinbase.chainstorage.EthereumBeaconBlockPhase0H\x00\x12H\n\x0c\x61ltair_block\x18\x65 \x01(\x0b\x32\x30.coinbase.chainstorage.EthereumBeaconBlockAltairH\x00\x12N\n\x0f\x62\x65llatrix_block\x18\x66 \x01(\x0b\x32\x33.coinbase.chainstorage.EthereumBeaconBlockBellatrixH\x00\x12J\n\rcapella_block\x18g \x01(\x0b\x32\x31.coinbase.chainstorage.EthereumBeaconBlockCapellaH\x00\x12\x46\n\x0b\x64\x65neb_block\x18h \x01(\x0b\x32/.coinbase.chainstorage.EthereumBeaconBlockDenebH\x00\x42\x0c\n\nblock_data\"t\n\x19\x45thereumBeaconBlockPhase0\x12\x15\n\rrandao_reveal\x18\x01 \x01(\t\x12@\n\teth1_data\x18\x02 \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconEth1Data\"t\n\x19\x45thereumBeaconBlockAltair\x12\x15\n\rrandao_reveal\x18\x01 \x01(\t\x12@\n\teth1_data\x18\x02 \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconEth1Data\"\xd2\x01\n\x1c\x45thereumBeaconBlockBellatrix\x12\x15\n\rrandao_reveal\x18\x01 \x01(\t\x12@\n\teth1_data\x18\x02 \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconEth1Data\x12Y\n\x11\x65xecution_payload\x18\x03 \x01(\x0b\x32>.coinbase.chainstorage.EthereumBeaconExecutionPayloadBellatrix\"\xce\x01\n\x1a\x45thereumBeaconBlockCapella\x12\x15\n\rrandao_reveal\x18\x01 \x01(\t\x12@\n\teth1_data\x18\x02 \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconEth1Data\x12W\n\x11\x65xecution_payload\x18\x03 \x01(\x0b\x32<.coinbase.chainstorage.EthereumBeaconExecutionPayloadCapella\"\xe8\x01\n\x18\x45thereumBeaconBlockDeneb\x12\x15\n\rrandao_reveal\x18\x01 \x01(\t\x12@\n\teth1_data\x18\x02 \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconEth1Data\x12U\n\x11\x65xecution_payload\x18\x03 \x01(\x0b\x32:.coinbase.chainstorage.EthereumBeaconExecutionPayloadDeneb\x12\x1c\n\x14\x62lob_kzg_commitments\x18\x04 \x03(\t\"Y\n\x16\x45thereumBeaconEth1Data\x12\x14\n\x0c\x64\x65posit_root\x18\x01 \x01(\t\x12\x15\n\rdeposit_count\x18\x02 \x01(\x04\x12\x12\n\nblock_hash\x18\x03 \x01(\t\"\xeb\x02\n\'EthereumBeaconExecutionPayloadBellatrix\x12\x13\n\x0bparent_hash\x18\x01 \x01(\t\x12\x15\n\rfee_recipient\x18\x02 \x01(\t\x12\x12\n\nstate_root\x18\x03 \x01(\t\x12\x15\n\rreceipts_root\x18\x04 \x01(\t\x12\x12\n\nlogs_bloom\x18\x05 \x01(\t\x12\x13\n\x0bprev_randao\x18\x06 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x07 \x01(\x04\x12\x11\n\tgas_limit\x18\x08 \x01(\x04\x12\x10\n\x08gas_used\x18\t \x01(\x04\x12-\n\ttimestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nextra_data\x18\x0b \x01(\t\x12\x18\n\x10\x62\x61se_fee_per_gas\x18\x0c \x01(\t\x12\x12\n\nblock_hash\x18\r \x01(\t\x12\x14\n\x0ctransactions\x18\x0e \x03(\x0c\"\xa9\x03\n%EthereumBeaconExecutionPayloadCapella\x12\x13\n\x0bparent_hash\x18\x01 \x01(\t\x12\x15\n\rfee_recipient\x18\x02 \x01(\t\x12\x12\n\nstate_root\x18\x03 \x01(\t\x12\x15\n\rreceipts_root\x18\x04 \x01(\t\x12\x12\n\nlogs_bloom\x18\x05 \x01(\t\x12\x13\n\x0bprev_randao\x18\x06 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x07 \x01(\x04\x12\x11\n\tgas_limit\x18\x08 \x01(\x04\x12\x10\n\x08gas_used\x18\t \x01(\x04\x12-\n\ttimestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nextra_data\x18\x0b \x01(\t\x12\x18\n\x10\x62\x61se_fee_per_gas\x18\x0c \x01(\t\x12\x12\n\nblock_hash\x18\r \x01(\t\x12\x14\n\x0ctransactions\x18\x0e \x03(\x0c\x12>\n\x0bwithdrawals\x18\x0f \x03(\x0b\x32).coinbase.chainstorage.EthereumWithdrawal\"\xd7\x03\n#EthereumBeaconExecutionPayloadDeneb\x12\x13\n\x0bparent_hash\x18\x01 \x01(\t\x12\x15\n\rfee_recipient\x18\x02 \x01(\t\x12\x12\n\nstate_root\x18\x03 \x01(\t\x12\x15\n\rreceipts_root\x18\x04 \x01(\t\x12\x12\n\nlogs_bloom\x18\x05 \x01(\t\x12\x13\n\x0bprev_randao\x18\x06 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x07 \x01(\x04\x12\x11\n\tgas_limit\x18\x08 \x01(\x04\x12\x10\n\x08gas_used\x18\t \x01(\x04\x12-\n\ttimestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nextra_data\x18\x0b \x01(\t\x12\x18\n\x10\x62\x61se_fee_per_gas\x18\x0c \x01(\t\x12\x12\n\nblock_hash\x18\r \x01(\t\x12\x14\n\x0ctransactions\x18\x0e \x03(\x0c\x12>\n\x0bwithdrawals\x18\x0f \x03(\x0b\x32).coinbase.chainstorage.EthereumWithdrawal\x12\x15\n\rblob_gas_used\x18\x10 \x01(\x04\x12\x17\n\x0f\x65xcess_blob_gas\x18\x11 \x01(\x04\"\xa7\x01\n\x12\x45thereumBeaconBlob\x12\x0c\n\x04slot\x18\x01 \x01(\x04\x12\x13\n\x0bparent_root\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0c\n\x04\x62lob\x18\x04 \x01(\x0c\x12\x16\n\x0ekzg_commitment\x18\x05 \x01(\t\x12\x11\n\tkzg_proof\x18\x06 \x01(\t\x12&\n\x1ekzg_commitment_inclusion_proof\x18\x07 \x03(\t*c\n\x15\x45thereumBeaconVersion\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06PHASE0\x10\x01\x12\n\n\x06\x41LTAIR\x10\x02\x12\r\n\tBELLATRIX\x10\x03\x12\x0b\n\x07\x43\x41PELLA\x10\x04\x12\t\n\x05\x44\x45NEB\x10\x05\x42?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_ethereum_beacon_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_ETHEREUMBEACONVERSION']._serialized_start=3629 + _globals['_ETHEREUMBEACONVERSION']._serialized_end=3728 + _globals['_ETHEREUMBEACONBLOBDATA']._serialized_start=163 + _globals['_ETHEREUMBEACONBLOBDATA']._serialized_end=239 + _globals['_ETHEREUMBEACONBLOCK']._serialized_start=242 + _globals['_ETHEREUMBEACONBLOCK']._serialized_end=450 + _globals['_ETHEREUMBEACONBLOCKHEADER']._serialized_start=453 + _globals['_ETHEREUMBEACONBLOCKHEADER']._serialized_end=626 + _globals['_ETHEREUMBEACONBLOCKDATA']._serialized_start=629 + _globals['_ETHEREUMBEACONBLOCKDATA']._serialized_end=1205 + _globals['_ETHEREUMBEACONBLOCKPHASE0']._serialized_start=1207 + _globals['_ETHEREUMBEACONBLOCKPHASE0']._serialized_end=1323 + _globals['_ETHEREUMBEACONBLOCKALTAIR']._serialized_start=1325 + _globals['_ETHEREUMBEACONBLOCKALTAIR']._serialized_end=1441 + _globals['_ETHEREUMBEACONBLOCKBELLATRIX']._serialized_start=1444 + _globals['_ETHEREUMBEACONBLOCKBELLATRIX']._serialized_end=1654 + _globals['_ETHEREUMBEACONBLOCKCAPELLA']._serialized_start=1657 + _globals['_ETHEREUMBEACONBLOCKCAPELLA']._serialized_end=1863 + _globals['_ETHEREUMBEACONBLOCKDENEB']._serialized_start=1866 + _globals['_ETHEREUMBEACONBLOCKDENEB']._serialized_end=2098 + _globals['_ETHEREUMBEACONETH1DATA']._serialized_start=2100 + _globals['_ETHEREUMBEACONETH1DATA']._serialized_end=2189 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADBELLATRIX']._serialized_start=2192 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADBELLATRIX']._serialized_end=2555 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADCAPELLA']._serialized_start=2558 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADCAPELLA']._serialized_end=2983 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADDENEB']._serialized_start=2986 + _globals['_ETHEREUMBEACONEXECUTIONPAYLOADDENEB']._serialized_end=3457 + _globals['_ETHEREUMBEACONBLOB']._serialized_start=3460 + _globals['_ETHEREUMBEACONBLOB']._serialized_end=3627 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2_grpc.py new file mode 100644 index 00000000..3a938960 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_beacon_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_ethereum_beacon_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2.py new file mode 100644 index 00000000..10eebcc0 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_ethereum.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_ethereum.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/coinbase/chainstorage/blockchain_ethereum.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb6\x01\n\x10\x45thereumBlobdata\x12\x0e\n\x06header\x18\x01 \x01(\x0c\x12\x1c\n\x14transaction_receipts\x18\x02 \x03(\x0c\x12\x1a\n\x12transaction_traces\x18\x03 \x03(\x0c\x12\x0e\n\x06uncles\x18\x04 \x03(\x0c\x12:\n\x07polygon\x18\x64 \x01(\x0b\x32\'.coinbase.chainstorage.PolygonExtraDataH\x00\x42\x0c\n\nextra_data\"\"\n\x10PolygonExtraData\x12\x0e\n\x06\x61uthor\x18\x01 \x01(\x0c\"\xbf\x01\n\rEthereumBlock\x12\x35\n\x06header\x18\x01 \x01(\x0b\x32%.coinbase.chainstorage.EthereumHeader\x12@\n\x0ctransactions\x18\x02 \x03(\x0b\x32*.coinbase.chainstorage.EthereumTransaction\x12\x35\n\x06uncles\x18\x03 \x03(\x0b\x32%.coinbase.chainstorage.EthereumHeader\"]\n\x12\x45thereumWithdrawal\x12\r\n\x05index\x18\x01 \x01(\x04\x12\x17\n\x0fvalidator_index\x18\x02 \x01(\x04\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\x12\x0e\n\x06\x61mount\x18\x04 \x01(\x04\"\x92\x06\n\x0e\x45thereumHeader\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x13\n\x0bparent_hash\x18\x02 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x04\x12-\n\ttimestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0ctransactions\x18\x05 \x03(\t\x12\r\n\x05nonce\x18\x06 \x01(\t\x12\x13\n\x0bsha3_uncles\x18\x07 \x01(\t\x12\x12\n\nlogs_bloom\x18\x08 \x01(\t\x12\x19\n\x11transactions_root\x18\t \x01(\t\x12\x12\n\nstate_root\x18\n \x01(\t\x12\x15\n\rreceipts_root\x18\x0b \x01(\t\x12\r\n\x05miner\x18\x0c \x01(\t\x12\x12\n\ndifficulty\x18\r \x01(\x04\x12\x18\n\x10total_difficulty\x18\x0e \x01(\t\x12\x12\n\nextra_data\x18\x0f \x01(\t\x12\x0c\n\x04size\x18\x10 \x01(\x04\x12\x11\n\tgas_limit\x18\x11 \x01(\x04\x12\x10\n\x08gas_used\x18\x12 \x01(\x04\x12\x0e\n\x06uncles\x18\x13 \x03(\t\x12\x1a\n\x10\x62\x61se_fee_per_gas\x18\x14 \x01(\x04H\x00\x12\x10\n\x08mix_hash\x18\x15 \x01(\t\x12>\n\x0bwithdrawals\x18\x16 \x03(\x0b\x32).coinbase.chainstorage.EthereumWithdrawal\x12\x18\n\x10withdrawals_root\x18\x17 \x01(\t\x12\x10\n\x06\x61uthor\x18\x18 \x01(\tH\x01\x12\x17\n\rblob_gas_used\x18\x19 \x01(\x04H\x02\x12\x19\n\x0f\x65xcess_blob_gas\x18\x1a \x01(\x04H\x03\x12 \n\x18parent_beacon_block_root\x18\x1b \x01(\t\x12\x18\n\x10\x62lock_extra_data\x18\x1c \x01(\tB\x1b\n\x19optional_base_fee_per_gasB\x19\n\x17optional_polygon_authorB\x18\n\x16optional_blob_gas_usedB\x1a\n\x18optional_excess_blob_gas\"B\n\x19\x45thereumTransactionAccess\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x14\n\x0cstorage_keys\x18\x02 \x03(\t\"f\n\x1d\x45thereumTransactionAccessList\x12\x45\n\x0b\x61\x63\x63\x65ss_list\x18\x01 \x03(\x0b\x32\x30.coinbase.chainstorage.EthereumTransactionAccess\"\x99\x08\n\x13\x45thereumTransaction\x12\x12\n\nblock_hash\x18\x01 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x02 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x03 \x01(\t\x12\x0b\n\x03gas\x18\x04 \x01(\x04\x12\x11\n\tgas_price\x18\x05 \x01(\x04\x12\x0c\n\x04hash\x18\x06 \x01(\t\x12\r\n\x05input\x18\x07 \x01(\t\x12\r\n\x05nonce\x18\x08 \x01(\x04\x12\n\n\x02to\x18\t \x01(\t\x12\r\n\x05index\x18\n \x01(\x04\x12\r\n\x05value\x18\x0b \x01(\t\x12\x42\n\x07receipt\x18\x0c \x01(\x0b\x32\x31.coinbase.chainstorage.EthereumTransactionReceipt\x12\x45\n\x0ftoken_transfers\x18\x0e \x03(\x0b\x32,.coinbase.chainstorage.EthereumTokenTransfer\x12\x0c\n\x04type\x18\x0f \x01(\x04\x12\x19\n\x0fmax_fee_per_gas\x18\x10 \x01(\x04H\x00\x12\"\n\x18max_priority_fee_per_gas\x18\x11 \x01(\x04H\x01\x12W\n\x17transaction_access_list\x18\x12 \x01(\x0b\x32\x34.coinbase.chainstorage.EthereumTransactionAccessListH\x02\x12R\n\x10\x66lattened_traces\x18\x13 \x03(\x0b\x32\x38.coinbase.chainstorage.EthereumTransactionFlattenedTrace\x12\x33\n\x0f\x62lock_timestamp\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x14priority_fee_per_gas\x18\x15 \x01(\x04H\x03\x12\x0e\n\x04mint\x18\x16 \x01(\tH\x04\x12\t\n\x01v\x18\x17 \x01(\t\x12\t\n\x01r\x18\x18 \x01(\t\x12\t\n\x01s\x18\x19 \x01(\t\x12\x12\n\x08\x63hain_id\x18\x1a \x01(\x04H\x05\x12\x13\n\x0bsource_hash\x18\x1b \x01(\t\x12\x14\n\x0cis_system_tx\x18\x1c \x01(\x08\x12\x1e\n\x14max_fee_per_blob_gas\x18\x1d \x01(\tH\x06\x12\x1d\n\x15\x62lob_versioned_hashes\x18\x1e \x03(\tB\x1a\n\x18optional_max_fee_per_gasB#\n!optional_max_priority_fee_per_gasB\"\n optional_transaction_access_listB\x1f\n\x1doptional_priority_fee_per_gasB\x0f\n\roptional_mintB\x13\n\x11optional_chain_idB\x1f\n\x1doptional_max_fee_per_blob_gas\"\xc6\t\n\x1a\x45thereumTransactionReceipt\x12\x18\n\x10transaction_hash\x18\x01 \x01(\t\x12\x19\n\x11transaction_index\x18\x02 \x01(\x04\x12\x12\n\nblock_hash\x18\x03 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x04 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x05 \x01(\t\x12\n\n\x02to\x18\x06 \x01(\t\x12\x1b\n\x13\x63umulative_gas_used\x18\x07 \x01(\x04\x12\x10\n\x08gas_used\x18\x08 \x01(\x04\x12\x18\n\x10\x63ontract_address\x18\t \x01(\t\x12\x35\n\x04logs\x18\n \x03(\x0b\x32\'.coinbase.chainstorage.EthereumEventLog\x12\x12\n\nlogs_bloom\x18\x0b \x01(\t\x12\x0c\n\x04root\x18\x0c \x01(\t\x12\x10\n\x06status\x18\x0e \x01(\x04H\x00\x12\x0c\n\x04type\x18\x0f \x01(\x04\x12\x1b\n\x13\x65\x66\x66\x65\x63tive_gas_price\x18\x10 \x01(\x04\x12R\n\x0bl1_fee_info\x18\x11 \x01(\x0b\x32;.coinbase.chainstorage.EthereumTransactionReceipt.L1FeeInfoH\x01\x12\x17\n\rdeposit_nonce\x18\x12 \x01(\x04H\x02\x12!\n\x17\x64\x65posit_receipt_version\x18\x13 \x01(\x04H\x03\x12\x18\n\x0e\x62lob_gas_price\x18\x14 \x01(\x04H\x04\x12\x17\n\rblob_gas_used\x18\x15 \x01(\x04H\x05\x12\r\n\x03\x66\x65\x65\x18\x16 \x01(\x04H\x06\x12\x11\n\x07net_fee\x18\x17 \x01(\x04H\x07\x12\x13\n\tnet_usage\x18\x18 \x01(\x04H\x08\x12\x16\n\x0c\x65nergy_usage\x18\x19 \x01(\x04H\t\x12\x14\n\nenergy_fee\x18\x1a \x01(\x04H\n\x12\x1d\n\x13origin_energy_usage\x18\x1b \x01(\x04H\x0b\x12\x1c\n\x12\x65nergy_usage_total\x18\x1c \x01(\x04H\x0c\x12\x1e\n\x14\x65nergy_penalty_total\x18\x1d \x01(\x04H\r\x1a]\n\tL1FeeInfo\x12\x13\n\x0bl1_gas_used\x18\x01 \x01(\x04\x12\x14\n\x0cl1_gas_price\x18\x02 \x01(\x04\x12\x0e\n\x06l1_fee\x18\x03 \x01(\x04\x12\x15\n\rl1_fee_scalar\x18\x04 \x01(\tB\x11\n\x0foptional_statusB\x16\n\x14optional_l1_fee_infoB\x18\n\x16optional_deposit_nonceB\"\n optional_deposit_receipt_versionB\x19\n\x17optional_blob_gas_priceB\x18\n\x16optional_blob_gas_usedB\x0e\n\x0coptional_feeB\x12\n\x10optional_net_feeB\x14\n\x12optional_net_usageB\x17\n\x15optional_energy_usageB\x15\n\x13optional_energy_feeB\x1e\n\x1coptional_origin_energy_usageB\x1d\n\x1boptional_energy_usage_totalB\x1f\n\x1doptional_energy_penalty_totalJ\x04\x08\r\x10\x0e\"\xc4\x01\n\x10\x45thereumEventLog\x12\x0f\n\x07removed\x18\x01 \x01(\x08\x12\x11\n\tlog_index\x18\x02 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x03 \x01(\t\x12\x19\n\x11transaction_index\x18\x04 \x01(\x04\x12\x12\n\nblock_hash\x18\x05 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x06 \x01(\x04\x12\x0f\n\x07\x61\x64\x64ress\x18\x07 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x08 \x01(\t\x12\x0e\n\x06topics\x18\t \x03(\t\"\xde\x01\n\x18\x45thereumTransactionTrace\x12\r\n\x05\x65rror\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04\x66rom\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12\x0b\n\x03gas\x18\x06 \x01(\x04\x12\x10\n\x08gas_used\x18\x07 \x01(\x04\x12\r\n\x05input\x18\x08 \x01(\t\x12\x0e\n\x06output\x18\t \x01(\t\x12>\n\x05\x63\x61lls\x18\n \x03(\x0b\x32/.coinbase.chainstorage.EthereumTransactionTrace\"\xf9\x02\n!EthereumTransactionFlattenedTrace\x12\r\n\x05\x65rror\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04\x66rom\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12\x0b\n\x03gas\x18\x06 \x01(\x04\x12\x10\n\x08gas_used\x18\x07 \x01(\x04\x12\r\n\x05input\x18\x08 \x01(\t\x12\x0e\n\x06output\x18\t \x01(\t\x12\x11\n\tsubtraces\x18\n \x01(\x04\x12\x15\n\rtrace_address\x18\x0b \x03(\x04\x12\x12\n\ntrace_type\x18\x0c \x01(\t\x12\x11\n\tcall_type\x18\r \x01(\t\x12\x10\n\x08trace_id\x18\x0e \x01(\t\x12\x0e\n\x06status\x18\x0f \x01(\x04\x12\x12\n\nblock_hash\x18\x10 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x11 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x12 \x01(\t\x12\x19\n\x11transaction_index\x18\x13 \x01(\x04\"\xe5\x02\n\x15\x45thereumTokenTransfer\x12\x15\n\rtoken_address\x18\x01 \x01(\t\x12\x14\n\x0c\x66rom_address\x18\x02 \x01(\t\x12\x12\n\nto_address\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\t\x12\x19\n\x11transaction_index\x18\x05 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x06 \x01(\t\x12\x11\n\tlog_index\x18\x07 \x01(\x04\x12\x12\n\nblock_hash\x18\x08 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\t \x01(\x04\x12:\n\x05\x65rc20\x18\x64 \x01(\x0b\x32).coinbase.chainstorage.ERC20TokenTransferH\x00\x12<\n\x06\x65rc721\x18\x65 \x01(\x0b\x32*.coinbase.chainstorage.ERC721TokenTransferH\x00\x42\x10\n\x0etoken_transfer\"M\n\x12\x45RC20TokenTransfer\x12\x14\n\x0c\x66rom_address\x18\x01 \x01(\t\x12\x12\n\nto_address\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\"Q\n\x13\x45RC721TokenTransfer\x12\x14\n\x0c\x66rom_address\x18\x01 \x01(\t\x12\x12\n\nto_address\x18\x02 \x01(\t\x12\x10\n\x08token_id\x18\x03 \x01(\t\"2\n\x19\x45thereumAccountStateProof\x12\x15\n\raccount_proof\x18\x01 \x01(\x0c\",\n\x12\x45thereumExtraInput\x12\x16\n\x0e\x65rc20_contract\x18\x01 \x01(\t\"V\n\x1c\x45thereumAccountStateResponse\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x14\n\x0cstorage_hash\x18\x02 \x01(\t\x12\x11\n\tcode_hash\x18\x03 \x01(\tB?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_ethereum_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_ETHEREUMBLOBDATA']._serialized_start=108 + _globals['_ETHEREUMBLOBDATA']._serialized_end=290 + _globals['_POLYGONEXTRADATA']._serialized_start=292 + _globals['_POLYGONEXTRADATA']._serialized_end=326 + _globals['_ETHEREUMBLOCK']._serialized_start=329 + _globals['_ETHEREUMBLOCK']._serialized_end=520 + _globals['_ETHEREUMWITHDRAWAL']._serialized_start=522 + _globals['_ETHEREUMWITHDRAWAL']._serialized_end=615 + _globals['_ETHEREUMHEADER']._serialized_start=618 + _globals['_ETHEREUMHEADER']._serialized_end=1404 + _globals['_ETHEREUMTRANSACTIONACCESS']._serialized_start=1406 + _globals['_ETHEREUMTRANSACTIONACCESS']._serialized_end=1472 + _globals['_ETHEREUMTRANSACTIONACCESSLIST']._serialized_start=1474 + _globals['_ETHEREUMTRANSACTIONACCESSLIST']._serialized_end=1576 + _globals['_ETHEREUMTRANSACTION']._serialized_start=1579 + _globals['_ETHEREUMTRANSACTION']._serialized_end=2628 + _globals['_ETHEREUMTRANSACTIONRECEIPT']._serialized_start=2631 + _globals['_ETHEREUMTRANSACTIONRECEIPT']._serialized_end=3853 + _globals['_ETHEREUMTRANSACTIONRECEIPT_L1FEEINFO']._serialized_start=3394 + _globals['_ETHEREUMTRANSACTIONRECEIPT_L1FEEINFO']._serialized_end=3487 + _globals['_ETHEREUMEVENTLOG']._serialized_start=3856 + _globals['_ETHEREUMEVENTLOG']._serialized_end=4052 + _globals['_ETHEREUMTRANSACTIONTRACE']._serialized_start=4055 + _globals['_ETHEREUMTRANSACTIONTRACE']._serialized_end=4277 + _globals['_ETHEREUMTRANSACTIONFLATTENEDTRACE']._serialized_start=4280 + _globals['_ETHEREUMTRANSACTIONFLATTENEDTRACE']._serialized_end=4657 + _globals['_ETHEREUMTOKENTRANSFER']._serialized_start=4660 + _globals['_ETHEREUMTOKENTRANSFER']._serialized_end=5017 + _globals['_ERC20TOKENTRANSFER']._serialized_start=5019 + _globals['_ERC20TOKENTRANSFER']._serialized_end=5096 + _globals['_ERC721TOKENTRANSFER']._serialized_start=5098 + _globals['_ERC721TOKENTRANSFER']._serialized_end=5179 + _globals['_ETHEREUMACCOUNTSTATEPROOF']._serialized_start=5181 + _globals['_ETHEREUMACCOUNTSTATEPROOF']._serialized_end=5231 + _globals['_ETHEREUMEXTRAINPUT']._serialized_start=5233 + _globals['_ETHEREUMEXTRAINPUT']._serialized_end=5277 + _globals['_ETHEREUMACCOUNTSTATERESPONSE']._serialized_start=5279 + _globals['_ETHEREUMACCOUNTSTATERESPONSE']._serialized_end=5365 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2_grpc.py new file mode 100644 index 00000000..7312787d --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_ethereum_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_ethereum_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_pb2.py new file mode 100644 index 00000000..fda9c0de --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_pb2.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from coinbase.c3.common import common_pb2 as coinbase_dot_c3_dot_common_dot_common__pb2 +from coinbase.crypto.rosetta.types import block_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_block__pb2 +from coinbase.crypto.rosetta.types import transaction_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_transaction__pb2 +from coinbase.chainstorage import blockchain_bitcoin_pb2 as coinbase_dot_chainstorage_dot_blockchain__bitcoin__pb2 +from coinbase.chainstorage import blockchain_aptos_pb2 as coinbase_dot_chainstorage_dot_blockchain__aptos__pb2 +from coinbase.chainstorage import blockchain_solana_pb2 as coinbase_dot_chainstorage_dot_blockchain__solana__pb2 +from coinbase.chainstorage import blockchain_rosetta_pb2 as coinbase_dot_chainstorage_dot_blockchain__rosetta__pb2 +from coinbase.chainstorage import blockchain_ethereum_pb2 as coinbase_dot_chainstorage_dot_blockchain__ethereum__pb2 +from coinbase.chainstorage import blockchain_ethereum_beacon_pb2 as coinbase_dot_chainstorage_dot_blockchain__ethereum__beacon__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&coinbase/chainstorage/blockchain.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1f\x63oinbase/c3/common/common.proto\x1a)coinbase/crypto/rosetta/types/block.proto\x1a/coinbase/crypto/rosetta/types/transaction.proto\x1a.coinbase/chainstorage/blockchain_bitcoin.proto\x1a,coinbase/chainstorage/blockchain_aptos.proto\x1a-coinbase/chainstorage/blockchain_solana.proto\x1a.coinbase/chainstorage/blockchain_rosetta.proto\x1a/coinbase/chainstorage/blockchain_ethereum.proto\x1a\x36\x63oinbase/chainstorage/blockchain_ethereum_beacon.proto\"\x9a\x05\n\x05\x42lock\x12\x32\n\nblockchain\x18\x01 \x01(\x0e\x32\x1e.coinbase.c3.common.Blockchain\x12,\n\x07network\x18\x02 \x01(\x0e\x32\x1b.coinbase.c3.common.Network\x12\x36\n\x08metadata\x18\x03 \x01(\x0b\x32$.coinbase.chainstorage.BlockMetadata\x12H\n\x14transaction_metadata\x18\x04 \x01(\x0b\x32*.coinbase.chainstorage.TransactionMetadata\x12\x34\n\nside_chain\x18\x05 \x01(\x0e\x32 .coinbase.chainstorage.SideChain\x12;\n\x08\x65thereum\x18\x64 \x01(\x0b\x32\'.coinbase.chainstorage.EthereumBlobdataH\x00\x12\x39\n\x07\x62itcoin\x18\x65 \x01(\x0b\x32&.coinbase.chainstorage.BitcoinBlobdataH\x00\x12\x39\n\x07rosetta\x18\x66 \x01(\x0b\x32&.coinbase.chainstorage.RosettaBlobdataH\x00\x12\x37\n\x06solana\x18g \x01(\x0b\x32%.coinbase.chainstorage.SolanaBlobdataH\x00\x12\x35\n\x05\x61ptos\x18h \x01(\x0b\x32$.coinbase.chainstorage.AptosBlobdataH\x00\x12H\n\x0f\x65thereum_beacon\x18i \x01(\x0b\x32-.coinbase.chainstorage.EthereumBeaconBlobdataH\x00\x42\n\n\x08\x62lobdata\"|\n\x0f\x42lockIdentifier\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0b\n\x03tag\x18\x03 \x01(\r\x12\x0f\n\x07skipped\x18\x04 \x01(\x08\x12-\n\ttimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xbf\x01\n\rBlockMetadata\x12\x0b\n\x03tag\x18\x01 \x01(\r\x12\x0c\n\x04hash\x18\x02 \x01(\t\x12\x13\n\x0bparent_hash\x18\x03 \x01(\t\x12\x0e\n\x06height\x18\x04 \x01(\x04\x12\x17\n\x0fobject_key_main\x18\x05 \x01(\t\x12\x15\n\rparent_height\x18\x06 \x01(\x04\x12\x0f\n\x07skipped\x18\x07 \x01(\x08\x12-\n\ttimestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"+\n\x13TransactionMetadata\x12\x14\n\x0ctransactions\x18\x01 \x03(\t\"C\n\x0cRosettaBlock\x12\x33\n\x05\x62lock\x18\x01 \x01(\x0b\x32$.coinbase.crypto.rosetta.types.Block\"\xf6\x05\n\x0bNativeBlock\x12\x32\n\nblockchain\x18\x01 \x01(\x0e\x32\x1e.coinbase.c3.common.Blockchain\x12,\n\x07network\x18\x02 \x01(\x0e\x32\x1b.coinbase.c3.common.Network\x12\x0b\n\x03tag\x18\x03 \x01(\r\x12\x0c\n\x04hash\x18\x04 \x01(\t\x12\x13\n\x0bparent_hash\x18\x05 \x01(\t\x12\x0e\n\x06height\x18\x06 \x01(\x04\x12-\n\ttimestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10num_transactions\x18\x08 \x01(\x04\x12\x15\n\rparent_height\x18\t \x01(\x04\x12\x0f\n\x07skipped\x18\n \x01(\x08\x12\x34\n\nside_chain\x18\x0b \x01(\x0e\x32 .coinbase.chainstorage.SideChain\x12\x38\n\x08\x65thereum\x18\x64 \x01(\x0b\x32$.coinbase.chainstorage.EthereumBlockH\x00\x12\x36\n\x07\x62itcoin\x18\x65 \x01(\x0b\x32#.coinbase.chainstorage.BitcoinBlockH\x00\x12\x37\n\x07rosetta\x18\x66 \x01(\x0b\x32$.coinbase.crypto.rosetta.types.BlockH\x00\x12\x34\n\x06solana\x18g \x01(\x0b\x32\".coinbase.chainstorage.SolanaBlockH\x00\x12\x32\n\x05\x61ptos\x18h \x01(\x0b\x32!.coinbase.chainstorage.AptosBlockH\x00\x12\x39\n\tsolana_v2\x18i \x01(\x0b\x32$.coinbase.chainstorage.SolanaBlockV2H\x00\x12\x45\n\x0f\x65thereum_beacon\x18j \x01(\x0b\x32*.coinbase.chainstorage.EthereumBeaconBlockH\x00\x42\x07\n\x05\x62lock\"\xbd\x04\n\x11NativeTransaction\x12\x32\n\nblockchain\x18\x01 \x01(\x0e\x32\x1e.coinbase.c3.common.Blockchain\x12,\n\x07network\x18\x02 \x01(\x0e\x32\x1b.coinbase.c3.common.Network\x12\x0b\n\x03tag\x18\x03 \x01(\r\x12\x18\n\x10transaction_hash\x18\x04 \x01(\t\x12\x14\n\x0c\x62lock_height\x18\x05 \x01(\x04\x12\x12\n\nblock_hash\x18\x06 \x01(\t\x12\x33\n\x0f\x62lock_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x08\x65thereum\x18\x64 \x01(\x0b\x32*.coinbase.chainstorage.EthereumTransactionH\x00\x12<\n\x07\x62itcoin\x18\x65 \x01(\x0b\x32).coinbase.chainstorage.BitcoinTransactionH\x00\x12=\n\x07rosetta\x18\x66 \x01(\x0b\x32*.coinbase.crypto.rosetta.types.TransactionH\x00\x12:\n\x06solana\x18g \x01(\x0b\x32(.coinbase.chainstorage.SolanaTransactionH\x00\x12\x38\n\x05\x61ptos\x18h \x01(\x0b\x32\'.coinbase.chainstorage.AptosTransactionH\x00\x42\r\n\x0btransaction\"k\n\x17GetAccountProofResponse\x12\x44\n\x08\x65thereum\x18\x64 \x01(\x0b\x32\x30.coinbase.chainstorage.EthereumAccountStateProofH\x00\x42\n\n\x08response\"\xeb\x01\n\x1bValidateAccountStateRequest\x12R\n\x0b\x61\x63\x63ount_req\x18\x01 \x01(\x0b\x32=.coinbase.chainstorage.InternalGetVerifiedAccountStateRequest\x12\x31\n\x05\x62lock\x18\x02 \x01(\x0b\x32\".coinbase.chainstorage.NativeBlock\x12\x45\n\raccount_proof\x18\x03 \x01(\x0b\x32..coinbase.chainstorage.GetAccountProofResponse\"\xb2\x01\n&InternalGetVerifiedAccountStateRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\x04\x12\x0c\n\x04hash\x18\x04 \x01(\t\x12=\n\x08\x65thereum\x18\x64 \x01(\x0b\x32).coinbase.chainstorage.EthereumExtraInputH\x00\x42\r\n\x0b\x65xtra_input\"\x84\x01\n\x1cValidateAccountStateResponse\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\t\x12G\n\x08\x65thereum\x18\x64 \x01(\x0b\x32\x33.coinbase.chainstorage.EthereumAccountStateResponseH\x00\x42\n\n\x08response\"W\n\x1bValidateRosettaBlockRequest\x12\x38\n\x0cnative_block\x18\x01 \x01(\x0b\x32\".coinbase.chainstorage.NativeBlock*m\n\tSideChain\x12\x12\n\x0eSIDECHAIN_NONE\x10\x00\x12%\n!SIDECHAIN_ETHEREUM_MAINNET_BEACON\x10\x01\x12%\n!SIDECHAIN_ETHEREUM_HOLESKY_BEACON\x10\x02\x42?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_SIDECHAIN']._serialized_start=3709 + _globals['_SIDECHAIN']._serialized_end=3818 + _globals['_BLOCK']._serialized_start=518 + _globals['_BLOCK']._serialized_end=1184 + _globals['_BLOCKIDENTIFIER']._serialized_start=1186 + _globals['_BLOCKIDENTIFIER']._serialized_end=1310 + _globals['_BLOCKMETADATA']._serialized_start=1313 + _globals['_BLOCKMETADATA']._serialized_end=1504 + _globals['_TRANSACTIONMETADATA']._serialized_start=1506 + _globals['_TRANSACTIONMETADATA']._serialized_end=1549 + _globals['_ROSETTABLOCK']._serialized_start=1551 + _globals['_ROSETTABLOCK']._serialized_end=1618 + _globals['_NATIVEBLOCK']._serialized_start=1621 + _globals['_NATIVEBLOCK']._serialized_end=2379 + _globals['_NATIVETRANSACTION']._serialized_start=2382 + _globals['_NATIVETRANSACTION']._serialized_end=2955 + _globals['_GETACCOUNTPROOFRESPONSE']._serialized_start=2957 + _globals['_GETACCOUNTPROOFRESPONSE']._serialized_end=3064 + _globals['_VALIDATEACCOUNTSTATEREQUEST']._serialized_start=3067 + _globals['_VALIDATEACCOUNTSTATEREQUEST']._serialized_end=3302 + _globals['_INTERNALGETVERIFIEDACCOUNTSTATEREQUEST']._serialized_start=3305 + _globals['_INTERNALGETVERIFIEDACCOUNTSTATEREQUEST']._serialized_end=3483 + _globals['_VALIDATEACCOUNTSTATERESPONSE']._serialized_start=3486 + _globals['_VALIDATEACCOUNTSTATERESPONSE']._serialized_end=3618 + _globals['_VALIDATEROSETTABLOCKREQUEST']._serialized_start=3620 + _globals['_VALIDATEROSETTABLOCKREQUEST']._serialized_end=3707 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_pb2_grpc.py new file mode 100644 index 00000000..1a065aae --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2.py new file mode 100644 index 00000000..372f7eee --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_rosetta.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_rosetta.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.coinbase/chainstorage/blockchain_rosetta.proto\x12\x15\x63oinbase.chainstorage\"P\n\x0fRosettaBlobdata\x12\x0e\n\x06header\x18\x01 \x01(\x0c\x12\x1a\n\x12other_transactions\x18\x02 \x03(\x0c\x12\x11\n\traw_block\x18\x03 \x01(\x0c\x42?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_rosetta_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_ROSETTABLOBDATA']._serialized_start=73 + _globals['_ROSETTABLOBDATA']._serialized_end=153 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2_grpc.py new file mode 100644 index 00000000..c005a5f6 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_rosetta_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_rosetta_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2.py b/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2.py new file mode 100644 index 00000000..d49cfff5 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/chainstorage/blockchain_solana.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/chainstorage/blockchain_solana.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-coinbase/chainstorage/blockchain_solana.proto\x12\x15\x63oinbase.chainstorage\x1a\x1fgoogle/protobuf/timestamp.proto\" \n\x0eSolanaBlobdata\x12\x0e\n\x06header\x18\x01 \x01(\x0c\"\xb8\x01\n\x0bSolanaBlock\x12\x33\n\x06header\x18\x01 \x01(\x0b\x32#.coinbase.chainstorage.SolanaHeader\x12>\n\x0ctransactions\x18\x02 \x03(\x0b\x32(.coinbase.chainstorage.SolanaTransaction\x12\x34\n\x07rewards\x18\x03 \x03(\x0b\x32#.coinbase.chainstorage.SolanaReward\"\xbc\x01\n\rSolanaBlockV2\x12\x33\n\x06header\x18\x01 \x01(\x0b\x32#.coinbase.chainstorage.SolanaHeader\x12@\n\x0ctransactions\x18\x02 \x03(\x0b\x32*.coinbase.chainstorage.SolanaTransactionV2\x12\x34\n\x07rewards\x18\x03 \x03(\x0b\x32#.coinbase.chainstorage.SolanaReward\"\xa8\x01\n\x0cSolanaHeader\x12\x12\n\nblock_hash\x18\x01 \x01(\t\x12\x1b\n\x13previous_block_hash\x18\x02 \x01(\t\x12\x0c\n\x04slot\x18\x03 \x01(\x04\x12\x13\n\x0bparent_slot\x18\x04 \x01(\x04\x12.\n\nblock_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0c\x62lock_height\x18\x06 \x01(\x04\"\xba\x01\n\x11SolanaTransaction\x12\x16\n\x0etransaction_id\x18\x01 \x01(\t\x12@\n\x07payload\x18\x02 \x01(\x0b\x32/.coinbase.chainstorage.SolanaTransactionPayload\x12:\n\x04meta\x18\x03 \x01(\x0b\x32,.coinbase.chainstorage.SolanaTransactionMeta\x12\x0f\n\x07version\x18\x04 \x01(\x05\"\xc0\x01\n\x13SolanaTransactionV2\x12\x16\n\x0etransaction_id\x18\x01 \x01(\t\x12\x42\n\x07payload\x18\x02 \x01(\x0b\x32\x31.coinbase.chainstorage.SolanaTransactionPayloadV2\x12<\n\x04meta\x18\x03 \x01(\x0b\x32..coinbase.chainstorage.SolanaTransactionMetaV2\x12\x0f\n\x07version\x18\x04 \x01(\x05\"\x84\x03\n\x15SolanaTransactionMeta\x12\x0b\n\x03\x65rr\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x14\n\x0cpre_balances\x18\x03 \x03(\x04\x12\x15\n\rpost_balances\x18\x04 \x03(\x04\x12\x45\n\x12pre_token_balances\x18\x05 \x03(\x0b\x32).coinbase.chainstorage.SolanaTokenBalance\x12\x46\n\x13post_token_balances\x18\x06 \x03(\x0b\x32).coinbase.chainstorage.SolanaTokenBalance\x12I\n\x12inner_instructions\x18\x07 \x03(\x0b\x32-.coinbase.chainstorage.SolanaInnerInstruction\x12\x14\n\x0clog_messages\x18\x08 \x03(\t\x12\x34\n\x07rewards\x18\t \x03(\x0b\x32#.coinbase.chainstorage.SolanaReward\"\x88\x03\n\x17SolanaTransactionMetaV2\x12\x0b\n\x03\x65rr\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x14\n\x0cpre_balances\x18\x03 \x03(\x04\x12\x15\n\rpost_balances\x18\x04 \x03(\x04\x12\x45\n\x12pre_token_balances\x18\x05 \x03(\x0b\x32).coinbase.chainstorage.SolanaTokenBalance\x12\x46\n\x13post_token_balances\x18\x06 \x03(\x0b\x32).coinbase.chainstorage.SolanaTokenBalance\x12K\n\x12inner_instructions\x18\x07 \x03(\x0b\x32/.coinbase.chainstorage.SolanaInnerInstructionV2\x12\x14\n\x0clog_messages\x18\x08 \x03(\t\x12\x34\n\x07rewards\x18\t \x03(\x0b\x32#.coinbase.chainstorage.SolanaReward\"\x88\x01\n\x12SolanaTokenBalance\x12\x15\n\raccount_index\x18\x01 \x01(\x04\x12\x0c\n\x04mint\x18\x02 \x01(\t\x12>\n\x0ctoken_amount\x18\x03 \x01(\x0b\x32(.coinbase.chainstorage.SolanaTokenAmount\x12\r\n\x05owner\x18\x04 \x01(\t\"O\n\x11SolanaTokenAmount\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x02 \x01(\x04\x12\x18\n\x10ui_amount_string\x18\x03 \x01(\t\"g\n\x16SolanaInnerInstruction\x12\r\n\x05index\x18\x01 \x01(\x04\x12>\n\x0cinstructions\x18\x02 \x03(\x0b\x32(.coinbase.chainstorage.SolanaInstruction\"k\n\x18SolanaInnerInstructionV2\x12\r\n\x05index\x18\x01 \x01(\x04\x12@\n\x0cinstructions\x18\x02 \x03(\x0b\x32*.coinbase.chainstorage.SolanaInstructionV2\"\x88\x01\n\x0cSolanaReward\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x10\n\x08lamports\x18\x02 \x01(\x03\x12\x14\n\x0cpost_balance\x18\x03 \x01(\x04\x12\x13\n\x0breward_type\x18\x04 \x01(\t\x12\x14\n\ncommission\x18\x05 \x01(\x04H\x00\x42\x15\n\x13optional_commission\"e\n\x18SolanaTransactionPayload\x12\x12\n\nsignatures\x18\x01 \x03(\t\x12\x35\n\x07message\x18\x02 \x01(\x0b\x32$.coinbase.chainstorage.SolanaMessage\"i\n\x1aSolanaTransactionPayloadV2\x12\x12\n\nsignatures\x18\x01 \x03(\t\x12\x37\n\x07message\x18\x02 \x01(\x0b\x32&.coinbase.chainstorage.SolanaMessageV2\"\xde\x01\n\rSolanaMessage\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.coinbase.chainstorage.SolanaMessageHeader\x12\x19\n\x11recent_block_hash\x18\x03 \x01(\t\x12>\n\x0cinstructions\x18\x04 \x03(\x0b\x32(.coinbase.chainstorage.SolanaInstruction\x12\x36\n\x08\x61\x63\x63ounts\x18\x05 \x03(\x0b\x32$.coinbase.chainstorage.SolanaAccount\"\xf1\x01\n\x0fSolanaMessageV2\x12\x37\n\x0c\x61\x63\x63ount_keys\x18\x01 \x03(\x0b\x32!.coinbase.chainstorage.AccountKey\x12H\n\x15\x61\x64\x64ress_table_lookups\x18\x02 \x03(\x0b\x32).coinbase.chainstorage.AddressTableLookup\x12@\n\x0cinstructions\x18\x03 \x03(\x0b\x32*.coinbase.chainstorage.SolanaInstructionV2\x12\x19\n\x11recent_block_hash\x18\x04 \x01(\t\"N\n\nAccountKey\x12\x0e\n\x06pubkey\x18\x01 \x01(\t\x12\x0e\n\x06signer\x18\x02 \x01(\x08\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x10\n\x08writable\x18\x04 \x01(\x08\"]\n\x12\x41\x64\x64ressTableLookup\x12\x13\n\x0b\x61\x63\x63ount_key\x18\x01 \x01(\t\x12\x18\n\x10readonly_indexes\x18\x02 \x03(\x04\x12\x18\n\x10writable_indexes\x18\x03 \x03(\x04\"\x84\x01\n\x13SolanaMessageHeader\x12\x1f\n\x17num_required_signatures\x18\x01 \x01(\x04\x12$\n\x1cnum_readonly_signed_accounts\x18\x02 \x01(\x04\x12&\n\x1enum_readonly_unsigned_accounts\x18\x03 \x01(\x04\"w\n\x11SolanaInstruction\x12\x18\n\x10program_id_index\x18\x01 \x01(\x04\x12\x10\n\x08\x61\x63\x63ounts\x18\x02 \x03(\x04\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\x12\x12\n\nprogram_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63ount_keys\x18\x05 \x03(\t\"6\n\x14SolanaRawInstruction\x12\x10\n\x08\x61\x63\x63ounts\x18\x01 \x03(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xec\x07\n\x13SolanaInstructionV2\x12\x35\n\x07program\x18\x01 \x01(\x0e\x32$.coinbase.chainstorage.SolanaProgram\x12\x12\n\nprogram_id\x18\x02 \x01(\t\x12\x46\n\x0fraw_instruction\x18\x64 \x01(\x0b\x32+.coinbase.chainstorage.SolanaRawInstructionH\x00\x12^\n\x1c\x61\x64\x64ress_lookup_table_program\x18\x65 \x01(\x0b\x32\x36.coinbase.chainstorage.SolanaAddressLookupTableProgramH\x00\x12K\n\x12\x62pf_loader_program\x18\x66 \x01(\x0b\x32-.coinbase.chainstorage.SolanaBpfLoaderProgramH\x00\x12\x62\n\x1e\x62pf_upgradeable_loader_program\x18g \x01(\x0b\x32\x38.coinbase.chainstorage.SolanaBpfUpgradeableLoaderProgramH\x00\x12@\n\x0cvote_program\x18h \x01(\x0b\x32(.coinbase.chainstorage.SolanaVoteProgramH\x00\x12\x44\n\x0esystem_program\x18i \x01(\x0b\x32*.coinbase.chainstorage.SolanaSystemProgramH\x00\x12\x42\n\rstake_program\x18j \x01(\x0b\x32).coinbase.chainstorage.SolanaStakeProgramH\x00\x12G\n\x10spl_memo_program\x18k \x01(\x0b\x32+.coinbase.chainstorage.SolanaSplMemoProgramH\x00\x12I\n\x11spl_token_program\x18l \x01(\x0b\x32,.coinbase.chainstorage.SolanaSplTokenProgramH\x00\x12R\n\x16spl_token_2022_program\x18m \x01(\x0b\x32\x30.coinbase.chainstorage.SolanaSplToken2022ProgramH\x00\x12m\n$spl_associated_token_account_program\x18n \x01(\x0b\x32=.coinbase.chainstorage.SolanaSplAssociatedTokenAccountProgramH\x00\x42\x0e\n\x0cprogram_data\"\xf6\x01\n\x1fSolanaAddressLookupTableProgram\x12`\n\x10instruction_type\x18\x01 \x01(\x0e\x32\x46.coinbase.chainstorage.SolanaAddressLookupTableProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\"\x1e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x42\r\n\x0binstruction\"\xe4\x01\n\x16SolanaBpfLoaderProgram\x12W\n\x10instruction_type\x18\x01 \x01(\x0e\x32=.coinbase.chainstorage.SolanaBpfLoaderProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\"\x1e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x42\r\n\x0binstruction\"\xfa\x01\n!SolanaBpfUpgradeableLoaderProgram\x12\x62\n\x10instruction_type\x18\x01 \x01(\x0e\x32H.coinbase.chainstorage.SolanaBpfUpgradeableLoaderProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\"\x1e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x42\r\n\x0binstruction\"\xe4\x04\n\x11SolanaVoteProgram\x12R\n\x10instruction_type\x18\x01 \x01(\x0e\x32\x38.coinbase.chainstorage.SolanaVoteProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\x12L\n\ninitialize\x18\x65 \x01(\x0b\x32\x36.coinbase.chainstorage.SolanaVoteInitializeInstructionH\x00\x12@\n\x04vote\x18\x66 \x01(\x0b\x32\x30.coinbase.chainstorage.SolanaVoteVoteInstructionH\x00\x12H\n\x08withdraw\x18g \x01(\x0b\x32\x34.coinbase.chainstorage.SolanaVoteWithdrawInstructionH\x00\x12g\n\x19\x63ompact_update_vote_state\x18h \x01(\x0b\x32\x42.coinbase.chainstorage.SolanaVoteCompactUpdateVoteStateInstructionH\x00\"e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nINITIALIZE\x10\x01\x12\x08\n\x04VOTE\x10\x02\x12\x0c\n\x08WITHDRAW\x10\x03\x12\x1d\n\x19\x43OMPACT_UPDATE_VOTE_STATE\x10\x04\x42\r\n\x0binstruction\"\xa0\x05\n\x13SolanaSystemProgram\x12T\n\x10instruction_type\x18\x01 \x01(\x0e\x32:.coinbase.chainstorage.SolanaSystemProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\x12U\n\x0e\x63reate_account\x18\x65 \x01(\x0b\x32;.coinbase.chainstorage.SolanaSystemCreateAccountInstructionH\x00\x12J\n\x08transfer\x18\x66 \x01(\x0b\x32\x36.coinbase.chainstorage.SolanaSystemTransferInstructionH\x00\x12g\n\x18\x63reate_account_with_seed\x18g \x01(\x0b\x32\x43.coinbase.chainstorage.SolanaSystemCreateAccountWithSeedInstructionH\x00\x12\\\n\x12transfer_with_seed\x18h \x01(\x0b\x32>.coinbase.chainstorage.SolanaSystemTransferWithSeedInstructionH\x00\"v\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x12\n\x0e\x43REATE_ACCOUNT\x10\x01\x12\x0c\n\x08TRANSFER\x10\x02\x12\x1c\n\x18\x43REATE_ACCOUNT_WITH_SEED\x10\x03\x12\x16\n\x12TRANSFER_WITH_SEED\x10\x04\x42\r\n\x0binstruction\"\xec\x05\n\x12SolanaStakeProgram\x12S\n\x10instruction_type\x18\x01 \x01(\x0e\x32\x39.coinbase.chainstorage.SolanaStakeProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\x12M\n\ninitialize\x18\x65 \x01(\x0b\x32\x37.coinbase.chainstorage.SolanaStakeInitializeInstructionH\x00\x12I\n\x08\x64\x65legate\x18\x66 \x01(\x0b\x32\x35.coinbase.chainstorage.SolanaStakeDelegateInstructionH\x00\x12M\n\ndeactivate\x18g \x01(\x0b\x32\x37.coinbase.chainstorage.SolanaStakeDeactivateInstructionH\x00\x12\x43\n\x05merge\x18h \x01(\x0b\x32\x32.coinbase.chainstorage.SolanaStakeMergeInstructionH\x00\x12\x43\n\x05split\x18i \x01(\x0b\x32\x32.coinbase.chainstorage.SolanaStakeSplitInstructionH\x00\x12I\n\x08withdraw\x18j \x01(\x0b\x32\x35.coinbase.chainstorage.SolanaStakeWithdrawInstructionH\x00\"p\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nINITIALIZE\x10\x01\x12\x0c\n\x08\x44\x45LEGATE\x10\x02\x12\x0e\n\nDEACTIVATE\x10\x03\x12\t\n\x05MERGE\x10\x04\x12\t\n\x05SPLIT\x10\x05\x12\x0c\n\x08WITHDRAW\x10\x06\x42\r\n\x0binstruction\"\xde\x01\n\x14SolanaSplMemoProgram\x12U\n\x10instruction_type\x18\x01 \x01(\x0e\x32;.coinbase.chainstorage.SolanaSplMemoProgram.InstructionType\x12?\n\x04memo\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaSplMemoInstructionH\x00\"\x1f\n\x0fInstructionType\x12\x0c\n\x08SPL_MEMO\x10\x00\x42\r\n\x0binstruction\"\xce\x04\n\x15SolanaSplTokenProgram\x12V\n\x10instruction_type\x18\x01 \x01(\x0e\x32<.coinbase.chainstorage.SolanaSplTokenProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\x12\x63\n\x15get_account_data_size\x18\x65 \x01(\x0b\x32\x42.coinbase.chainstorage.SolanaSplTokenGetAccountDataSizeInstructionH\x00\x12n\n\x1ainitialize_immutable_owner\x18\x66 \x01(\x0b\x32H.coinbase.chainstorage.SolanaSplTokenInitializeImmutableOwnerInstructionH\x00\x12L\n\x08transfer\x18g \x01(\x0b\x32\x38.coinbase.chainstorage.SolanaSplTokenTransferInstructionH\x00\"g\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x19\n\x15GET_ACCOUNT_DATA_SIZE\x10\x01\x12\x1e\n\x1aINITIALIZE_IMMUTABLE_OWNER\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x42\r\n\x0binstruction\"\xea\x01\n\x19SolanaSplToken2022Program\x12Z\n\x10instruction_type\x18\x01 \x01(\x0e\x32@.coinbase.chainstorage.SolanaSplToken2022Program.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\"\x1e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x42\r\n\x0binstruction\"\x84\x02\n&SolanaSplAssociatedTokenAccountProgram\x12g\n\x10instruction_type\x18\x01 \x01(\x0e\x32M.coinbase.chainstorage.SolanaSplAssociatedTokenAccountProgram.InstructionType\x12\x42\n\x07unknown\x18\x64 \x01(\x0b\x32/.coinbase.chainstorage.SolanaUnknownInstructionH\x00\"\x1e\n\x0fInstructionType\x12\x0b\n\x07UNKNOWN\x10\x00\x42\r\n\x0binstruction\"(\n\x18SolanaUnknownInstruction\x12\x0c\n\x04info\x18\x01 \x01(\x0c\"\xbd\x01\n\x1fSolanaVoteInitializeInstruction\x12\x14\n\x0cvote_account\x18\x01 \x01(\t\x12\x13\n\x0brent_sysvar\x18\x02 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x03 \x01(\t\x12\x0c\n\x04node\x18\x04 \x01(\t\x12\x18\n\x10\x61uthorized_voter\x18\x05 \x01(\t\x12\x1d\n\x15\x61uthorized_withdrawer\x18\x06 \x01(\t\x12\x12\n\ncommission\x18\x07 \x01(\r\"\x94\x02\n\x19SolanaVoteVoteInstruction\x12\x14\n\x0cvote_account\x18\x01 \x01(\t\x12\x1a\n\x12slot_hashes_sysvar\x18\x02 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x03 \x01(\t\x12\x16\n\x0evote_authority\x18\x04 \x01(\t\x12\x43\n\x04vote\x18\x05 \x01(\x0b\x32\x35.coinbase.chainstorage.SolanaVoteVoteInstruction.Vote\x1aR\n\x04Vote\x12\r\n\x05slots\x18\x01 \x03(\x04\x12\x0c\n\x04hash\x18\x02 \x01(\t\x12-\n\ttimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"x\n\x1dSolanaVoteWithdrawInstruction\x12\x14\n\x0cvote_account\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\t\x12\x1a\n\x12withdraw_authority\x18\x03 \x01(\t\x12\x10\n\x08lamports\x18\x04 \x01(\x04\"\xbc\x03\n+SolanaVoteCompactUpdateVoteStateInstruction\x12\x14\n\x0cvote_account\x18\x01 \x01(\t\x12\x16\n\x0evote_authority\x18\x02 \x01(\t\x12m\n\x11vote_state_update\x18\x03 \x01(\x0b\x32R.coinbase.chainstorage.SolanaVoteCompactUpdateVoteStateInstruction.VoteStateUpdate\x1a\x33\n\x07Lockout\x12\x1a\n\x12\x63onfirmation_count\x18\x01 \x01(\x04\x12\x0c\n\x04slot\x18\x02 \x01(\x04\x1a\xba\x01\n\x0fVoteStateUpdate\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\\\n\x08lockouts\x18\x02 \x03(\x0b\x32J.coinbase.chainstorage.SolanaVoteCompactUpdateVoteStateInstruction.Lockout\x12\x0c\n\x04root\x18\x03 \x01(\x04\x12-\n\ttimestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"{\n$SolanaSystemCreateAccountInstruction\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x13\n\x0bnew_account\x18\x02 \x01(\t\x12\x10\n\x08lamports\x18\x03 \x01(\x04\x12\r\n\x05space\x18\x04 \x01(\x04\x12\r\n\x05owner\x18\x05 \x01(\t\"X\n\x1fSolanaSystemTransferInstruction\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\t\x12\x10\n\x08lamports\x18\x03 \x01(\x04\"\x9f\x01\n,SolanaSystemCreateAccountWithSeedInstruction\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x13\n\x0bnew_account\x18\x02 \x01(\t\x12\x0c\n\x04\x62\x61se\x18\x03 \x01(\t\x12\x0c\n\x04seed\x18\x04 \x01(\t\x12\x10\n\x08lamports\x18\x05 \x01(\x04\x12\r\n\x05space\x18\x06 \x01(\x04\x12\r\n\x05owner\x18\x07 \x01(\t\"\xa0\x01\n\'SolanaSystemTransferWithSeedInstruction\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x13\n\x0bsource_base\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\t\x12\x10\n\x08lamports\x18\x04 \x01(\x04\x12\x13\n\x0bsource_seed\x18\x05 \x01(\t\x12\x14\n\x0csource_owner\x18\x06 \x01(\t\"\xec\x02\n SolanaStakeInitializeInstruction\x12\x15\n\rstake_account\x18\x01 \x01(\t\x12\x13\n\x0brent_sysvar\x18\x02 \x01(\t\x12V\n\nauthorized\x18\x03 \x01(\x0b\x32\x42.coinbase.chainstorage.SolanaStakeInitializeInstruction.Authorized\x12N\n\x06lockup\x18\x04 \x01(\x0b\x32>.coinbase.chainstorage.SolanaStakeInitializeInstruction.Lockup\x1a\x30\n\nAuthorized\x12\x0e\n\x06staker\x18\x01 \x01(\t\x12\x12\n\nwithdrawer\x18\x02 \x01(\t\x1a\x42\n\x06Lockup\x12\x16\n\x0eunix_timestamp\x18\x01 \x01(\x03\x12\r\n\x05\x65poch\x18\x02 \x01(\x04\x12\x11\n\tcustodian\x18\x03 \x01(\t\"\xb8\x01\n\x1eSolanaStakeDelegateInstruction\x12\x15\n\rstake_account\x18\x01 \x01(\t\x12\x14\n\x0cvote_account\x18\x02 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x03 \x01(\t\x12\x1c\n\x14stake_history_sysvar\x18\x04 \x01(\t\x12\x1c\n\x14stake_config_account\x18\x05 \x01(\t\x12\x17\n\x0fstake_authority\x18\x06 \x01(\t\"h\n SolanaStakeDeactivateInstruction\x12\x15\n\rstake_account\x18\x01 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x02 \x01(\t\x12\x17\n\x0fstake_authority\x18\x03 \x01(\t\"\x8f\x01\n\x1bSolanaStakeMergeInstruction\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x03 \x01(\t\x12\x1c\n\x14stake_history_sysvar\x18\x04 \x01(\t\x12\x17\n\x0fstake_authority\x18\x05 \x01(\t\"z\n\x1bSolanaStakeSplitInstruction\x12\x15\n\rstake_account\x18\x01 \x01(\t\x12\x19\n\x11new_split_account\x18\x02 \x01(\t\x12\x17\n\x0fstake_authority\x18\x03 \x01(\t\x12\x10\n\x08lamports\x18\x04 \x01(\x04\"\xae\x01\n\x1eSolanaStakeWithdrawInstruction\x12\x15\n\rstake_account\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\t\x12\x14\n\x0c\x63lock_sysvar\x18\x03 \x01(\t\x12\x1c\n\x14stake_history_sysvar\x18\x04 \x01(\t\x12\x1a\n\x12withdraw_authority\x18\x05 \x01(\t\x12\x10\n\x08lamports\x18\x06 \x01(\x04\"(\n\x18SolanaSplMemoInstruction\x12\x0c\n\x04memo\x18\x01 \x01(\t\"T\n+SolanaSplTokenGetAccountDataSizeInstruction\x12\x0c\n\x04mint\x18\x01 \x01(\t\x12\x17\n\x0f\x65xtension_types\x18\x02 \x03(\t\"D\n1SolanaSplTokenInitializeImmutableOwnerInstruction\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"k\n!SolanaSplTokenTransferInstruction\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\t\x12\x11\n\tauthority\x18\x03 \x01(\t\x12\x0e\n\x06\x61mount\x18\x04 \x01(\t\"E\n\rSolanaAccount\x12\x12\n\npublic_key\x18\x01 \x01(\t\x12\x0e\n\x06signer\x18\x02 \x01(\x08\x12\x10\n\x08writable\x18\x03 \x01(\x08*\xe0\x01\n\rSolanaProgram\x12\x07\n\x03RAW\x10\x00\x12\x18\n\x14\x41\x44\x44RESS_LOOKUP_TABLE\x10\x01\x12\x0e\n\nBPF_Loader\x10\x02\x12\x1a\n\x16\x42PF_UPGRADEABLE_Loader\x10\x03\x12\x08\n\x04VOTE\x10\x04\x12\n\n\x06SYSTEM\x10\x05\x12\t\n\x05STAKE\x10\x06\x12\x0c\n\x08SPL_MEMO\x10\x07\x12\r\n\tSPL_TOKEN\x10\x08\x12\x12\n\x0eSPL_TOKEN_2022\x10\t\x12 \n\x1cSPL_ASSOCIATED_TOKEN_ACCOUNT\x10\n\x12\x0c\n\x08UNPARSED\x10\x0b\x42?Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorageb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.chainstorage.blockchain_solana_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/coinbase/chainstorage/protos/coinbase/chainstorage' + _globals['_SOLANAPROGRAM']._serialized_start=11804 + _globals['_SOLANAPROGRAM']._serialized_end=12028 + _globals['_SOLANABLOBDATA']._serialized_start=105 + _globals['_SOLANABLOBDATA']._serialized_end=137 + _globals['_SOLANABLOCK']._serialized_start=140 + _globals['_SOLANABLOCK']._serialized_end=324 + _globals['_SOLANABLOCKV2']._serialized_start=327 + _globals['_SOLANABLOCKV2']._serialized_end=515 + _globals['_SOLANAHEADER']._serialized_start=518 + _globals['_SOLANAHEADER']._serialized_end=686 + _globals['_SOLANATRANSACTION']._serialized_start=689 + _globals['_SOLANATRANSACTION']._serialized_end=875 + _globals['_SOLANATRANSACTIONV2']._serialized_start=878 + _globals['_SOLANATRANSACTIONV2']._serialized_end=1070 + _globals['_SOLANATRANSACTIONMETA']._serialized_start=1073 + _globals['_SOLANATRANSACTIONMETA']._serialized_end=1461 + _globals['_SOLANATRANSACTIONMETAV2']._serialized_start=1464 + _globals['_SOLANATRANSACTIONMETAV2']._serialized_end=1856 + _globals['_SOLANATOKENBALANCE']._serialized_start=1859 + _globals['_SOLANATOKENBALANCE']._serialized_end=1995 + _globals['_SOLANATOKENAMOUNT']._serialized_start=1997 + _globals['_SOLANATOKENAMOUNT']._serialized_end=2076 + _globals['_SOLANAINNERINSTRUCTION']._serialized_start=2078 + _globals['_SOLANAINNERINSTRUCTION']._serialized_end=2181 + _globals['_SOLANAINNERINSTRUCTIONV2']._serialized_start=2183 + _globals['_SOLANAINNERINSTRUCTIONV2']._serialized_end=2290 + _globals['_SOLANAREWARD']._serialized_start=2293 + _globals['_SOLANAREWARD']._serialized_end=2429 + _globals['_SOLANATRANSACTIONPAYLOAD']._serialized_start=2431 + _globals['_SOLANATRANSACTIONPAYLOAD']._serialized_end=2532 + _globals['_SOLANATRANSACTIONPAYLOADV2']._serialized_start=2534 + _globals['_SOLANATRANSACTIONPAYLOADV2']._serialized_end=2639 + _globals['_SOLANAMESSAGE']._serialized_start=2642 + _globals['_SOLANAMESSAGE']._serialized_end=2864 + _globals['_SOLANAMESSAGEV2']._serialized_start=2867 + _globals['_SOLANAMESSAGEV2']._serialized_end=3108 + _globals['_ACCOUNTKEY']._serialized_start=3110 + _globals['_ACCOUNTKEY']._serialized_end=3188 + _globals['_ADDRESSTABLELOOKUP']._serialized_start=3190 + _globals['_ADDRESSTABLELOOKUP']._serialized_end=3283 + _globals['_SOLANAMESSAGEHEADER']._serialized_start=3286 + _globals['_SOLANAMESSAGEHEADER']._serialized_end=3418 + _globals['_SOLANAINSTRUCTION']._serialized_start=3420 + _globals['_SOLANAINSTRUCTION']._serialized_end=3539 + _globals['_SOLANARAWINSTRUCTION']._serialized_start=3541 + _globals['_SOLANARAWINSTRUCTION']._serialized_end=3595 + _globals['_SOLANAINSTRUCTIONV2']._serialized_start=3598 + _globals['_SOLANAINSTRUCTIONV2']._serialized_end=4602 + _globals['_SOLANAADDRESSLOOKUPTABLEPROGRAM']._serialized_start=4605 + _globals['_SOLANAADDRESSLOOKUPTABLEPROGRAM']._serialized_end=4851 + _globals['_SOLANAADDRESSLOOKUPTABLEPROGRAM_INSTRUCTIONTYPE']._serialized_start=4806 + _globals['_SOLANAADDRESSLOOKUPTABLEPROGRAM_INSTRUCTIONTYPE']._serialized_end=4836 + _globals['_SOLANABPFLOADERPROGRAM']._serialized_start=4854 + _globals['_SOLANABPFLOADERPROGRAM']._serialized_end=5082 + _globals['_SOLANABPFLOADERPROGRAM_INSTRUCTIONTYPE']._serialized_start=4806 + _globals['_SOLANABPFLOADERPROGRAM_INSTRUCTIONTYPE']._serialized_end=4836 + _globals['_SOLANABPFUPGRADEABLELOADERPROGRAM']._serialized_start=5085 + _globals['_SOLANABPFUPGRADEABLELOADERPROGRAM']._serialized_end=5335 + _globals['_SOLANABPFUPGRADEABLELOADERPROGRAM_INSTRUCTIONTYPE']._serialized_start=4806 + _globals['_SOLANABPFUPGRADEABLELOADERPROGRAM_INSTRUCTIONTYPE']._serialized_end=4836 + _globals['_SOLANAVOTEPROGRAM']._serialized_start=5338 + _globals['_SOLANAVOTEPROGRAM']._serialized_end=5950 + _globals['_SOLANAVOTEPROGRAM_INSTRUCTIONTYPE']._serialized_start=5834 + _globals['_SOLANAVOTEPROGRAM_INSTRUCTIONTYPE']._serialized_end=5935 + _globals['_SOLANASYSTEMPROGRAM']._serialized_start=5953 + _globals['_SOLANASYSTEMPROGRAM']._serialized_end=6625 + _globals['_SOLANASYSTEMPROGRAM_INSTRUCTIONTYPE']._serialized_start=6492 + _globals['_SOLANASYSTEMPROGRAM_INSTRUCTIONTYPE']._serialized_end=6610 + _globals['_SOLANASTAKEPROGRAM']._serialized_start=6628 + _globals['_SOLANASTAKEPROGRAM']._serialized_end=7376 + _globals['_SOLANASTAKEPROGRAM_INSTRUCTIONTYPE']._serialized_start=7249 + _globals['_SOLANASTAKEPROGRAM_INSTRUCTIONTYPE']._serialized_end=7361 + _globals['_SOLANASPLMEMOPROGRAM']._serialized_start=7379 + _globals['_SOLANASPLMEMOPROGRAM']._serialized_end=7601 + _globals['_SOLANASPLMEMOPROGRAM_INSTRUCTIONTYPE']._serialized_start=7555 + _globals['_SOLANASPLMEMOPROGRAM_INSTRUCTIONTYPE']._serialized_end=7586 + _globals['_SOLANASPLTOKENPROGRAM']._serialized_start=7604 + _globals['_SOLANASPLTOKENPROGRAM']._serialized_end=8194 + _globals['_SOLANASPLTOKENPROGRAM_INSTRUCTIONTYPE']._serialized_start=8076 + _globals['_SOLANASPLTOKENPROGRAM_INSTRUCTIONTYPE']._serialized_end=8179 + _globals['_SOLANASPLTOKEN2022PROGRAM']._serialized_start=8197 + _globals['_SOLANASPLTOKEN2022PROGRAM']._serialized_end=8431 + _globals['_SOLANASPLTOKEN2022PROGRAM_INSTRUCTIONTYPE']._serialized_start=4806 + _globals['_SOLANASPLTOKEN2022PROGRAM_INSTRUCTIONTYPE']._serialized_end=4836 + _globals['_SOLANASPLASSOCIATEDTOKENACCOUNTPROGRAM']._serialized_start=8434 + _globals['_SOLANASPLASSOCIATEDTOKENACCOUNTPROGRAM']._serialized_end=8694 + _globals['_SOLANASPLASSOCIATEDTOKENACCOUNTPROGRAM_INSTRUCTIONTYPE']._serialized_start=4806 + _globals['_SOLANASPLASSOCIATEDTOKENACCOUNTPROGRAM_INSTRUCTIONTYPE']._serialized_end=4836 + _globals['_SOLANAUNKNOWNINSTRUCTION']._serialized_start=8696 + _globals['_SOLANAUNKNOWNINSTRUCTION']._serialized_end=8736 + _globals['_SOLANAVOTEINITIALIZEINSTRUCTION']._serialized_start=8739 + _globals['_SOLANAVOTEINITIALIZEINSTRUCTION']._serialized_end=8928 + _globals['_SOLANAVOTEVOTEINSTRUCTION']._serialized_start=8931 + _globals['_SOLANAVOTEVOTEINSTRUCTION']._serialized_end=9207 + _globals['_SOLANAVOTEVOTEINSTRUCTION_VOTE']._serialized_start=9125 + _globals['_SOLANAVOTEVOTEINSTRUCTION_VOTE']._serialized_end=9207 + _globals['_SOLANAVOTEWITHDRAWINSTRUCTION']._serialized_start=9209 + _globals['_SOLANAVOTEWITHDRAWINSTRUCTION']._serialized_end=9329 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION']._serialized_start=9332 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION']._serialized_end=9776 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION_LOCKOUT']._serialized_start=9536 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION_LOCKOUT']._serialized_end=9587 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION_VOTESTATEUPDATE']._serialized_start=9590 + _globals['_SOLANAVOTECOMPACTUPDATEVOTESTATEINSTRUCTION_VOTESTATEUPDATE']._serialized_end=9776 + _globals['_SOLANASYSTEMCREATEACCOUNTINSTRUCTION']._serialized_start=9778 + _globals['_SOLANASYSTEMCREATEACCOUNTINSTRUCTION']._serialized_end=9901 + _globals['_SOLANASYSTEMTRANSFERINSTRUCTION']._serialized_start=9903 + _globals['_SOLANASYSTEMTRANSFERINSTRUCTION']._serialized_end=9991 + _globals['_SOLANASYSTEMCREATEACCOUNTWITHSEEDINSTRUCTION']._serialized_start=9994 + _globals['_SOLANASYSTEMCREATEACCOUNTWITHSEEDINSTRUCTION']._serialized_end=10153 + _globals['_SOLANASYSTEMTRANSFERWITHSEEDINSTRUCTION']._serialized_start=10156 + _globals['_SOLANASYSTEMTRANSFERWITHSEEDINSTRUCTION']._serialized_end=10316 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION']._serialized_start=10319 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION']._serialized_end=10683 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION_AUTHORIZED']._serialized_start=10567 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION_AUTHORIZED']._serialized_end=10615 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION_LOCKUP']._serialized_start=10617 + _globals['_SOLANASTAKEINITIALIZEINSTRUCTION_LOCKUP']._serialized_end=10683 + _globals['_SOLANASTAKEDELEGATEINSTRUCTION']._serialized_start=10686 + _globals['_SOLANASTAKEDELEGATEINSTRUCTION']._serialized_end=10870 + _globals['_SOLANASTAKEDEACTIVATEINSTRUCTION']._serialized_start=10872 + _globals['_SOLANASTAKEDEACTIVATEINSTRUCTION']._serialized_end=10976 + _globals['_SOLANASTAKEMERGEINSTRUCTION']._serialized_start=10979 + _globals['_SOLANASTAKEMERGEINSTRUCTION']._serialized_end=11122 + _globals['_SOLANASTAKESPLITINSTRUCTION']._serialized_start=11124 + _globals['_SOLANASTAKESPLITINSTRUCTION']._serialized_end=11246 + _globals['_SOLANASTAKEWITHDRAWINSTRUCTION']._serialized_start=11249 + _globals['_SOLANASTAKEWITHDRAWINSTRUCTION']._serialized_end=11423 + _globals['_SOLANASPLMEMOINSTRUCTION']._serialized_start=11425 + _globals['_SOLANASPLMEMOINSTRUCTION']._serialized_end=11465 + _globals['_SOLANASPLTOKENGETACCOUNTDATASIZEINSTRUCTION']._serialized_start=11467 + _globals['_SOLANASPLTOKENGETACCOUNTDATASIZEINSTRUCTION']._serialized_end=11551 + _globals['_SOLANASPLTOKENINITIALIZEIMMUTABLEOWNERINSTRUCTION']._serialized_start=11553 + _globals['_SOLANASPLTOKENINITIALIZEIMMUTABLEOWNERINSTRUCTION']._serialized_end=11621 + _globals['_SOLANASPLTOKENTRANSFERINSTRUCTION']._serialized_start=11623 + _globals['_SOLANASPLTOKENTRANSFERINSTRUCTION']._serialized_end=11730 + _globals['_SOLANAACCOUNT']._serialized_start=11732 + _globals['_SOLANAACCOUNT']._serialized_end=11801 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2_grpc.py b/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2_grpc.py new file mode 100644 index 00000000..443a7c31 --- /dev/null +++ b/gen/src/python/coinbase/chainstorage/blockchain_solana_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/chainstorage/blockchain_solana_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2.py new file mode 100644 index 00000000..14b3a616 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/account_identifer.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/account_identifer.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n5coinbase/crypto/rosetta/types/account_identifer.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\"\x87\x02\n\x11\x41\x63\x63ountIdentifier\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12H\n\x0bsub_account\x18\x02 \x01(\x0b\x32\x33.coinbase.crypto.rosetta.types.SubAccountIdentifier\x12P\n\x08metadata\x18\x03 \x03(\x0b\x32>.coinbase.crypto.rosetta.types.AccountIdentifier.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\"\xc3\x01\n\x14SubAccountIdentifier\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12S\n\x08metadata\x18\x02 \x03(\x0b\x32\x41.coinbase.crypto.rosetta.types.SubAccountIdentifier.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x42GZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.account_identifer_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_ACCOUNTIDENTIFIER_METADATAENTRY']._loaded_options = None + _globals['_ACCOUNTIDENTIFIER_METADATAENTRY']._serialized_options = b'8\001' + _globals['_SUBACCOUNTIDENTIFIER_METADATAENTRY']._loaded_options = None + _globals['_SUBACCOUNTIDENTIFIER_METADATAENTRY']._serialized_options = b'8\001' + _globals['_ACCOUNTIDENTIFIER']._serialized_start=116 + _globals['_ACCOUNTIDENTIFIER']._serialized_end=379 + _globals['_ACCOUNTIDENTIFIER_METADATAENTRY']._serialized_start=310 + _globals['_ACCOUNTIDENTIFIER_METADATAENTRY']._serialized_end=379 + _globals['_SUBACCOUNTIDENTIFIER']._serialized_start=382 + _globals['_SUBACCOUNTIDENTIFIER']._serialized_end=577 + _globals['_SUBACCOUNTIDENTIFIER_METADATAENTRY']._serialized_start=310 + _globals['_SUBACCOUNTIDENTIFIER_METADATAENTRY']._serialized_end=379 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2_grpc.py new file mode 100644 index 00000000..c9e38c21 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/account_identifer_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/account_identifer_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2.py new file mode 100644 index 00000000..adfbb1e8 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/amount.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/amount.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*coinbase/crypto/rosetta/types/amount.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\"\xe0\x01\n\x06\x41mount\x12\r\n\x05value\x18\x01 \x01(\t\x12\x39\n\x08\x63urrency\x18\x02 \x01(\x0b\x32\'.coinbase.crypto.rosetta.types.Currency\x12\x45\n\x08metadata\x18\x03 \x03(\x0b\x32\x33.coinbase.crypto.rosetta.types.Amount.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\"\xbc\x01\n\x08\x43urrency\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x02 \x01(\x05\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.coinbase.crypto.rosetta.types.Currency.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x42GZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.amount_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_AMOUNT_METADATAENTRY']._loaded_options = None + _globals['_AMOUNT_METADATAENTRY']._serialized_options = b'8\001' + _globals['_CURRENCY_METADATAENTRY']._loaded_options = None + _globals['_CURRENCY_METADATAENTRY']._serialized_options = b'8\001' + _globals['_AMOUNT']._serialized_start=105 + _globals['_AMOUNT']._serialized_end=329 + _globals['_AMOUNT_METADATAENTRY']._serialized_start=260 + _globals['_AMOUNT_METADATAENTRY']._serialized_end=329 + _globals['_CURRENCY']._serialized_start=332 + _globals['_CURRENCY']._serialized_end=520 + _globals['_CURRENCY_METADATAENTRY']._serialized_start=260 + _globals['_CURRENCY_METADATAENTRY']._serialized_end=329 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2_grpc.py new file mode 100644 index 00000000..f1de77ac --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/amount_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/amount_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/block_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/block_pb2.py new file mode 100644 index 00000000..eeeed721 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/block_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/block.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/block.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from coinbase.crypto.rosetta.types import transaction_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_transaction__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)coinbase/crypto/rosetta/types/block.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a/coinbase/crypto/rosetta/types/transaction.proto\"\xba\x03\n\x05\x42lock\x12H\n\x10\x62lock_identifier\x18\x02 \x01(\x0b\x32..coinbase.crypto.rosetta.types.BlockIdentifier\x12O\n\x17parent_block_identifier\x18\x03 \x01(\x0b\x32..coinbase.crypto.rosetta.types.BlockIdentifier\x12-\n\ttimestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x0ctransactions\x18\x05 \x03(\x0b\x32*.coinbase.crypto.rosetta.types.Transaction\x12\x44\n\x08metadata\x18\x06 \x03(\x0b\x32\x32.coinbase.crypto.rosetta.types.Block.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01J\x04\x08\x01\x10\x02R\x12network_identifier\".\n\x0f\x42lockIdentifier\x12\r\n\x05index\x18\x01 \x01(\x03\x12\x0c\n\x04hash\x18\x02 \x01(\tBGZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.block_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_BLOCK_METADATAENTRY']._loaded_options = None + _globals['_BLOCK_METADATAENTRY']._serialized_options = b'8\001' + _globals['_BLOCK']._serialized_start=186 + _globals['_BLOCK']._serialized_end=628 + _globals['_BLOCK_METADATAENTRY']._serialized_start=533 + _globals['_BLOCK_METADATAENTRY']._serialized_end=602 + _globals['_BLOCKIDENTIFIER']._serialized_start=630 + _globals['_BLOCKIDENTIFIER']._serialized_end=676 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/block_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/block_pb2_grpc.py new file mode 100644 index 00000000..59b58d18 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/block_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/block_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2.py new file mode 100644 index 00000000..6a595fe1 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/coin_change.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/coin_change.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/coinbase/crypto/rosetta/types/coin_change.proto\x12\x1d\x63oinbase.crypto.rosetta.types\"\xec\x01\n\nCoinChange\x12\x46\n\x0f\x63oin_identifier\x18\x01 \x01(\x0b\x32-.coinbase.crypto.rosetta.types.CoinIdentifier\x12I\n\x0b\x63oin_action\x18\x02 \x01(\x0e\x32\x34.coinbase.crypto.rosetta.types.CoinChange.CoinAction\"K\n\nCoinAction\x12\x1b\n\x17\x43OIN_ACTION_UNSPECIFIED\x10\x00\x12\x10\n\x0c\x43OIN_CREATED\x10\x01\x12\x0e\n\nCOIN_SPENT\x10\x02\"$\n\x0e\x43oinIdentifier\x12\x12\n\nidentifier\x18\x01 \x01(\tBGZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.coin_change_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_COINCHANGE']._serialized_start=83 + _globals['_COINCHANGE']._serialized_end=319 + _globals['_COINCHANGE_COINACTION']._serialized_start=244 + _globals['_COINCHANGE_COINACTION']._serialized_end=319 + _globals['_COINIDENTIFIER']._serialized_start=321 + _globals['_COINIDENTIFIER']._serialized_end=357 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2_grpc.py new file mode 100644 index 00000000..203a5ffa --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/coin_change_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/coin_change_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2.py new file mode 100644 index 00000000..736cf3b6 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/network_identifier.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/network_identifier.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n6coinbase/crypto/rosetta/types/network_identifier.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\"\x8d\x01\n\x11NetworkIdentifier\x12\x12\n\nblockchain\x18\x01 \x01(\t\x12\x0f\n\x07network\x18\x02 \x01(\t\x12S\n\x16sub_network_identifier\x18\x03 \x01(\x0b\x32\x33.coinbase.crypto.rosetta.types.SubNetworkIdentifier\"\xc3\x01\n\x14SubNetworkIdentifier\x12\x0f\n\x07network\x18\x01 \x01(\t\x12S\n\x08metadata\x18\x02 \x03(\x0b\x32\x41.coinbase.crypto.rosetta.types.SubNetworkIdentifier.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x42GZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.network_identifier_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_SUBNETWORKIDENTIFIER_METADATAENTRY']._loaded_options = None + _globals['_SUBNETWORKIDENTIFIER_METADATAENTRY']._serialized_options = b'8\001' + _globals['_NETWORKIDENTIFIER']._serialized_start=117 + _globals['_NETWORKIDENTIFIER']._serialized_end=258 + _globals['_SUBNETWORKIDENTIFIER']._serialized_start=261 + _globals['_SUBNETWORKIDENTIFIER']._serialized_end=456 + _globals['_SUBNETWORKIDENTIFIER_METADATAENTRY']._serialized_start=387 + _globals['_SUBNETWORKIDENTIFIER_METADATAENTRY']._serialized_end=456 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2_grpc.py new file mode 100644 index 00000000..60bbd298 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/network_identifier_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/network_identifier_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2.py new file mode 100644 index 00000000..2834ca44 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/operation.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/operation.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from coinbase.crypto.rosetta.types import account_identifer_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_account__identifer__pb2 +from coinbase.crypto.rosetta.types import amount_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_amount__pb2 +from coinbase.crypto.rosetta.types import coin_change_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_coin__change__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-coinbase/crypto/rosetta/types/operation.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\x1a\x35\x63oinbase/crypto/rosetta/types/account_identifer.proto\x1a*coinbase/crypto/rosetta/types/amount.proto\x1a/coinbase/crypto/rosetta/types/coin_change.proto\"\x96\x04\n\tOperation\x12P\n\x14operation_identifier\x18\x01 \x01(\x0b\x32\x32.coinbase.crypto.rosetta.types.OperationIdentifier\x12N\n\x12related_operations\x18\x02 \x03(\x0b\x32\x32.coinbase.crypto.rosetta.types.OperationIdentifier\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x41\n\x07\x61\x63\x63ount\x18\x05 \x01(\x0b\x32\x30.coinbase.crypto.rosetta.types.AccountIdentifier\x12\x35\n\x06\x61mount\x18\x06 \x01(\x0b\x32%.coinbase.crypto.rosetta.types.Amount\x12>\n\x0b\x63oin_change\x18\x07 \x01(\x0b\x32).coinbase.crypto.rosetta.types.CoinChange\x12H\n\x08metadata\x18\x08 \x03(\x0b\x32\x36.coinbase.crypto.rosetta.types.Operation.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\";\n\x13OperationIdentifier\x12\r\n\x05index\x18\x01 \x01(\x03\x12\x15\n\rnetwork_index\x18\x02 \x01(\x03\x42GZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.operation_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_OPERATION_METADATAENTRY']._loaded_options = None + _globals['_OPERATION_METADATAENTRY']._serialized_options = b'8\001' + _globals['_OPERATION']._serialized_start=256 + _globals['_OPERATION']._serialized_end=790 + _globals['_OPERATION_METADATAENTRY']._serialized_start=721 + _globals['_OPERATION_METADATAENTRY']._serialized_end=790 + _globals['_OPERATIONIDENTIFIER']._serialized_start=792 + _globals['_OPERATIONIDENTIFIER']._serialized_end=851 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2_grpc.py new file mode 100644 index 00000000..4318eee7 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/operation_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/operation_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2.py b/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2.py new file mode 100644 index 00000000..1d3fe1ca --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: coinbase/crypto/rosetta/types/transaction.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'coinbase/crypto/rosetta/types/transaction.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from coinbase.crypto.rosetta.types import operation_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_operation__pb2 +from coinbase.crypto.rosetta.types import network_identifier_pb2 as coinbase_dot_crypto_dot_rosetta_dot_types_dot_network__identifier__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/coinbase/crypto/rosetta/types/transaction.proto\x12\x1d\x63oinbase.crypto.rosetta.types\x1a\x19google/protobuf/any.proto\x1a-coinbase/crypto/rosetta/types/operation.proto\x1a\x36\x63oinbase/crypto/rosetta/types/network_identifier.proto\"\x85\x03\n\x0bTransaction\x12T\n\x16transaction_identifier\x18\x01 \x01(\x0b\x32\x34.coinbase.crypto.rosetta.types.TransactionIdentifier\x12<\n\noperations\x18\x02 \x03(\x0b\x32(.coinbase.crypto.rosetta.types.Operation\x12O\n\x14related_transactions\x18\x03 \x03(\x0b\x32\x31.coinbase.crypto.rosetta.types.RelatedTransaction\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.coinbase.crypto.rosetta.types.Transaction.MetadataEntry\x1a\x45\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\"%\n\x15TransactionIdentifier\x12\x0c\n\x04hash\x18\x01 \x01(\t\"\xcb\x02\n\x12RelatedTransaction\x12L\n\x12network_identifier\x18\x01 \x01(\x0b\x32\x30.coinbase.crypto.rosetta.types.NetworkIdentifier\x12T\n\x16transaction_identifier\x18\x02 \x01(\x0b\x32\x34.coinbase.crypto.rosetta.types.TransactionIdentifier\x12N\n\tdirection\x18\x03 \x01(\x0e\x32;.coinbase.crypto.rosetta.types.RelatedTransaction.Direction\"A\n\tDirection\x12\x19\n\x15\x44IRECTION_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46ORWARD\x10\x01\x12\x0c\n\x08\x42\x41\x43KWARD\x10\x02\x42GZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/typesb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coinbase.crypto.rosetta.types.transaction_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/coinbase/chainstorage/protos/coinbase/crypto/rosetta/types' + _globals['_TRANSACTION_METADATAENTRY']._loaded_options = None + _globals['_TRANSACTION_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TRANSACTION']._serialized_start=213 + _globals['_TRANSACTION']._serialized_end=602 + _globals['_TRANSACTION_METADATAENTRY']._serialized_start=533 + _globals['_TRANSACTION_METADATAENTRY']._serialized_end=602 + _globals['_TRANSACTIONIDENTIFIER']._serialized_start=604 + _globals['_TRANSACTIONIDENTIFIER']._serialized_end=641 + _globals['_RELATEDTRANSACTION']._serialized_start=644 + _globals['_RELATEDTRANSACTION']._serialized_end=975 + _globals['_RELATEDTRANSACTION_DIRECTION']._serialized_start=910 + _globals['_RELATEDTRANSACTION_DIRECTION']._serialized_end=975 +# @@protoc_insertion_point(module_scope) diff --git a/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2_grpc.py b/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2_grpc.py new file mode 100644 index 00000000..affdefa0 --- /dev/null +++ b/gen/src/python/coinbase/crypto/rosetta/types/transaction_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in coinbase/crypto/rosetta/types/transaction_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/go.mod b/go.mod index 3b728fc2..e1ad2265 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,20 @@ module github.com/coinbase/chainstorage -go 1.22.0 +go 1.23.0 + +toolchain go1.23.9 require ( cloud.google.com/go/firestore v1.14.0 cloud.google.com/go/storage v1.37.0 github.com/VividCortex/ewma v1.2.0 - github.com/aws/aws-sdk-go v1.50.4 + github.com/aws/aws-sdk-go v1.55.7 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.2.1 - github.com/coinbase/rosetta-sdk-go v0.8.3 + github.com/coinbase/rosetta-sdk-go v0.8.9 github.com/coinbase/rosetta-sdk-go/types v1.0.0 - github.com/ethereum/go-ethereum v1.13.11 + github.com/ethereum/go-ethereum v1.13.15 github.com/fatih/color v1.16.0 github.com/gagliardetto/solana-go v1.8.4 github.com/go-playground/validator/v10 v10.17.0 @@ -41,15 +43,15 @@ require ( go.uber.org/fx v1.20.1 go.uber.org/mock v0.4.0 go.uber.org/zap v1.26.0 - golang.org/x/crypto v0.32.0 + golang.org/x/crypto v0.35.0 golang.org/x/exp v0.0.0-20240119083558-1b970713d09a golang.org/x/net v0.34.0 - golang.org/x/sync v0.10.0 - golang.org/x/text v0.21.0 + golang.org/x/sync v0.11.0 + golang.org/x/text v0.22.0 golang.org/x/time v0.5.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 google.golang.org/api v0.158.0 - google.golang.org/grpc v1.61.0 + google.golang.org/grpc v1.61.2 google.golang.org/protobuf v1.34.2 gopkg.in/DataDog/dd-trace-go.v1 v1.59.1 gopkg.in/yaml.v2 v2.4.0 @@ -59,8 +61,7 @@ require ( require ( cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/longrunning v0.5.4 // indirect contrib.go.opencensus.io/exporter/stackdriver v0.13.4 // indirect @@ -77,7 +78,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.17.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd // indirect + github.com/btcsuite/btcd v0.24.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -109,18 +110,18 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect - github.com/holiman/uint256 v1.3.2 // indirect + github.com/holiman/uint256 v1.3.2 github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/compress v1.17.11 github.com/leodido/go-urn v1.2.4 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -133,7 +134,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mr-tron/base58 v1.2.0 github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect @@ -142,7 +143,7 @@ require ( github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_golang v1.14.0 github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect @@ -182,10 +183,9 @@ require ( go.uber.org/multierr v1.11.0 // indirect go4.org/intern v0.0.0-20230525184215-6c62f75575cb // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect - golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - google.golang.org/appengine v1.6.8 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect @@ -198,3 +198,5 @@ require ( replace github.com/gogo/protobuf v1.3.3 => github.com/gogo/protobuf v1.3.2 replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101500.0 + +replace github.com/coinbase/rosetta-sdk-go => github.com/coinbase/mesh-sdk-go v0.8.9 diff --git a/go.sum b/go.sum index 4246d1c3..0eebd32c 100644 --- a/go.sum +++ b/go.sum @@ -15,10 +15,8 @@ cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnP cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -89,8 +87,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.29.5/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= -github.com/aws/aws-sdk-go v1.50.4 h1:jJNhxunBgfjmCSjMZ3INwQ19ZN3RoGEZfgSCUYF/NZw= -github.com/aws/aws-sdk-go v1.50.4/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -106,8 +104,9 @@ github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHf github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd h1:js1gPwhcFflTZ7Nzl7WHaOTlTr5hIrR4n1NM4v9n4Kw= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= @@ -150,8 +149,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coinbase/rosetta-sdk-go v0.8.3 h1:IYqd+Ser5NVh0s7p8p2Ir82iCvi75E1l0NH2H4NEr0Y= -github.com/coinbase/rosetta-sdk-go v0.8.3/go.mod h1:ChOHc+BNq7zqJDDkui0DA124GOvlAiRbdgAc1U9GMDQ= +github.com/coinbase/mesh-sdk-go v0.8.9 h1:4paJktpDY7e5ghWSnSa5QHOXDdKTSlSwDZzbm1JT2tI= +github.com/coinbase/mesh-sdk-go v0.8.9/go.mod h1:xIu+9M4EN/WkAy/H67lP8iu+/Fy3Wbyihmv8L+XacWM= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= @@ -345,8 +344,8 @@ github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -799,8 +798,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -881,8 +880,8 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -895,8 +894,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -955,14 +954,14 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -974,8 +973,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1053,8 +1052,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1102,8 +1099,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.61.2 h1:TzJay21lXCf7BiNFKl7mSskt5DlkKAumAYTs52SpJeo= +google.golang.org/grpc v1.61.2/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/internal/aws/config.go b/internal/aws/config.go index 9f69120f..27a71566 100644 --- a/internal/aws/config.go +++ b/internal/aws/config.go @@ -23,7 +23,8 @@ func NewConfig(params ConfigParams) *aws.Config { if params.Config.AWS.IsLocalStack { cfg.Credentials = credentials.NewStaticCredentials("THESE", "ARE", "IGNORED") cfg.S3ForcePathStyle = aws.Bool(true) - cfg.Endpoint = aws.String("http://localhost:4566") + // TODO, how to dynamically set the endpoint? + cfg.Endpoint = aws.String("http://localstack:4566") } return cfg } diff --git a/internal/blockchain/client/ethereum/ethereum.go b/internal/blockchain/client/ethereum/ethereum.go index 2afe1d7e..5a07043f 100644 --- a/internal/blockchain/client/ethereum/ethereum.go +++ b/internal/blockchain/client/ethereum/ethereum.go @@ -34,6 +34,7 @@ type ( config *config.Config logger *zap.Logger client jsonrpc.Client + tracer EthereumBlockTracer dlq dlq.DLQ validate *validator.Validate metrics *ethereumClientMetrics @@ -42,6 +43,10 @@ type ( commitmentLevel types.CommitmentLevel } + EthereumBlockTracer interface { + getBlockTraces(ctx context.Context, tag uint32, block *ethereum.EthereumBlockLit) ([][]byte, error) + } + EthereumClientOption func(client *EthereumClient) ethereumClientMetrics struct { @@ -490,8 +495,13 @@ func (c *EthereumClient) getBlockFromHeader(ctx context.Context, tag uint32, hea if err != nil { return nil, xerrors.Errorf("failed to fetch transaction receipts for block %v: %w", height, err) } - - transactionTraces, err := c.getBlockTraces(ctx, tag, headerResult.header) + var tracer EthereumBlockTracer + if c.tracer != nil { + tracer = c.tracer + } else { + tracer = c + } + transactionTraces, err := tracer.getBlockTraces(ctx, tag, headerResult.header) if err != nil { return nil, xerrors.Errorf("failed to fetch traces for block %v: %w", height, err) } @@ -1234,8 +1244,13 @@ func (c *EthereumClient) UpgradeBlock(ctx context.Context, block *api.Block, new if err != nil { return nil, xerrors.Errorf("failed to fetch header result for block %v: %w", height, err) } - - transactionTraces, err := c.getBlockTraces(ctx, newTag, headerResult.header) + var tracer EthereumBlockTracer + if c.tracer != nil { + tracer = c.tracer + } else { + tracer = c + } + transactionTraces, err := tracer.getBlockTraces(ctx, newTag, headerResult.header) if err != nil { return nil, xerrors.Errorf("failed to fetch traces for block %v: %w", height, err) } diff --git a/internal/blockchain/client/ethereum/module.go b/internal/blockchain/client/ethereum/module.go index 2c1d65e6..f75e7f61 100644 --- a/internal/blockchain/client/ethereum/module.go +++ b/internal/blockchain/client/ethereum/module.go @@ -39,5 +39,13 @@ var Module = fx.Options( Name: "polygon", Target: NewPolygonClientFactory, }), + fx.Provide(fx.Annotated{ + Name: "tron", + Target: NewTronClientFactory, + }), + fx.Provide(fx.Annotated{ + Name: "story", + Target: NewStoryClientFactory, + }), beacon.Module, ) diff --git a/internal/blockchain/client/ethereum/story.go b/internal/blockchain/client/ethereum/story.go new file mode 100644 index 00000000..df4eb6ae --- /dev/null +++ b/internal/blockchain/client/ethereum/story.go @@ -0,0 +1,10 @@ +package ethereum + +import ( + "github.com/coinbase/chainstorage/internal/blockchain/client/internal" +) + +func NewStoryClientFactory(params internal.JsonrpcClientParams) internal.ClientFactory { + // Story shares the same data schema as Ethereum since it is an EVM chain. + return NewEthereumClientFactory(params) +} diff --git a/internal/blockchain/client/ethereum/story_test.go b/internal/blockchain/client/ethereum/story_test.go new file mode 100644 index 00000000..59dd7210 --- /dev/null +++ b/internal/blockchain/client/ethereum/story_test.go @@ -0,0 +1 @@ +package ethereum diff --git a/internal/blockchain/client/ethereum/tron.go b/internal/blockchain/client/ethereum/tron.go new file mode 100644 index 00000000..17fcbab7 --- /dev/null +++ b/internal/blockchain/client/ethereum/tron.go @@ -0,0 +1,138 @@ +package ethereum + +import ( + "context" + "encoding/json" + "net/http" + "time" + + "github.com/go-playground/validator/v10" + "go.uber.org/fx" + "golang.org/x/xerrors" + + "github.com/coinbase/chainstorage/internal/blockchain/client/internal" + "github.com/coinbase/chainstorage/internal/blockchain/jsonrpc" + "github.com/coinbase/chainstorage/internal/blockchain/parser/ethereum" + "github.com/coinbase/chainstorage/internal/blockchain/parser/ethereum/types" + "github.com/coinbase/chainstorage/internal/blockchain/restapi" + "github.com/coinbase/chainstorage/internal/dlq" + "github.com/coinbase/chainstorage/internal/utils/fxparams" + "github.com/coinbase/chainstorage/internal/utils/log" +) + +type ( + TronClient struct { + *EthereumClient + additionalClient restapi.Client + } + + TronClientParams struct { + fx.In + fxparams.Params + MasterClient jsonrpc.Client `name:"master"` + SlaveClient jsonrpc.Client `name:"slave"` + ValidatorClient jsonrpc.Client `name:"validator"` + ConsensusClient jsonrpc.Client `name:"consensus"` + AdditionalClient restapi.Client `name:"additional"` + DLQ dlq.DLQ + } + + tronApiClientFactory struct { + masterClient jsonrpc.Client + slaveClient jsonrpc.Client + validatorClient jsonrpc.Client + consensusClient jsonrpc.Client + clientFactory TronApiClientFactoryFn + } + + TronApiClientFactoryFn func(client jsonrpc.Client) internal.Client +) + +type TronBlockTxInfoRequestData struct { + Num uint64 `json:"num"` +} + +var tronTxInfoMethod = &restapi.RequestMethod{ + Name: "GetTransactionInfoByBlockNum", + ParamsPath: "/wallet/gettransactioninfobyblocknum", // No parameter URls + Timeout: 6 * time.Second, + HTTPMethod: http.MethodPost, +} + +func NewTronApiClientFactory(params TronClientParams, clientFactory TronApiClientFactoryFn) internal.ClientFactory { + return &tronApiClientFactory{ + masterClient: params.MasterClient, + slaveClient: params.SlaveClient, + validatorClient: params.ValidatorClient, + consensusClient: params.ConsensusClient, + clientFactory: clientFactory, + } +} + +func (f *tronApiClientFactory) Master() internal.Client { + return f.clientFactory(f.masterClient) +} + +func (f *tronApiClientFactory) Slave() internal.Client { + return f.clientFactory(f.slaveClient) + +} + +func (f *tronApiClientFactory) Validator() internal.Client { + return f.clientFactory(f.validatorClient) + +} + +func (f *tronApiClientFactory) Consensus() internal.Client { + return f.clientFactory(f.consensusClient) +} + +// Tron shares the same data schema as Ethereum since it is an EVM chain, but we retrive trace from another restapi Client which independent from the main jsonrpc client. +// So it need to create a new factory for TronClient and set the additionalClient to the restapi client. +func NewTronClientFactory(params TronClientParams) internal.ClientFactory { + return NewTronApiClientFactory(params, func(client jsonrpc.Client) internal.Client { + logger := log.WithPackage(params.Logger) + ethClient := &EthereumClient{ + config: params.Config, + logger: logger, + client: client, + dlq: params.DLQ, + validate: validator.New(), + metrics: newEthereumClientMetrics(params.Metrics), + nodeType: types.EthereumNodeType_ARCHIVAL, + traceType: types.TraceType_GETH, + commitmentLevel: types.CommitmentLevelLatest, + } + result := &TronClient{ + EthereumClient: ethClient, + additionalClient: params.AdditionalClient, + } + result.tracer = result + return result + }) +} + +func (c *TronClient) getBlockTraces(ctx context.Context, tag uint32, block *ethereum.EthereumBlockLit) ([][]byte, error) { + blockNumber := block.Number.Value() + + requestData := TronBlockTxInfoRequestData{ + Num: blockNumber, + } + postData, err := json.Marshal(requestData) + if err != nil { + return nil, xerrors.Errorf("failed to Marshal Tron requestData: %w", err) + } + response, err := c.additionalClient.Call(ctx, tronTxInfoMethod, postData) + if err != nil { + return nil, xerrors.Errorf("failed to get Tron TransactionInfo: %w", err) + } + var tmpResults []json.RawMessage + if err := json.Unmarshal(response, &tmpResults); err != nil { + return nil, xerrors.Errorf("failed to unmarshal TronTxInfo: %w", err) + } + results := make([][]byte, len(tmpResults)) + for i, trace := range tmpResults { + results[i] = trace + } + return results, nil +} diff --git a/internal/blockchain/client/ethereum/tron_test.go b/internal/blockchain/client/ethereum/tron_test.go new file mode 100644 index 00000000..52fbba32 --- /dev/null +++ b/internal/blockchain/client/ethereum/tron_test.go @@ -0,0 +1,218 @@ +package ethereum + +import ( + "context" + "encoding/json" + "testing" + + "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/mock/gomock" + + "github.com/coinbase/chainstorage/internal/blockchain/client/internal" + "github.com/coinbase/chainstorage/internal/blockchain/jsonrpc" + jsonrpcmocks "github.com/coinbase/chainstorage/internal/blockchain/jsonrpc/mocks" + "github.com/coinbase/chainstorage/internal/blockchain/parser" + "github.com/coinbase/chainstorage/internal/blockchain/restapi" + restapimocks "github.com/coinbase/chainstorage/internal/blockchain/restapi/mocks" + "github.com/coinbase/chainstorage/internal/dlq" + "github.com/coinbase/chainstorage/internal/utils/testapp" + "github.com/coinbase/chainstorage/internal/utils/testutil" + "github.com/coinbase/chainstorage/protos/coinbase/c3/common" +) + +type ( + tronClientTestSuite struct { + suite.Suite + + ctrl *gomock.Controller + app testapp.TestApp + rpcClient *jsonrpcmocks.MockClient + restClient *restapimocks.MockClient + client internal.Client + } +) + +const ( + tronTestTag = uint32(2) + // tronTestHeight = uint64(10000) + tronTestHeight = ethereumHeight + fixtureBlockTxInfoResponse = ` + [ + { + "blockNumber": 11322000, + "contractResult": [ + "" + ], + "blockTimeStamp": 1725466323000, + "receipt": { + "net_usage": 268 + }, + "id": "0xbaa42c87b7c764c548fa37e61e9764415fd4a79d7e073d4f92a456698002016b" + }, + { + "id": "0xf5365847bff6e48d0c6bc23eee276343d2987efd9876c3c1bf597225e3d69991", + "blockNumber": 11322000, + "internal_transactions": [ + { + "hash": "27b42aff06882822a0c84211121e5f98c06a9b074ee84a085c998397b8b2da3a", + "caller_address": "4158baea0b354f7b333b3b1563c849e979ae4e2002", + "transferTo_address": "41eed9e56a5cddaa15ef0c42984884a8afcf1bdebb", + "callValueInfo": [ + {} + ], + "note": "63616c6c" + }, + { + "hash": "3e2b8ca208f6c899afdc74b772a4504cdd6704bbeff6d34045351c9ad83f478d", + "caller_address": "4158baea0b354f7b333b3b1563c849e979ae4e2002", + "transferTo_address": "41f5a6eae2fb24b0bda6288e346982fc14e094c19a", + "callValueInfo": [ + { + "callValue": 405000000 + } + ], + "note": "63616c6c" + } + ] + } + ] + ` +) + +func TestTronClientTestSuite(t *testing.T) { + suite.Run(t, new(tronClientTestSuite)) +} + +func (s *tronClientTestSuite) SetupTest() { + s.ctrl = gomock.NewController(s.T()) + s.rpcClient = jsonrpcmocks.NewMockClient(s.ctrl) + s.restClient = restapimocks.NewMockClient(s.ctrl) + + var result internal.ClientParams + s.app = testapp.New( + s.T(), + testapp.WithBlockchainNetwork(common.Blockchain_BLOCKCHAIN_TRON, common.Network_NETWORK_TRON_MAINNET), + Module, + // jsonrpc.Module, + // restapi.Module, + testTronApiModule(s.rpcClient, s.restClient), + fx.Populate(&result), + ) + + s.client = result.Master + s.NotNil(s.client) +} + +func (s *tronClientTestSuite) TearDownTest() { + s.app.Close() + s.ctrl.Finish() +} + +func testTronApiModule(rpcClient *jsonrpcmocks.MockClient, restClient *restapimocks.MockClient) fx.Option { + return fx.Options( + internal.Module, + fx.Provide(fx.Annotated{ + Name: "master", + Target: func() jsonrpc.Client { return rpcClient }, + }), + fx.Provide(fx.Annotated{ + Name: "slave", + Target: func() jsonrpc.Client { return rpcClient }, + }), + fx.Provide(fx.Annotated{ + Name: "validator", + Target: func() jsonrpc.Client { return rpcClient }, + }), + fx.Provide(fx.Annotated{ + Name: "consensus", + Target: func() jsonrpc.Client { return rpcClient }, + }), + fx.Provide(fx.Annotated{ + Name: "additional", + Target: func() restapi.Client { return restClient }, + }), + fx.Provide(dlq.NewNop), + fx.Provide(parser.NewNop), + ) +} + +func (s *tronClientTestSuite) TestTronClient_New() { + require := testutil.Require(s.T()) + + var tronClientResult TronClientParams + var clientResutl internal.ClientParams + app := testapp.New( + s.T(), + Module, + internal.Module, + jsonrpc.Module, + restapi.Module, + testapp.WithBlockchainNetwork(common.Blockchain_BLOCKCHAIN_TRON, common.Network_NETWORK_TRON_MAINNET), + fx.Provide(dlq.NewNop), + fx.Provide(parser.NewNop), + fx.Populate(&tronClientResult), + fx.Populate(&clientResutl), + ) + defer app.Close() + + require.NotNil(s.client) + require.NotNil(tronClientResult.AdditionalClient) + s.NotNil(clientResutl.Master) + s.NotNil(clientResutl.Slave) + s.NotNil(clientResutl.Validator) + s.NotNil(clientResutl.Consensus) +} + +func (s *tronClientTestSuite) TestTronClient_GetBlockByHeight() { + require := testutil.Require(s.T()) + // mock block jsonrpc request -------------------- + blockResponse := &jsonrpc.Response{ + Result: json.RawMessage(fixtureBlock), + } + s.rpcClient.EXPECT().Call( + gomock.Any(), ethGetBlockByNumberMethod, jsonrpc.Params{ + "0xacc290", + true, + }, + ).Return(blockResponse, nil) + // mock TxReceipt jsonrpc request -------------------- + receiptResponse := []*jsonrpc.Response{ + {Result: json.RawMessage(fixtureReceipt)}, + {Result: json.RawMessage(fixtureReceipt)}, + } + s.rpcClient.EXPECT().BatchCall( + gomock.Any(), ethGetTransactionReceiptMethod, gomock.Any(), + ).Return(receiptResponse, nil) + + // mock BlockTxInfo restapi request -------------------- + blockTxInfoPostData := TronBlockTxInfoRequestData{Num: ethereumHeight} + postData, _ := json.Marshal(blockTxInfoPostData) + txr := json.RawMessage(fixtureBlockTxInfoResponse) + s.restClient.EXPECT().Call(gomock.Any(), tronTxInfoMethod, postData).Return(txr, nil) + + block, err := s.client.GetBlockByHeight(context.Background(), tronTestTag, tronTestHeight) + require.NoError(err) + require.Equal(common.Blockchain_BLOCKCHAIN_TRON, block.Blockchain) + require.Equal(common.Network_NETWORK_TRON_MAINNET, block.Network) + + metadata := block.Metadata + require.NotNil(metadata) + require.Equal(ethereumHash, metadata.Hash) + require.Equal(ethereumParentHash, metadata.ParentHash) + require.Equal(ethereumHeight, metadata.Height) + require.Equal(ethereumParentHeight, metadata.ParentHeight) + require.Equal(tronTestTag, metadata.Tag) + + blobdata := block.GetEthereum() + require.NotNil(blobdata) + require.NotNil(blobdata.Header) + require.Equal(2, len(blobdata.TransactionReceipts)) + require.NotNil(blobdata.TransactionTraces) + require.Equal(2, len(blobdata.TransactionTraces)) + require.NotNil(blobdata.TransactionTraces[0]) + require.NotNil(blobdata.TransactionTraces[1]) + require.Nil(blobdata.Uncles) +} + +// TODO: add test case for TronClient.getBlockTraces diff --git a/internal/blockchain/client/internal/client.go b/internal/blockchain/client/internal/client.go index 4a0d9c19..f0586054 100644 --- a/internal/blockchain/client/internal/client.go +++ b/internal/blockchain/client/internal/client.go @@ -70,6 +70,8 @@ type ( EthereumBeacon ClientFactory `name:"ethereum/beacon" optional:"true"` CosmosStaking ClientFactory `name:"cosmos/staking" optional:"true"` CardanoStaking ClientFactory `name:"cardano/staking" optional:"true"` + Tron ClientFactory `name:"tron" optional:"true"` + Story ClientFactory `name:"story" optional:"true"` } ClientParams struct { @@ -111,7 +113,7 @@ func NewClient(params Params) (Result, error) { sidechain := params.Config.Chain.Sidechain if sidechain == api.SideChain_SIDECHAIN_NONE { switch blockchain { - case common.Blockchain_BLOCKCHAIN_BITCOIN: + case common.Blockchain_BLOCKCHAIN_BITCOIN, common.Blockchain_BLOCKCHAIN_BITCOINCASH, common.Blockchain_BLOCKCHAIN_LITECOIN: factory = params.Bitcoin case common.Blockchain_BLOCKCHAIN_BSC: factory = params.Bsc @@ -133,6 +135,10 @@ func NewClient(params Params) (Result, error) { factory = params.Base case common.Blockchain_BLOCKCHAIN_APTOS: factory = params.Aptos + case common.Blockchain_BLOCKCHAIN_TRON: + factory = params.Tron + case common.Blockchain_BLOCKCHAIN_STORY: + factory = params.Story default: if params.Config.IsRosetta() { factory = params.Rosetta diff --git a/internal/blockchain/endpoints/endpoint_provider.go b/internal/blockchain/endpoints/endpoint_provider.go index cc8abe24..740ce485 100644 --- a/internal/blockchain/endpoints/endpoint_provider.go +++ b/internal/blockchain/endpoints/endpoint_provider.go @@ -50,10 +50,11 @@ type ( EndpointProviderResult struct { fx.Out - Master EndpointProvider `name:"master"` - Slave EndpointProvider `name:"slave"` - Validator EndpointProvider `name:"validator"` - Consensus EndpointProvider `name:"consensus"` + Master EndpointProvider `name:"master"` + Slave EndpointProvider `name:"slave"` + Validator EndpointProvider `name:"validator"` + Consensus EndpointProvider `name:"consensus"` + Additional EndpointProvider `name:"additional"` } ) @@ -73,11 +74,12 @@ type ( ) const ( - masterEndpointGroupName = "master" - slaveEndpointGroupName = "slave" - validatorEndpointGroupName = "validator" - consensusEndpointGroupName = "consensus" - contextKeyFailover = "failover:" + masterEndpointGroupName = "master" + slaveEndpointGroupName = "slave" + validatorEndpointGroupName = "validator" + consensusEndpointGroupName = "consensus" + contextKeyFailover = "failover:" + additionalEndpointGroupName = "additional" ) var ( @@ -116,12 +118,16 @@ func NewEndpointProvider(params EndpointProviderParams) (EndpointProviderResult, return EndpointProviderResult{}, xerrors.Errorf("failed to create consensus endpoint provider with slave endpoints: %w", err) } } - + additional, err := newEndpointProvider(logger, params.Config, scope, ¶ms.Config.Chain.Client.Additional.EndpointGroup, additionalEndpointGroupName) + if err != nil { + return EndpointProviderResult{}, xerrors.Errorf("failed to create additional endpoint provider: %w", err) + } return EndpointProviderResult{ - Master: master, - Slave: slave, - Validator: validator, - Consensus: consensus, + Master: master, + Slave: slave, + Validator: validator, + Consensus: consensus, + Additional: additional, }, nil } diff --git a/internal/blockchain/parser/bitcoin/bitcoin_native.go b/internal/blockchain/parser/bitcoin/bitcoin_native.go index 7ec6d911..ec2d77f2 100644 --- a/internal/blockchain/parser/bitcoin/bitcoin_native.go +++ b/internal/blockchain/parser/bitcoin/bitcoin_native.go @@ -35,6 +35,10 @@ const ( bitcoinScriptTypeNullData string = "nulldata" bitcoinScriptTypeWitnessUnknown string = "witness_unknown" bitcoinScriptTypeWitnessV1Taproot string = "witness_v1_taproot" + bitcoinScriptTypeAnchor string = "anchor" + // TODO, Create litecoin parser for LTC address + bitcoinScriptTypeMwebPegin string = "witness_mweb_pegin" + bitcoinScriptTypeMwebHogaddr string = "witness_mweb_hogaddr" ) type ( @@ -190,10 +194,13 @@ func validateBitcoinScriptPubKey(sl validator.StructLevel) { } } // Types that we expect to be able to parse address for - case bitcoinScriptTypePubKeyHash, bitcoinScriptTypeScriptHash, bitcoinScriptTypeWitnessV0PubKeyHash, bitcoinScriptTypeWitnessV0ScriptHash, bitcoinScriptTypeWitnessUnknown, bitcoinScriptTypeWitnessV1Taproot: + // https://github.com/bitcoin/bitcoin/commit/455fca86cfada1823aa28615b5683f9dc73dbb9a + case bitcoinScriptTypePubKeyHash, bitcoinScriptTypeScriptHash, bitcoinScriptTypeWitnessV0PubKeyHash, bitcoinScriptTypeWitnessV0ScriptHash, bitcoinScriptTypeWitnessUnknown, bitcoinScriptTypeWitnessV1Taproot, bitcoinScriptTypeAnchor: if len(address) == 0 { sl.ReportError(address, "Address[main]", "Address[main]", "bspk_a", "") - } + } // Types that we expect to be able to parse address for + case bitcoinScriptTypeMwebPegin, bitcoinScriptTypeMwebHogaddr: + // https://github.com/litecoin-project/litecoin/blob/cd1660afaf5b31a80e797668b12b5b3933844842/src/script/standard.cpp#L60 default: sl.ReportError(address, "Address[unsupported]", "Address[unsupported]", "bspk_as", "") } diff --git a/internal/blockchain/parser/ethereum/ethereum_native.go b/internal/blockchain/parser/ethereum/ethereum_native.go index 6dabbf44..b75c51ce 100644 --- a/internal/blockchain/parser/ethereum/ethereum_native.go +++ b/internal/blockchain/parser/ethereum/ethereum_native.go @@ -288,6 +288,7 @@ const ( parseFailure = "parse_failure" arbitrumNITROUpgradeBlockNumber = 22_207_818 + tronNoncePlaceHolder = "0x0000000000000000" ) func (v EthereumHexString) MarshalJSON() ([]byte, error) { @@ -331,7 +332,7 @@ func (v *EthereumQuantity) UnmarshalJSON(input []byte) error { return xerrors.Errorf("failed to unmarshal EthereumQuantity into string: %w", err) } - if s == "" { + if s == "" || s == tronNoncePlaceHolder { *v = 0 return nil } @@ -570,14 +571,26 @@ func (p *ethereumNativeParserImpl) ParseBlock(ctx context.Context, rawBlock *api if numTransactions != len(tokenTransfers) { return nil, xerrors.Errorf("unexpected number of token transfers: expected=%v actual=%v", numTransactions, len(tokenTransfers)) } - transactionToFlattenedTracesMap := make(map[string][]*api.EthereumTransactionFlattenedTrace, 0) if isParityTrace { - if err := p.parseTransactionFlattenedParityTraces(blobdata, transactionToFlattenedTracesMap); err != nil { - return nil, xerrors.Errorf("failed to parse transaction parity traces: %w", err) + if p.config.Blockchain() != common.Blockchain_BLOCKCHAIN_TRON { + if err := p.parseTransactionFlattenedParityTraces(blobdata, transactionToFlattenedTracesMap); err != nil { + return nil, xerrors.Errorf("failed to parse transaction parity traces: %w", err) + } + } + } + // post process block data for Tron data, convert hash and account address, and set flattened traces + if p.config.Blockchain() == common.Blockchain_BLOCKCHAIN_TRON { + if err := postProcessTronBlock( + blobdata, + header, + transactions, + transactionReceipts, + tokenTransfers, + transactionToFlattenedTracesMap); err != nil { + return nil, xerrors.Errorf("failed to post process tron block: %w", err) } } - for i, transaction := range transactions { transaction.Receipt = transactionReceipts[i] transaction.TokenTransfers = tokenTransfers[i] @@ -606,8 +619,8 @@ func (p *ethereumNativeParserImpl) ParseBlock(ctx context.Context, rawBlock *api Blockchain: rawBlock.Blockchain, Network: rawBlock.Network, Tag: metadata.Tag, - Hash: metadata.Hash, - ParentHash: metadata.ParentHash, + Hash: header.Hash, + ParentHash: header.ParentHash, Height: metadata.Height, ParentHeight: metadata.ParentHeight, Timestamp: header.Timestamp, @@ -897,7 +910,7 @@ func (p *ethereumNativeParserImpl) parseTransactionReceipts(blobdata *api.Ethere } // Field effectiveGasPrice is added to the eth_getTransactionReceipt call for EIP-1559. - // Pre-London, it is equal to the transaction’s gasPrice. + // Pre-London, it is equal to the transaction's gasPrice. // Post-London, it is equal to the actual gas price paid for inclusion. // Since it's hard to backfill all old blocks, set `effectiveGasPrice` as gasPrice for Pre-London blocks. // Ref: https://hackmd.io/@timbeiko/1559-json-rpc diff --git a/internal/blockchain/parser/ethereum/module.go b/internal/blockchain/parser/ethereum/module.go index 8290ee84..0bb39d3d 100644 --- a/internal/blockchain/parser/ethereum/module.go +++ b/internal/blockchain/parser/ethereum/module.go @@ -36,5 +36,11 @@ var Module = fx.Options( Build(), internal.NewParserBuilder("fantom", NewFantomNativeParser). Build(), + internal.NewParserBuilder("tron", NewTronNativeParser). + SetValidatorFactory(NewBaseValidator). + Build(), + internal.NewParserBuilder("story", NewStoryNativeParser). + SetValidatorFactory(NewStoryValidator). + Build(), beacon.Module, ) diff --git a/internal/blockchain/parser/ethereum/story_native.go b/internal/blockchain/parser/ethereum/story_native.go new file mode 100644 index 00000000..e46de482 --- /dev/null +++ b/internal/blockchain/parser/ethereum/story_native.go @@ -0,0 +1,10 @@ +package ethereum + +import ( + "github.com/coinbase/chainstorage/internal/blockchain/parser/internal" +) + +func NewStoryNativeParser(params internal.ParserParams, opts ...internal.ParserFactoryOption) (internal.NativeParser, error) { + // Story shares the same data schema as Ethereum since its an EVM chain. + return NewEthereumNativeParser(params, opts...) +} diff --git a/internal/blockchain/parser/ethereum/story_validator.go b/internal/blockchain/parser/ethereum/story_validator.go new file mode 100644 index 00000000..3a8d38a4 --- /dev/null +++ b/internal/blockchain/parser/ethereum/story_validator.go @@ -0,0 +1,10 @@ +package ethereum + +import ( + "github.com/coinbase/chainstorage/internal/blockchain/parser/internal" +) + +func NewStoryValidator(params internal.ParserParams) internal.TrustlessValidator { + // Reuse the same implementation as Ethereum. + return NewEthereumValidator(params) +} diff --git a/internal/blockchain/parser/ethereum/story_validator_test.go b/internal/blockchain/parser/ethereum/story_validator_test.go new file mode 100644 index 00000000..dc62f195 --- /dev/null +++ b/internal/blockchain/parser/ethereum/story_validator_test.go @@ -0,0 +1,3 @@ +package ethereum + +//TODO - Implement the testing for the story validator diff --git a/internal/blockchain/parser/ethereum/tron_native.go b/internal/blockchain/parser/ethereum/tron_native.go new file mode 100644 index 00000000..046af95f --- /dev/null +++ b/internal/blockchain/parser/ethereum/tron_native.go @@ -0,0 +1,307 @@ +package ethereum + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "strconv" + "strings" + + "golang.org/x/xerrors" + + "github.com/mr-tron/base58" + + "github.com/coinbase/chainstorage/internal/blockchain/parser/ethereum/types" + "github.com/coinbase/chainstorage/internal/blockchain/parser/internal" + api "github.com/coinbase/chainstorage/protos/coinbase/chainstorage" +) + +func NewTronNativeParser(params internal.ParserParams, opts ...internal.ParserFactoryOption) (internal.NativeParser, error) { + // Tron shares the same data schema as Ethereum since its an EVM chain except skip trace data + opts = append(opts, WithEthereumNodeType(types.EthereumNodeType_ARCHIVAL), WithTraceType(types.TraceType_PARITY)) + return NewEthereumNativeParser(params, opts...) +} + +type TronCallValueInfo struct { + CallValue int64 `json:"callValue"` + TokenId string `json:"tokenId"` +} + +type TronTransactionInfo struct { + InternalTransactions []TronInternalTransaction `json:"internal_transactions"` + Id string `json:"id"` + BlockNumber uint64 `json:"blockNumber"` + TransactionHash string `json:"transactionHash"` + Fee uint64 `json:"fee"` + Receipt TronReceipt `json:"receipt"` +} + +type TronReceipt struct { + Result string `json:"result"` + // Bandwidth is represented as either net_fee or net_usage, only one will exist in the response + NetFee uint64 `json:"net_fee"` + NetUsage uint64 `json:"net_usage"` + EnergyUsage uint64 `json:"energy_usage"` + EnergyFee uint64 `json:"energy_fee"` + OriginEnergyUsage uint64 `json:"origin_energy_usage"` + EnergyUsageTotal uint64 `json:"energy_usage_total"` + EnergyPenaltyTotal uint64 `json:"energy_penalty_total"` +} + +type TronInternalTransaction struct { + Hash string `json:"hash"` + CallerAddress string `json:"caller_address"` + TransferToAddress string `json:"transferTo_address"` + CallValueInfo []TronCallValueInfo `json:"callValueInfo"` + Note string `json:"note"` + Rejected bool `json:"rejected"` +} + +func convertInternalTransactionToTrace(itx *TronInternalTransaction) *api.EthereumTransactionFlattenedTrace { + // only keep native values, ignore TRC10 token values + var nativeTokenValue int64 + for _, callValueInfoItem := range itx.CallValueInfo { + if callValueInfoItem.TokenId == "" { + // If TokenId is empty, it means this is a native token transfer + nativeTokenValue += callValueInfoItem.CallValue + } + } + + trace := &api.EthereumTransactionFlattenedTrace{ + Type: "CALL", + TraceType: "CALL", + CallType: "CALL", + From: hexToTronAddress(itx.CallerAddress), + To: hexToTronAddress(itx.TransferToAddress), + Value: strconv.FormatInt(nativeTokenValue, 10), + TraceId: itx.Hash, + CallValueInfo: convertTronCallValueInfo(itx.CallValueInfo), + } + if itx.Rejected { + trace.Error = "Internal transaction is executed failed" + trace.Status = 0 + } else { + trace.Status = 1 + } + + return trace +} + +func convertTronCallValueInfo(callValueInfo []TronCallValueInfo) []*api.CallValueInfo { + result := make([]*api.CallValueInfo, len(callValueInfo)) + for i, info := range callValueInfo { + result[i] = &api.CallValueInfo{ + TokenId: info.TokenId, + CallValue: info.CallValue, + } + } + return result +} + +func parseTronTxInfo( + blobData *api.EthereumBlobdata, + header *api.EthereumHeader, + transactionToFlattenedTracesMap map[string][]*api.EthereumTransactionFlattenedTrace, + txReceipts []*api.EthereumTransactionReceipt, +) error { + if len(blobData.TransactionTraces) == 0 { + return nil + } + + // Ensure we have matching number of receipts and traces + if len(blobData.TransactionTraces) != len(txReceipts) { + return xerrors.Errorf( + "mismatch between number of transaction traces (%d) and receipts (%d)", + len(blobData.TransactionTraces), + len(txReceipts), + ) + } + + for txIndex, rawTxInfo := range blobData.TransactionTraces { + var txInfo TronTransactionInfo + if err := json.Unmarshal(rawTxInfo, &txInfo); err != nil { + return xerrors.Errorf("failed to parse transaction trace at index %d: %w", txIndex, err) + } + + traceTransactionHash := txInfo.Id + txIdx := uint64(txIndex) + fee := txInfo.Fee + receipt := txInfo.Receipt + // 1. enreach txReceipt with fee and net_fee (Bandwidth)fields from transactionInfo.receipt + txReceipt := txReceipts[txIndex] + if fee != 0 { + txReceipt.OptionalFee = &api.EthereumTransactionReceipt_Fee{ + Fee: uint64(fee), + } + } + if receipt.NetFee != 0 { + txReceipt.OptionalNetFee = &api.EthereumTransactionReceipt_NetFee{ + NetFee: uint64(receipt.NetFee), + } + } + if receipt.NetUsage != 0 { + txReceipt.OptionalNetUsage = &api.EthereumTransactionReceipt_NetUsage{ + NetUsage: uint64(receipt.NetUsage), + } + } + if receipt.EnergyUsage != 0 { + txReceipt.OptionalEnergyUsage = &api.EthereumTransactionReceipt_EnergyUsage{ + EnergyUsage: uint64(receipt.EnergyUsage), + } + } + if receipt.EnergyFee != 0 { + txReceipt.OptionalEnergyFee = &api.EthereumTransactionReceipt_EnergyFee{ + EnergyFee: uint64(receipt.EnergyFee), + } + } + if receipt.OriginEnergyUsage != 0 { + txReceipt.OptionalOriginEnergyUsage = &api.EthereumTransactionReceipt_OriginEnergyUsage{ + OriginEnergyUsage: uint64(receipt.OriginEnergyUsage), + } + } + if receipt.EnergyUsageTotal != 0 { + txReceipt.OptionalEnergyUsageTotal = &api.EthereumTransactionReceipt_EnergyUsageTotal{ + EnergyUsageTotal: uint64(receipt.EnergyUsageTotal), + } + } + if receipt.EnergyPenaltyTotal != 0 { + txReceipt.OptionalEnergyPenaltyTotal = &api.EthereumTransactionReceipt_EnergyPenaltyTotal{ + EnergyPenaltyTotal: uint64(receipt.EnergyPenaltyTotal), + } + } + + // 2. mapping internalTransactions to trace + internalTxs := txInfo.InternalTransactions + traces := make([]*api.EthereumTransactionFlattenedTrace, len(internalTxs)) + for i, internalTx := range internalTxs { + trace := convertInternalTransactionToTrace(&internalTx) + trace.BlockHash = toTronHash(header.Hash) + trace.BlockNumber = header.Number + trace.TransactionHash = traceTransactionHash + trace.TransactionIndex = txIdx + traces[i] = trace + } + transactionToFlattenedTracesMap[traceTransactionHash] = traces + } + return nil +} + +func toTronHash(hexHash string) string { + // if hexHash == "" { + // return "" + // } + // // Normalize the hash by ensuring it's lowercase and removing 0x prefix + // hexHash = strings.ToLower(hexHash) + return strings.Replace(hexHash, "0x", "", -1) +} + +func hexToTronAddress(hexAddress string) string { + if hexAddress == "" { + return "" + } + + // Ensure consistent format by cleaning the hex address + hexAddress = strings.ToLower(hexAddress) + if strings.HasPrefix(hexAddress, "0x") { + hexAddress = "41" + hexAddress[2:] + } else if !strings.HasPrefix(hexAddress, "41") { + hexAddress = "41" + hexAddress + } + + // Decode hex string to bytes + rawBytes, err := hex.DecodeString(hexAddress) + if err != nil { + // If unable to decode, return the original address to avoid data loss + return hexAddress + } + + // Compute double SHA-256 checksum + hash1 := sha256.Sum256(rawBytes) + hash2 := sha256.Sum256(hash1[:]) + checksum := hash2[:4] // First 4 bytes as checksum + // Append checksum to the raw bytes + fullBytes := append(rawBytes, checksum...) + // Base58Check encode + tronAddress := base58.Encode(fullBytes) + + return tronAddress +} + +func convertTokenTransfer(data *api.EthereumTokenTransfer) { + data.TokenAddress = hexToTronAddress(data.TokenAddress) + data.FromAddress = hexToTronAddress(data.FromAddress) + data.ToAddress = hexToTronAddress(data.ToAddress) + + data.TransactionHash = toTronHash(data.TransactionHash) + data.BlockHash = toTronHash(data.BlockHash) + + switch v := data.TokenTransfer.(type) { + case *api.EthereumTokenTransfer_Erc20: + if v.Erc20 != nil { + v.Erc20.FromAddress = hexToTronAddress(v.Erc20.FromAddress) + v.Erc20.ToAddress = hexToTronAddress(v.Erc20.ToAddress) + } + case *api.EthereumTokenTransfer_Erc721: + if v.Erc721 != nil { + v.Erc721.FromAddress = hexToTronAddress(v.Erc721.FromAddress) + v.Erc721.ToAddress = hexToTronAddress(v.Erc721.ToAddress) + } + } +} + +func postProcessTronBlock( + blobData *api.EthereumBlobdata, + header *api.EthereumHeader, + transactions []*api.EthereumTransaction, + txReceipts []*api.EthereumTransactionReceipt, + tokenTransfers [][]*api.EthereumTokenTransfer, + transactionToFlattenedTracesMap map[string][]*api.EthereumTransactionFlattenedTrace, +) error { + if err := parseTronTxInfo(blobData, header, transactionToFlattenedTracesMap, txReceipts); err != nil { + return xerrors.Errorf("failed to parse transaction parity traces: %w", err) + } + + header.Hash = toTronHash(header.Hash) + header.ParentHash = toTronHash(header.ParentHash) + header.TransactionsRoot = toTronHash(header.TransactionsRoot) + header.Miner = hexToTronAddress(header.Miner) + + for i := range header.Transactions { + header.Transactions[i] = toTronHash(header.Transactions[i]) + } + + for _, tx := range transactions { + tx.BlockHash = toTronHash(tx.BlockHash) + tx.Hash = toTronHash(tx.Hash) + if tx.From != "" { + tx.From = hexToTronAddress(tx.From) + } + if tx.To != "" { + tx.To = hexToTronAddress(tx.To) + } + } + + for _, txR := range txReceipts { + txR.TransactionHash = toTronHash(txR.TransactionHash) + txR.BlockHash = toTronHash(txR.BlockHash) + if txR.From != "" { + txR.From = hexToTronAddress(txR.From) + } + if txR.To != "" { + txR.To = hexToTronAddress(txR.To) + } + if txR.Logs != nil { + for _, txLog := range txR.Logs { + txLog.TransactionHash = toTronHash(txLog.TransactionHash) + txLog.BlockHash = toTronHash(txLog.BlockHash) + txLog.Address = hexToTronAddress(txLog.Address) + } + } + } + for _, txTokenTransfers := range tokenTransfers { + for _, tokenTransfer := range txTokenTransfers { + convertTokenTransfer(tokenTransfer) + } + } + return nil +} diff --git a/internal/blockchain/parser/ethereum/tron_native_test.go b/internal/blockchain/parser/ethereum/tron_native_test.go new file mode 100644 index 00000000..ed345e68 --- /dev/null +++ b/internal/blockchain/parser/ethereum/tron_native_test.go @@ -0,0 +1,588 @@ +package ethereum + +import ( + "context" + "encoding/json" + "testing" + + "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/mock/gomock" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/coinbase/chainstorage/internal/blockchain/parser/internal" + "github.com/coinbase/chainstorage/internal/utils/fixtures" + "github.com/coinbase/chainstorage/internal/utils/testapp" + "github.com/coinbase/chainstorage/internal/utils/testutil" + "github.com/coinbase/chainstorage/protos/coinbase/c3/common" + api "github.com/coinbase/chainstorage/protos/coinbase/chainstorage" +) + +type tronParserTestSuite struct { + suite.Suite + + ctrl *gomock.Controller + testapp testapp.TestApp + parser internal.Parser +} + +func TestTronParserTestSuite(t *testing.T) { + // t.Skip() + suite.Run(t, new(tronParserTestSuite)) +} + +func (s *tronParserTestSuite) SetupTest() { + s.ctrl = gomock.NewController(s.T()) + + var parser internal.Parser + s.testapp = testapp.New( + s.T(), + Module, + internal.Module, + testapp.WithBlockchainNetwork(common.Blockchain_BLOCKCHAIN_TRON, common.Network_NETWORK_TRON_MAINNET), + fx.Populate(&parser), + ) + + s.parser = parser + s.NotNil(s.parser) +} + +func (s *tronParserTestSuite) TearDownTest() { + s.testapp.Close() + s.ctrl.Finish() +} + +func (s *tronParserTestSuite) TestParseTronBlock() { + require := testutil.Require(s.T()) + + fixtureHeader := fixtures.MustReadFile("parser/tron/raw_block_header.json") + + rawReceipts, err := s.fixtureParsingHelper("parser/tron/raw_block_tx_receipt.json") + require.NoError(err) + + rawTraces, err := s.fixtureParsingHelper("parser/tron/raw_block_trace_tx_info.json") + require.NoError(err) + + block := &api.Block{ + Blockchain: common.Blockchain_BLOCKCHAIN_TRON, + Network: common.Network_NETWORK_TRON_MAINNET, + Metadata: &api.BlockMetadata{ + Tag: 2, + Hash: "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + ParentHash: "0x0000000004034f5b43c5934257b3d1f1a313bba4af0a4dd2f778fda9e641b615", + Height: 0x4034f5c, + }, + Blobdata: &api.Block_Ethereum{ + Ethereum: &api.EthereumBlobdata{ + Header: fixtureHeader, + TransactionReceipts: rawReceipts, + TransactionTraces: rawTraces, + }, + }, + } + + expectedHeader := &api.EthereumHeader{ + Hash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + ParentHash: "0000000004034f5b43c5934257b3d1f1a313bba4af0a4dd2f778fda9e641b615", + Number: 0x4034F5C, + Timestamp: ×tamppb.Timestamp{Seconds: 1732627338}, + Transactions: []string{ + "d581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + }, + Nonce: "0x0000000000000000", + Sha3Uncles: "0x0000000000000000000000000000000000000000000000000000000000000000", + LogsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + TransactionsRoot: "d270690faa58558c2b03ae600334f71f9d5a0ad42d7313852fb3742e8576eec9", + StateRoot: "0x", + ReceiptsRoot: "0x0000000000000000000000000000000000000000000000000000000000000000", + Miner: "TNeEwWHXLLUgEtfzTnYN8wtVenGxuMzZCE", + TotalDifficulty: "0", + ExtraData: "0x", + Size: 0x1a366, + GasLimit: 0x2b3b43dc6, + GasUsed: 0xb1006d, + MixHash: "0x0000000000000000000000000000000000000000000000000000000000000000", + OptionalBaseFeePerGas: &api.EthereumHeader_BaseFeePerGas{ + BaseFeePerGas: uint64(0), + }, + } + expectedFlattenedTraces := []*api.EthereumTransactionFlattenedTrace{ + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Value: "200", + TraceType: "CALL", + CallType: "CALL", + TraceId: "499bdbdfaae021dd510c70b433bc48d88d8ca6e0b7aee13ce6d726114e365aaf", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + CallValue: 100, + }, + { + CallValue: 100, + }, + }, + }, + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TXA2WjFc5f86deJcZZCdbdpkpUTKTA3VDM", + Value: "1000", + TraceType: "CALL", + CallType: "CALL", + TraceId: "997225b56440a9bd172f05f44a663830b72093a12502551cda99b0bc7c60cbc1", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + TokenId: "1004777", + CallValue: 1000000000000000, + }, + { + CallValue: 1000, + }, + }, + }, + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TXA2WjFc5f86deJcZZCdbdpkpUTKTA3VDM", + Value: "0", + TraceType: "CALL", + CallType: "CALL", + TraceId: "7ac8dd16dede5c512330f5033c8fd6f5390d742aa51b805f805098109eb54fe9", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + TokenId: "1004777", + CallValue: 1000, + }, + { + TokenId: "1004777", + CallValue: 100, + }, + }, + }, + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TU3kjFuhtEo42tsCBtfYUAZxoqQ4yuSLQ5", + Value: "100000", + TraceType: "CALL", + CallType: "CALL", + TraceId: "cf6f699d9bdae8aa25fae310a06bb60a29a7812548cf3c1d83c737fd1a22c0ee", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + TokenId: "1004777", + CallValue: 100, + }, + { + CallValue: 100000, + }, + }, + }, + { + Type: "CALL", + From: "TU3kjFuhtEo42tsCBtfYUAZxoqQ4yuSLQ5", + To: "TU3kjFuhtEo42tsCBtfYUAZxoqQ4yuSLQ5", + Value: "0", + TraceType: "CALL", + CallType: "CALL", + TraceId: "95787b9a6558c7b6b624d0c1bece9723a7f4c3d414010b6ac105ae5f5aebffbc", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + {}, + }, + }, + { + Type: "CALL", + From: "TU3kjFuhtEo42tsCBtfYUAZxoqQ4yuSLQ5", + To: "TGzjkw66CtL49eKiQFDwJDuXG9HSQd69p2", + Value: "822996311610", + TraceType: "CALL", + CallType: "CALL", + TraceId: "14526162e31d969ef0dca9b902d51ecc0ffab87dc936dce62022f368119043af", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + CallValue: 822994311610, + }, + { + CallValue: 2000000, + }, + }, + }, + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TXA2WjFc5f86deJcZZCdbdpkpUTKTA3VDM", + Value: "0", + TraceType: "CALL", + CallType: "CALL", + TraceId: "8e088220a26ca8d794786e78096e71259cf8744cccdc4f07a8129aa8ee29bb98", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + {}, + }, + }, + { + Type: "CALL", + From: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + To: "TNXC2YCSxhdxsVqhqu3gYZYme6n4i6T1C1", + Value: "1424255258", + TraceType: "CALL", + CallType: "CALL", + TraceId: "83b1d41ba953aab4da6e474147f647599ea53bb3213306897127b57e85ddd1ca", + Status: 1, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 0x4034F5C, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 1, + CallValueInfo: []*api.CallValueInfo{ + { + CallValue: 1424255258, + }, + }, + }, + } + + expectedTransactions := []*api.EthereumTransaction{ + { + Hash: "d581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + From: "TDQFomPihdhP8Jzr2LMpdcXgg9qxKfZZmD", + To: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", + Index: 0, + Receipt: &api.EthereumTransactionReceipt{ + TransactionHash: "d581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + From: "TDQFomPihdhP8Jzr2LMpdcXgg9qxKfZZmD", + To: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", + CumulativeGasUsed: 130285, + GasUsed: 130285, + LogsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + EffectiveGasPrice: 210, + OptionalStatus: &api.EthereumTransactionReceipt_Status{Status: 1}, + TransactionIndex: 0, + OptionalNetUsage: &api.EthereumTransactionReceipt_NetUsage{ + NetUsage: 345, + }, + OptionalEnergyUsage: &api.EthereumTransactionReceipt_EnergyUsage{ + EnergyUsage: 130285, + }, + OptionalEnergyUsageTotal: &api.EthereumTransactionReceipt_EnergyUsageTotal{ + EnergyUsageTotal: 130285, + }, + OptionalEnergyPenaltyTotal: &api.EthereumTransactionReceipt_EnergyPenaltyTotal{ + EnergyPenaltyTotal: 100635, + }, + Logs: []*api.EthereumEventLog{ + { + TransactionHash: "d581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + Address: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", + Data: "0x0000000000000000000000000000000000000000000000000000000000027165", + TransactionIndex: 0, + LogIndex: 0, + Topics: []string{ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000025a51e3e65287539b8d4eb559cbca4488a08bb00", + "0x0000000000000000000000009dc5da2b3c502661c8448ba88bacf7f0b22272ad", + }, + }, + }, + }, + }, + { + Hash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + From: "TNXC2YCSxhdxsVqhqu3gYZYme6n4i6T1C1", + To: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Index: 69, + Receipt: &api.EthereumTransactionReceipt{ + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + From: "TNXC2YCSxhdxsVqhqu3gYZYme6n4i6T1C1", + To: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + CumulativeGasUsed: 1432695, + GasUsed: 74135, + LogsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + EffectiveGasPrice: 210, + OptionalStatus: &api.EthereumTransactionReceipt_Status{Status: 1}, + TransactionIndex: 69, + OptionalFee: &api.EthereumTransactionReceipt_Fee{ + Fee: 379, + }, + OptionalNetFee: &api.EthereumTransactionReceipt_NetFee{ + NetFee: 379, + }, + OptionalEnergyUsage: &api.EthereumTransactionReceipt_EnergyUsage{ + EnergyUsage: 68976, + }, + OptionalOriginEnergyUsage: &api.EthereumTransactionReceipt_OriginEnergyUsage{ + OriginEnergyUsage: 5159, + }, + OptionalEnergyUsageTotal: &api.EthereumTransactionReceipt_EnergyUsageTotal{ + EnergyUsageTotal: 74135, + }, + Logs: []*api.EthereumEventLog{ + { + LogIndex: 16, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 69, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + Address: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Data: "0x00000000000000000000000000000000000000000000000000000001f9873bc7000000000000000000000000000000000000000000000000093732ae413feb69000000000000000000000000000000000000000000000000093732b42dd59ebe0000000000000000000000000000000000000000000000000000801f33d9f651000000000000000000000000000000000000000000000000000000000036b158", + Topics: []string{ + "0xda6e3523d5765dedff9534b488c7e508318178571c144293451989755e9379e7", + "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + }, + { + LogIndex: 17, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 69, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + Address: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Data: "0x000000000000000000000000000000000000000000000000093732a856669e8f000000000000000000000000000000000000000000000000093732b42dd59ebe000000000000000000000000000000000000000000000000000000bf9e4899ba000000000000000000000000000000000000000000000000000000000000a3810000000000000000000000000000000000000000000000000000000000000000", + Topics: []string{ + "0x74fed619850adf4ba83cfb92b9566b424e3de6de4d9a7adc3b1909ea58421a55", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + }, + { + LogIndex: 18, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 69, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + // Address: "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + Address: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Data: "0x000000000000000000000000000000000000000000000000000000bf9e4899ba", + Topics: []string{ + "0xf2def54ec5eba61fd8f18d019c7beaf6a47df317fb798b3263ad69ec227c9261", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + }, + { + LogIndex: 19, + TransactionHash: "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + TransactionIndex: 69, + BlockHash: "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + BlockNumber: 67325788, + Address: "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", + Data: "0x000000000000000000000000000000000000000000000000000000bf9e4899ba0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000c032ffd0000000000000000000000000000000000000000000000000000000054e4691a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093732b42dd59ebe", + Topics: []string{ + "0xf7e21d5bf17851f93ab7bda7e390841620f59dfbe9d86add32824f33bd40d3f5", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + }, + }, + }, + }, + }, + } + + nativeBlock, err := s.parser.ParseNativeBlock(context.Background(), block) + require.NoError(err) + require.Equal(common.Blockchain_BLOCKCHAIN_TRON, nativeBlock.Blockchain) + require.Equal(common.Network_NETWORK_TRON_MAINNET, nativeBlock.Network) + actualBlock := nativeBlock.GetEthereum() + require.NotNil(actualBlock) + require.Equal(expectedHeader, actualBlock.Header) + + require.Equal(2, len(actualBlock.Transactions)) + + require.Equal(8, len(actualBlock.Transactions[1].FlattenedTraces)) + + tx := actualBlock.Transactions[1] + for i, trace := range tx.FlattenedTraces { + trace_i := expectedFlattenedTraces[i] + require.Equal(trace_i.Type, trace.Type) + require.Equal(trace_i.From, trace.From) + require.Equal(trace_i.To, trace.To) + require.Equal(trace_i.Value, trace.Value) + require.Equal(trace_i.TraceType, trace.TraceType) + require.Equal(trace_i.CallType, trace.CallType) + require.Equal(trace_i.TraceId, trace.TraceId) + require.Equal(trace_i.Status, trace.Status) + require.Equal(trace_i.BlockHash, trace.BlockHash) + require.Equal(trace_i.BlockNumber, trace.BlockNumber) + require.Equal(trace_i.TransactionHash, trace.TransactionHash) + require.Equal(trace_i.TransactionIndex, trace.TransactionIndex) + } + require.Equal(tx.FlattenedTraces, expectedFlattenedTraces) + + for i, tx := range actualBlock.Transactions { + expected_tx := expectedTransactions[i] + require.Equal(expected_tx.Hash, tx.Hash) + require.Equal(expected_tx.From, tx.From) + require.Equal(expected_tx.To, tx.To) + require.Equal(expected_tx.Index, tx.Index) + + require.Equal(expected_tx.Receipt.From, tx.Receipt.From) + require.Equal(expected_tx.Receipt.To, tx.Receipt.To) + require.Equal(expected_tx.Receipt.TransactionHash, tx.Receipt.TransactionHash) + require.Equal(expected_tx.Receipt.TransactionIndex, tx.Receipt.TransactionIndex) + require.Equal(expected_tx.Receipt.BlockHash, tx.Receipt.BlockHash) + require.Equal(expected_tx.Receipt.BlockNumber, tx.Receipt.BlockNumber) + require.Equal(expected_tx.Receipt.CumulativeGasUsed, tx.Receipt.CumulativeGasUsed) + require.Equal(expected_tx.Receipt.GasUsed, tx.Receipt.GasUsed) + require.Equal(expected_tx.Receipt.LogsBloom, tx.Receipt.LogsBloom) + require.Equal(expected_tx.Receipt.EffectiveGasPrice, tx.Receipt.EffectiveGasPrice) + require.Equal(expected_tx.Receipt.Logs, tx.Receipt.Logs) + + if expected_tx.Receipt.GetOptionalFee() != nil { + require.NotNil(tx.Receipt.GetOptionalFee()) + require.Equal(expected_tx.Receipt.GetFee(), tx.Receipt.GetFee()) + } else { + require.Nil(tx.Receipt.GetOptionalFee()) + } + if expected_tx.Receipt.GetOptionalNetFee() != nil { + require.NotNil(tx.Receipt.GetOptionalNetFee()) + require.Equal(expected_tx.Receipt.GetNetFee(), tx.Receipt.GetNetFee()) + } else { + require.Nil(tx.Receipt.GetOptionalNetFee()) + } + if expected_tx.Receipt.GetOptionalNetUsage() != nil { + require.NotNil(tx.Receipt.GetOptionalNetUsage()) + require.Equal(expected_tx.Receipt.GetNetUsage(), tx.Receipt.GetNetUsage()) + } else { + require.Nil(tx.Receipt.GetOptionalNetUsage()) + } + if expected_tx.Receipt.GetOptionalEnergyUsage() != nil { + require.NotNil(tx.Receipt.GetOptionalEnergyUsage()) + require.Equal(expected_tx.Receipt.GetEnergyUsage(), tx.Receipt.GetEnergyUsage()) + } else { + require.Nil(tx.Receipt.GetOptionalEnergyUsage()) + } + if expected_tx.Receipt.GetOptionalEnergyUsageTotal() != nil { + require.NotNil(tx.Receipt.GetOptionalEnergyUsageTotal()) + require.Equal(expected_tx.Receipt.GetEnergyUsageTotal(), tx.Receipt.GetEnergyUsageTotal()) + } else { + require.Nil(tx.Receipt.GetOptionalEnergyUsageTotal()) + } + if expected_tx.Receipt.GetOptionalEnergyPenaltyTotal() != nil { + require.NotNil(tx.Receipt.GetOptionalEnergyPenaltyTotal()) + require.Equal(expected_tx.Receipt.GetEnergyPenaltyTotal(), tx.Receipt.GetEnergyPenaltyTotal()) + } else { + require.Nil(tx.Receipt.GetOptionalEnergyPenaltyTotal()) + } + if expected_tx.Receipt.GetOptionalOriginEnergyUsage() != nil { + require.NotNil(tx.Receipt.GetOptionalOriginEnergyUsage()) + require.Equal(expected_tx.Receipt.GetOriginEnergyUsage(), tx.Receipt.GetOriginEnergyUsage()) + } else { + require.Nil(tx.Receipt.GetOptionalOriginEnergyUsage()) + } + if expected_tx.Receipt.GetOptionalNetUsage() != nil { + require.NotNil(tx.Receipt.GetOptionalNetUsage()) + require.Equal(expected_tx.Receipt.GetNetUsage(), tx.Receipt.GetNetUsage()) + } else { + require.Nil(tx.Receipt.GetOptionalNetUsage()) + } + } +} + +func (s *tronParserTestSuite) fixtureParsingHelper(filePath string) ([][]byte, error) { + + fixtureParityTrace, _ := fixtures.ReadFile(filePath) + + var tmpItems []json.RawMessage + err := json.Unmarshal(fixtureParityTrace, &tmpItems) + + items := make([][]byte, len(tmpItems)) + for i, item := range tmpItems { + items[i] = item + } + return items, err +} + +func (s *tronParserTestSuite) TestToTronHash() { + require := testutil.Require(s.T()) + + testCases := []struct { + input string + expected string + comment string + }{ + {"0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", "with 0x prefix"}, + {"0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", "0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", "without 0x prefix"}, + {"0xABCDEF1234567890", "ABCDEF1234567890", "uppercase hex"}, + {"", "", "empth string"}, + {"0x", "", "only 0x prefix"}, + } + + for _, tc := range testCases { + result := toTronHash(tc.input) + require.Equal(tc.expected, result, tc.comment) + } +} + +func (s *tronParserTestSuite) TestHexToTronAddress() { + require := testutil.Require(s.T()) + testCases := []struct { + input string + expected string + comment string + }{ + {"0x8b0359acac03bac62cbf89c4b787cb10b3c3f513", "TNeEwWHXLLUgEtfzTnYN8wtVenGxuMzZCE", "with 0x prefix"}, + {"0xc60a6f5c81431c97ed01b61698b6853557f3afd4", "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", "with 0x prefix"}, + {"0x4d12f87c18a914dddbc2b27f378ad126a79b76b6", "TGzjkw66CtL49eKiQFDwJDuXG9HSQd69p2", "with 0x prefix"}, + {"0xe8667633c747066c70672c58207cc745a9860527", "TXA2WjFc5f86deJcZZCdbdpkpUTKTA3VDM", "with 0x prefix"}, + {"0x89ae01b878dffc8088222adf1fb08ebadfeea53a", "TNXC2YCSxhdxsVqhqu3gYZYme6n4i6T1C1", "with 0x prefix"}, + + {"418b0359acac03bac62cbf89c4b787cb10b3c3f513", "TNeEwWHXLLUgEtfzTnYN8wtVenGxuMzZCE", "without 0x but have 41 prefix"}, + {"41c60a6f5c81431c97ed01b61698b6853557f3afd4", "TU2MJ5Veik1LRAgjeSzEdvmDYx7mefJZvd", "without 0x but have 41 prefix"}, + {"414d12f87c18a914dddbc2b27f378ad126a79b76b6", "TGzjkw66CtL49eKiQFDwJDuXG9HSQd69p2", "without 0x but have 41 prefix"}, + {"41e8667633c747066c70672c58207cc745a9860527", "TXA2WjFc5f86deJcZZCdbdpkpUTKTA3VDM", "without 0x but have 41 prefix"}, + {"4189ae01b878dffc8088222adf1fb08ebadfeea53a", "TNXC2YCSxhdxsVqhqu3gYZYme6n4i6T1C1", "without 0x but have 41 prefix"}, + + {"c64e69acde1c7b16c2a3efcdbbdaa96c3644c2b3", "TU3kjFuhtEo42tsCBtfYUAZxoqQ4yuSLQ5", "without 0x and 41 prefix"}, + {"a614f803b6fd780986a42c78ec9c7f77e6ded13c", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "without 0x and 41 prefix"}, + + {"", "", "empty string"}, + } + + for _, tc := range testCases { + result := hexToTronAddress(tc.input) + require.Equal(tc.expected, result, tc.comment) + } +} diff --git a/internal/blockchain/parser/ethereum/tron_validator.go b/internal/blockchain/parser/ethereum/tron_validator.go new file mode 100644 index 00000000..2ee7ab45 --- /dev/null +++ b/internal/blockchain/parser/ethereum/tron_validator.go @@ -0,0 +1,10 @@ +package ethereum + +import ( + "github.com/coinbase/chainstorage/internal/blockchain/parser/internal" +) + +func NewTronValidator(params internal.ParserParams) internal.TrustlessValidator { + // Reuse the same implementation as Ethereum. + return NewEthereumValidator(params) +} diff --git a/internal/blockchain/parser/internal/parser.go b/internal/blockchain/parser/internal/parser.go index 945b488c..b2cdf4d6 100644 --- a/internal/blockchain/parser/internal/parser.go +++ b/internal/blockchain/parser/internal/parser.go @@ -61,6 +61,8 @@ type ( EthereumBeacon ParserFactory `name:"ethereum/beacon" optional:"true"` CosmosStaking ParserFactory `name:"cosmos/staking" optional:"true"` CardanoStaking ParserFactory `name:"cardano/staking" optional:"true"` + Tron ParserFactory `name:"tron" optional:"true"` + Story ParserFactory `name:"story" optional:"true"` } ParserParams struct { @@ -82,7 +84,7 @@ func NewParser(params Params) (Parser, error) { sidechain := params.Config.Chain.Sidechain if sidechain == api.SideChain_SIDECHAIN_NONE { switch blockchain { - case common.Blockchain_BLOCKCHAIN_BITCOIN: + case common.Blockchain_BLOCKCHAIN_BITCOIN, common.Blockchain_BLOCKCHAIN_BITCOINCASH, common.Blockchain_BLOCKCHAIN_LITECOIN: factory = params.Bitcoin case common.Blockchain_BLOCKCHAIN_BSC: factory = params.Bsc @@ -104,6 +106,10 @@ func NewParser(params Params) (Parser, error) { factory = params.Fantom case common.Blockchain_BLOCKCHAIN_APTOS: factory = params.Aptos + case common.Blockchain_BLOCKCHAIN_TRON: + factory = params.Tron + case common.Blockchain_BLOCKCHAIN_STORY: + factory = params.Story default: if params.Config.IsRosetta() { factory = params.Rosetta diff --git a/internal/blockchain/restapi/client.go b/internal/blockchain/restapi/client.go index 2b27f4f7..68cc1dc8 100644 --- a/internal/blockchain/restapi/client.go +++ b/internal/blockchain/restapi/client.go @@ -46,15 +46,17 @@ type ( Slave endpoints.EndpointProvider `name:"slave"` Validator endpoints.EndpointProvider `name:"validator"` Consensus endpoints.EndpointProvider `name:"consensus"` + Additional endpoints.EndpointProvider `name:"additional"` HTTPClient HTTPClient `optional:"true"` // Injected by unit test. } ClientResult struct { fx.Out - Master Client `name:"master"` - Slave Client `name:"slave"` - Validator Client `name:"validator"` - Consensus Client `name:"consensus"` + Master Client `name:"master"` + Slave Client `name:"slave"` + Validator Client `name:"validator"` + Consensus Client `name:"consensus"` + Additional Client `name:"additional"` } HTTPError struct { @@ -66,6 +68,7 @@ type ( // The 'Name' is just used for annotation. // For example, in Aptos, the 'ParamsPath' for block 1 will be: "/blocks/by_height/1?with_transactions=true". RequestMethod struct { + HTTPMethod string Name string ParamsPath string Timeout time.Duration @@ -106,12 +109,16 @@ func New(params ClientParams) (ClientResult, error) { if err != nil { return ClientResult{}, xerrors.Errorf("failed to create consensus client: %w", err) } - + additional, err := newClient(params, params.Additional) + if err != nil { + return ClientResult{}, xerrors.Errorf("failed to create additional client: %w", err) + } return ClientResult{ - Master: master, - Slave: slave, - Validator: validator, - Consensus: consensus, + Master: master, + Slave: slave, + Validator: validator, + Consensus: consensus, + Additional: additional, }, nil } @@ -171,9 +178,7 @@ func (c *clientImpl) makeHTTPRequest(ctx context.Context, method *RequestMethod, ctx, cancel := context.WithTimeout(ctx, method.Timeout) defer cancel() - - // TODO: will handle both GET and POST. - request, err := http.NewRequestWithContext(ctx, http.MethodGet, url, bytes.NewReader(requestBody)) + request, err := http.NewRequestWithContext(ctx, method.HTTPMethod, url, bytes.NewReader(requestBody)) if err != nil { err = c.sanitizedError(err) return nil, xerrors.Errorf("failed to create request: %w", err) diff --git a/internal/blockchain/restapi/client_test.go b/internal/blockchain/restapi/client_test.go index e28be5a4..4586bed0 100644 --- a/internal/blockchain/restapi/client_test.go +++ b/internal/blockchain/restapi/client_test.go @@ -112,7 +112,7 @@ func TestCall_RequestError(t *testing.T) { require.Nil(response) require.Error(err) - require.Contains(err.Error(), "method=&{hello path 5ns}") + require.Contains(err.Error(), "method=&{ hello path 5ns}") require.Contains(err.Error(), "requestBody=[]") require.Contains(err.Error(), "endpoint=node_name") @@ -165,7 +165,7 @@ func TestCall_RequestError_FailedWithRetry(t *testing.T) { require.Nil(response) require.Error(err) - require.Contains(err.Error(), "method=&{hello path 5ns}") + require.Contains(err.Error(), "method=&{ hello path 5ns}") require.Contains(err.Error(), "requestBody=[]") require.Contains(err.Error(), "endpoint=node_name") @@ -181,6 +181,54 @@ func TestCall_RequestError_FailedWithRetry(t *testing.T) { require.Equal("block_not_found", errOut.ErrorCode) } +func TestCall_RequestMethod(t *testing.T) { + require := testutil.Require(t) + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + httpClient := restapimocks.NewMockHTTPClient(ctrl) + // Construct a REST API response with request method in body + httpClient.EXPECT().Do(gomock.Any()).DoAndReturn(func(req *http.Request) (*http.Response, error) { + method := req.Method + body := ioutil.NopCloser(strings.NewReader(`{"method": "` + method + `"}`)) + return &http.Response{ + StatusCode: http.StatusOK, + Body: body, + }, nil + }).Times(2) + + var params clientParams + app := testapp.New( + t, + withDummyEndpoints(), + fx.Provide(restapi.New), + fx.Provide(func() restapi.HTTPClient { + return httpClient + }), + fx.Populate(¶ms), + ) + defer app.Close() + + client := params.Master + require.NotNil(client) + + methods := []string{http.MethodGet, http.MethodPost} + for _, method := range methods { + response, err := client.Call(context.Background(), + &restapi.RequestMethod{Name: "hello", ParamsPath: "path", HTTPMethod: method, Timeout: time.Duration(5)}, + nil) + require.NoError(err) + // assert the right method + var responseData map[string]string + err = json.Unmarshal(response, &responseData) + require.NoError(err) + require.NotEmpty(responseData) + require.Equal(method, responseData["method"]) + + } +} + func TestCall_RequestError_SucceededAfterRetries(t *testing.T) { require := testutil.Require(t) @@ -263,7 +311,7 @@ func TestCall_RequestError_WithCustomizedAttempts(t *testing.T) { require.Error(err) require.Nil(response) - require.Contains(err.Error(), "method=&{hello path 5ns}") + require.Contains(err.Error(), "method=&{ hello path 5ns}") require.Contains(err.Error(), "requestBody=[]") require.Contains(err.Error(), "endpoint=node_name") diff --git a/internal/config/config.go b/internal/config/config.go index 6b30220b..e9bec34a 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -40,6 +40,7 @@ type ( SLA SLAConfig `mapstructure:"sla"` FunctionalTest FunctionalTestConfig `mapstructure:"functional_test"` StatsD *StatsDConfig `mapstructure:"statsd"` + Prometheus *PrometheusConfig `mapstructure:"prometheus"` namespace string env Env @@ -76,6 +77,7 @@ type ( Slave JSONRPCConfig `mapstructure:"slave"` Validator JSONRPCConfig `mapstructure:"validator"` Consensus JSONRPCConfig `mapstructure:"consensus"` + Additional JSONRPCConfig `mapstructure:"additional"` Retry ClientRetryConfig `mapstructure:"retry"` HttpTimeout time.Duration `mapstructure:"http_timeout"` } @@ -417,6 +419,24 @@ type ( Prefix string `mapstructure:"prefix"` } + PrometheusConfig struct { + // Port is the port to listen on for the metrics server. + Port int `mapstructure:"port" validate:"required"` + // MetricsPath is the path to listen on for the metrics server. + MetricsPath string `mapstructure:"metrics_path"` + // Namespace is the namespace for the metrics. + Namespace string `mapstructure:"namespace"` + // GlobalLabels are labels that are applied to all metrics. + GlobalLabels map[string]string `mapstructure:"global_labels"` + // DefaultHistogramBuckets are the default buckets for histogram metrics + // if not specified in HistogramBuckets. + DefaultHistogramBuckets []float64 `mapstructure:"default_histogram_buckets"` + // HistogramBuckets are custom buckets for specific histogram metrics. + // This allows for more granular control over the histogram buckets on a + // per-metric basis. + HistogramBuckets map[string][]float64 `mapstructure:"histogram_buckets"` + } + ConfigOption func(options *configOptions) Env string diff --git a/internal/gateway/rest_client.go b/internal/gateway/rest_client.go index e2fafffe..87ca57b1 100644 --- a/internal/gateway/rest_client.go +++ b/internal/gateway/rest_client.go @@ -237,6 +237,7 @@ func (c *restClient) makeRequest(ctx context.Context, method string, request pro httpRequest.Header.Set("Accept", "application/json") if c.authHeader != "" && c.authToken != "" { httpRequest.Header.Set(c.authHeader, c.authToken) + httpRequest.Header.Set("cb-nft-api-token", c.authToken) } c.logger.Debug( diff --git a/internal/storage/blobstorage/gcs/blob_storage_integration_test.go b/internal/storage/blobstorage/gcs/blob_storage_integration_test.go index 3c7dae2d..0a896e67 100644 --- a/internal/storage/blobstorage/gcs/blob_storage_integration_test.go +++ b/internal/storage/blobstorage/gcs/blob_storage_integration_test.go @@ -106,6 +106,7 @@ func (s *gcpBlobStorageTestSuite) TestIntegrationGcsBlobStorageIntegration_GzipF } func TestIntegrationGcsBlobStorageTestSuite(t *testing.T) { + t.Skip() require := testutil.Require(t) cfg, err := config.New() require.NoError(err) diff --git a/internal/storage/metastorage/dynamodb/mocks/mocks.go b/internal/storage/metastorage/dynamodb/mocks/mocks.go index a5a1ec83..49f95473 100644 --- a/internal/storage/metastorage/dynamodb/mocks/mocks.go +++ b/internal/storage/metastorage/dynamodb/mocks/mocks.go @@ -474,6 +474,56 @@ func (mr *MockDynamoAPIMockRecorder) DeleteItemWithContext(arg0, arg1 any, arg2 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteItemWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).DeleteItemWithContext), varargs...) } +// DeleteResourcePolicy mocks base method. +func (m *MockDynamoAPI) DeleteResourcePolicy(arg0 *dynamodb.DeleteResourcePolicyInput) (*dynamodb.DeleteResourcePolicyOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteResourcePolicy", arg0) + ret0, _ := ret[0].(*dynamodb.DeleteResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteResourcePolicy indicates an expected call of DeleteResourcePolicy. +func (mr *MockDynamoAPIMockRecorder) DeleteResourcePolicy(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteResourcePolicy", reflect.TypeOf((*MockDynamoAPI)(nil).DeleteResourcePolicy), arg0) +} + +// DeleteResourcePolicyRequest mocks base method. +func (m *MockDynamoAPI) DeleteResourcePolicyRequest(arg0 *dynamodb.DeleteResourcePolicyInput) (*request.Request, *dynamodb.DeleteResourcePolicyOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteResourcePolicyRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*dynamodb.DeleteResourcePolicyOutput) + return ret0, ret1 +} + +// DeleteResourcePolicyRequest indicates an expected call of DeleteResourcePolicyRequest. +func (mr *MockDynamoAPIMockRecorder) DeleteResourcePolicyRequest(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteResourcePolicyRequest", reflect.TypeOf((*MockDynamoAPI)(nil).DeleteResourcePolicyRequest), arg0) +} + +// DeleteResourcePolicyWithContext mocks base method. +func (m *MockDynamoAPI) DeleteResourcePolicyWithContext(arg0 context.Context, arg1 *dynamodb.DeleteResourcePolicyInput, arg2 ...request.Option) (*dynamodb.DeleteResourcePolicyOutput, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteResourcePolicyWithContext", varargs...) + ret0, _ := ret[0].(*dynamodb.DeleteResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteResourcePolicyWithContext indicates an expected call of DeleteResourcePolicyWithContext. +func (mr *MockDynamoAPIMockRecorder) DeleteResourcePolicyWithContext(arg0, arg1 any, arg2 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteResourcePolicyWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).DeleteResourcePolicyWithContext), varargs...) +} + // DeleteTable mocks base method. func (m *MockDynamoAPI) DeleteTable(arg0 *dynamodb.DeleteTableInput) (*dynamodb.DeleteTableOutput, error) { m.ctrl.T.Helper() @@ -1474,6 +1524,56 @@ func (mr *MockDynamoAPIMockRecorder) GetItemWithContext(arg0, arg1 any, arg2 ... return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetItemWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).GetItemWithContext), varargs...) } +// GetResourcePolicy mocks base method. +func (m *MockDynamoAPI) GetResourcePolicy(arg0 *dynamodb.GetResourcePolicyInput) (*dynamodb.GetResourcePolicyOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetResourcePolicy", arg0) + ret0, _ := ret[0].(*dynamodb.GetResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetResourcePolicy indicates an expected call of GetResourcePolicy. +func (mr *MockDynamoAPIMockRecorder) GetResourcePolicy(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourcePolicy", reflect.TypeOf((*MockDynamoAPI)(nil).GetResourcePolicy), arg0) +} + +// GetResourcePolicyRequest mocks base method. +func (m *MockDynamoAPI) GetResourcePolicyRequest(arg0 *dynamodb.GetResourcePolicyInput) (*request.Request, *dynamodb.GetResourcePolicyOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetResourcePolicyRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*dynamodb.GetResourcePolicyOutput) + return ret0, ret1 +} + +// GetResourcePolicyRequest indicates an expected call of GetResourcePolicyRequest. +func (mr *MockDynamoAPIMockRecorder) GetResourcePolicyRequest(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourcePolicyRequest", reflect.TypeOf((*MockDynamoAPI)(nil).GetResourcePolicyRequest), arg0) +} + +// GetResourcePolicyWithContext mocks base method. +func (m *MockDynamoAPI) GetResourcePolicyWithContext(arg0 context.Context, arg1 *dynamodb.GetResourcePolicyInput, arg2 ...request.Option) (*dynamodb.GetResourcePolicyOutput, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetResourcePolicyWithContext", varargs...) + ret0, _ := ret[0].(*dynamodb.GetResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetResourcePolicyWithContext indicates an expected call of GetResourcePolicyWithContext. +func (mr *MockDynamoAPIMockRecorder) GetResourcePolicyWithContext(arg0, arg1 any, arg2 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourcePolicyWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).GetResourcePolicyWithContext), varargs...) +} + // ImportTable mocks base method. func (m *MockDynamoAPI) ImportTable(arg0 *dynamodb.ImportTableInput) (*dynamodb.ImportTableOutput, error) { m.ctrl.T.Helper() @@ -2056,6 +2156,56 @@ func (mr *MockDynamoAPIMockRecorder) PutItemWithContext(arg0, arg1 any, arg2 ... return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutItemWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).PutItemWithContext), varargs...) } +// PutResourcePolicy mocks base method. +func (m *MockDynamoAPI) PutResourcePolicy(arg0 *dynamodb.PutResourcePolicyInput) (*dynamodb.PutResourcePolicyOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutResourcePolicy", arg0) + ret0, _ := ret[0].(*dynamodb.PutResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutResourcePolicy indicates an expected call of PutResourcePolicy. +func (mr *MockDynamoAPIMockRecorder) PutResourcePolicy(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutResourcePolicy", reflect.TypeOf((*MockDynamoAPI)(nil).PutResourcePolicy), arg0) +} + +// PutResourcePolicyRequest mocks base method. +func (m *MockDynamoAPI) PutResourcePolicyRequest(arg0 *dynamodb.PutResourcePolicyInput) (*request.Request, *dynamodb.PutResourcePolicyOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutResourcePolicyRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*dynamodb.PutResourcePolicyOutput) + return ret0, ret1 +} + +// PutResourcePolicyRequest indicates an expected call of PutResourcePolicyRequest. +func (mr *MockDynamoAPIMockRecorder) PutResourcePolicyRequest(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutResourcePolicyRequest", reflect.TypeOf((*MockDynamoAPI)(nil).PutResourcePolicyRequest), arg0) +} + +// PutResourcePolicyWithContext mocks base method. +func (m *MockDynamoAPI) PutResourcePolicyWithContext(arg0 context.Context, arg1 *dynamodb.PutResourcePolicyInput, arg2 ...request.Option) (*dynamodb.PutResourcePolicyOutput, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PutResourcePolicyWithContext", varargs...) + ret0, _ := ret[0].(*dynamodb.PutResourcePolicyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutResourcePolicyWithContext indicates an expected call of PutResourcePolicyWithContext. +func (mr *MockDynamoAPIMockRecorder) PutResourcePolicyWithContext(arg0, arg1 any, arg2 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutResourcePolicyWithContext", reflect.TypeOf((*MockDynamoAPI)(nil).PutResourcePolicyWithContext), varargs...) +} + // Query mocks base method. func (m *MockDynamoAPI) Query(arg0 *dynamodb.QueryInput) (*dynamodb.QueryOutput, error) { m.ctrl.T.Helper() diff --git a/internal/storage/metastorage/firestore/block_storage_integration_test.go b/internal/storage/metastorage/firestore/block_storage_integration_test.go index 5caf68e0..f3eb2016 100644 --- a/internal/storage/metastorage/firestore/block_storage_integration_test.go +++ b/internal/storage/metastorage/firestore/block_storage_integration_test.go @@ -312,6 +312,7 @@ func (s *blockStorageTestSuite) equalProto(x, y any) { } func TestIntegrationBlockStorageTestSuite(t *testing.T) { + t.Skip() // TODO: speed up the tests before re-enabling TestAllEnvs. // testapp.TestAllEnvs(t, func(t *testing.T, cfg *config.Config) { // suite.Run(t, &blockStorageTestSuite{config: cfg}) diff --git a/internal/storage/metastorage/firestore/event_storage_integration_test.go b/internal/storage/metastorage/firestore/event_storage_integration_test.go index d7dcdd65..c84e1986 100644 --- a/internal/storage/metastorage/firestore/event_storage_integration_test.go +++ b/internal/storage/metastorage/firestore/event_storage_integration_test.go @@ -423,6 +423,7 @@ func (s *eventStorageTestSuite) TestGetEventsByBlockHeight() { } func TestIntegrationEventStorageTestSuite(t *testing.T) { + t.Skip() require := testutil.Require(t) // Test with eth-mainnet for stream version cfg, err := config.New() diff --git a/internal/storage/utils/compress.go b/internal/storage/utils/compress.go new file mode 100644 index 00000000..44ca1a1d --- /dev/null +++ b/internal/storage/utils/compress.go @@ -0,0 +1,115 @@ +package utils + +import ( + "bytes" + "compress/gzip" + "errors" + "fmt" + "io/ioutil" + "path/filepath" + + "github.com/klauspost/compress/zstd" + "golang.org/x/xerrors" + + api "github.com/coinbase/chainstorage/protos/coinbase/chainstorage" +) + +const ( + GzipFileSuffix = ".gzip" + ZstdFileSuffix = ".zstd" +) + +type Compressor interface { + Compress(data []byte) ([]byte, error) + Decompress(data []byte) ([]byte, error) + GetObjectKey(key string) string +} + +func GetCompressionType(fileURL string) api.Compression { + ext := filepath.Ext(fileURL) + switch ext { + case GzipFileSuffix: + return api.Compression_GZIP + case ZstdFileSuffix: + return api.Compression_ZSTD + } + return api.Compression_NONE +} + +func CompressorFactory(compressionType api.Compression) (Compressor, error) { + switch compressionType { + case api.Compression_GZIP: + return &GzipCompressor{}, nil + case api.Compression_ZSTD: + return &ZstdCompressor{}, nil + default: + return nil, errors.New("unsupported compression type") + } +} + +// ------ GZIP ------ +type GzipCompressor struct{} + +func (g *GzipCompressor) Compress(data []byte) ([]byte, error) { + var buf bytes.Buffer + writer := gzip.NewWriter(&buf) + + if _, err := writer.Write(data); err != nil { + return nil, xerrors.Errorf("failed to write compressed data with gzip: %w", err) + } + if err := writer.Close(); err != nil { + return nil, xerrors.Errorf("failed to close gzip writer: %w", err) + } + + return buf.Bytes(), nil +} + +func (g *GzipCompressor) Decompress(data []byte) ([]byte, error) { + reader, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, xerrors.Errorf("failed to initiate gzip reader: %w", err) + } + decoded, err := ioutil.ReadAll(reader) + if err != nil { + return nil, xerrors.Errorf("failed to read data: %w", err) + } + if err := reader.Close(); err != nil { + return nil, xerrors.Errorf("failed to close gzip reader: %w", err) + } + return decoded, nil +} + +func (g *GzipCompressor) GetObjectKey(key string) string { + return fmt.Sprintf("%s%s", key, GzipFileSuffix) +} + +// ------ ZSTD ------ +type ZstdCompressor struct{} + +func (z *ZstdCompressor) Compress(data []byte) ([]byte, error) { + writer, err := zstd.NewWriter(nil, zstd.WithEncoderLevel(zstd.SpeedDefault)) + if err != nil { + return nil, xerrors.Errorf("failed to write compressed data with zstd: %w", err) + } + if err := writer.Close(); err != nil { + return nil, xerrors.Errorf("failed to close zstd writer: %w", err) + } + return writer.EncodeAll(data, nil), nil +} + +func (z *ZstdCompressor) Decompress(data []byte) ([]byte, error) { + decoder, err := zstd.NewReader(nil) + if err != nil { + return nil, xerrors.Errorf("failed to initiate zstd reader: %w", err) + } + defer decoder.Close() + decoded, err := decoder.DecodeAll(data, nil) + if err != nil { + return nil, xerrors.Errorf("failed to read data with zstd: %w", err) + } + return decoded, nil +} + +func (z *ZstdCompressor) GetObjectKey(key string) string { + return fmt.Sprintf("%s%s", key, ZstdFileSuffix) +} diff --git a/internal/storage/utils/utils.go b/internal/storage/utils/utils.go index fd1a765e..e14fe2b7 100644 --- a/internal/storage/utils/utils.go +++ b/internal/storage/utils/utils.go @@ -1,81 +1,49 @@ package utils import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - "strings" - "golang.org/x/xerrors" api "github.com/coinbase/chainstorage/protos/coinbase/chainstorage" ) -const ( - GzipFileSuffix = ".gzip" -) - -func GetCompressionType(fileURL string) api.Compression { - if strings.HasSuffix(fileURL, GzipFileSuffix) { - return api.Compression_GZIP - } - return api.Compression_NONE -} - func Compress(data []byte, compression api.Compression) ([]byte, error) { if compression == api.Compression_NONE { return data, nil } - if compression == api.Compression_GZIP { - var buf bytes.Buffer - zw := gzip.NewWriter(&buf) - if _, err := zw.Write(data); err != nil { - return nil, xerrors.Errorf("failed to write compressed data: %w", err) - } - if err := zw.Close(); err != nil { - return nil, xerrors.Errorf("failed to close writer: %w", err) - } - - return buf.Bytes(), nil + compressor, err := CompressorFactory(compression) + if err != nil { + return nil, err } - - return nil, xerrors.Errorf("failed to compress with unsupported type %v", compression.String()) + coded, err := compressor.Compress(data) + if err != nil { + return nil, err + } + return coded, nil } func Decompress(data []byte, compression api.Compression) ([]byte, error) { if compression == api.Compression_NONE { return data, nil } - - if compression == api.Compression_GZIP { - zr, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, xerrors.Errorf("failed to initiate reader: %w", err) - } - decoded, err := ioutil.ReadAll(zr) - if err != nil { - return nil, xerrors.Errorf("failed to read data: %w", err) - } - if err := zr.Close(); err != nil { - return nil, xerrors.Errorf("failed to close reader: %w", err) - } - return decoded, nil + compressor, err := CompressorFactory(compression) + if err != nil { + return nil, err } - - return nil, xerrors.Errorf("failed to decompress with unsupported type %v", compression.String()) + decoded, err := compressor.Decompress(data) + if err != nil { + return nil, err + } + return decoded, nil } func GetObjectKey(key string, compression api.Compression) (string, error) { if compression == api.Compression_NONE { return key, nil } - - if compression == api.Compression_GZIP { - key = fmt.Sprintf("%s%s", key, GzipFileSuffix) - return key, nil + compressor, err := CompressorFactory(compression) + if err != nil { + return "", xerrors.Errorf("failed to Get Object Key with: %w", err) } - - return "", xerrors.Errorf("failed to get object key with unsupported type %v", compression.String()) + return compressor.GetObjectKey(key), nil } diff --git a/internal/storage/utils/utils_test.go b/internal/storage/utils/utils_test.go index e626d114..0ada79e2 100644 --- a/internal/storage/utils/utils_test.go +++ b/internal/storage/utils/utils_test.go @@ -1,6 +1,7 @@ package utils import ( + "bytes" "testing" "github.com/coinbase/chainstorage/internal/utils/testutil" @@ -24,6 +25,14 @@ func TestGetCompressionType(t *testing.T) { fileURL: "a.gzip", compression: api.Compression_GZIP, }, + { + fileURL: "bzstd", + compression: api.Compression_NONE, + }, + { + fileURL: "b.zstd", + compression: api.Compression_ZSTD, + }, } for _, test := range tests { t.Run(test.fileURL, func(t *testing.T) { @@ -54,6 +63,20 @@ func TestCompress(t *testing.T) { }`), api.Compression_GZIP, }, + { + "emptyData", + []byte{}, + api.Compression_ZSTD, + }, + { + "blockDataCompression", + []byte(` + { + "hash": "0xbaa42c", + "number": "0xacc290", + }`), + api.Compression_ZSTD, + }, { "blockData", []byte(` @@ -73,7 +96,7 @@ func TestCompress(t *testing.T) { decompressed, err := Decompress(compressed, test.compression) require.NoError(err) - require.Equal(decompressed, test.data) + require.True(bytes.Equal(decompressed, test.data)) }) } } @@ -94,6 +117,11 @@ func TestGetObjectKey(t *testing.T) { api.Compression_NONE, "key2", }, + { + "key3", + api.Compression_ZSTD, + "key3.zstd", + }, } for _, test := range tests { t.Run(test.key, func(t *testing.T) { diff --git a/internal/tally/prometheus_reporter.go b/internal/tally/prometheus_reporter.go new file mode 100644 index 00000000..3aaf35a8 --- /dev/null +++ b/internal/tally/prometheus_reporter.go @@ -0,0 +1,469 @@ +package tally + +import ( + "context" + "errors" + "fmt" + "maps" + "math" + "net/http" + "sort" + "strings" + "sync" + "time" + + "github.com/coinbase/chainstorage/internal/config" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/collectors" + "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/uber-go/tally/v4" + "go.uber.org/fx" + "go.uber.org/zap" +) + +var defaultBuckets = []float64{ + 0.1, 0.2, 0.3, 0.5, 0.7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 12, 15, 20, 25, 30, 40, 50, 75, 100, 200, 300, 500, 750, + 1000, 2000, 3000, 5000, 7000, 10000, +} + +type prometheusReporter struct { + stats *prometheusStats +} + +func newPrometheusReporter( + cfg *config.PrometheusConfig, + lifecycle fx.Lifecycle, + logger *zap.Logger, +) tally.StatsReporter { + opts := []prometheusStatsOption{} + if cfg.Namespace != "" { + opts = append(opts, withPrometheusNamespace(cfg.Namespace)) + } + if len(cfg.GlobalLabels) > 0 { + opts = append(opts, withPrometheusLabels(cfg.GlobalLabels)) + } + if len(cfg.DefaultHistogramBuckets) > 0 { + opts = append(opts, withDefaultPrometheusHistogramBuckets(defaultBuckets)) + } + if len(cfg.HistogramBuckets) > 0 { + opts = append(opts, withPrometheusHistogramBuckets(cfg.HistogramBuckets)) + } + + s := newPrometheusStats(logger, opts...) + + mux := http.NewServeMux() + + metricsPath := "/metrics" + if cfg.MetricsPath != "" { + metricsPath = cfg.MetricsPath + } + mux.Handle(metricsPath, s.MetricsHandler()) + + addr := fmt.Sprintf(":%d", cfg.Port) + srv := &http.Server{ + Addr: addr, + Handler: mux, + } + + lifecycle.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + logger.Info("prometheus metrics server starting", zap.String("address", addr)) + + go func() { + if err := srv.ListenAndServe(); err != nil { + if err != http.ErrServerClosed { + logger.Error("prometheus metrics server failed to start", zap.Error(err)) + } + } + }() + + return nil + }, + OnStop: func(ctx context.Context) error { + logger.Info("prometheus metrics server stopping", zap.String("address", addr)) + return srv.Shutdown(ctx) + }, + }) + + return &prometheusReporter{ + stats: s, + } +} + +func (p *prometheusReporter) labels() prometheus.Labels { + return p.stats.Labels() +} + +func (p *prometheusReporter) Capabilities() tally.Capabilities { + return p +} + +func (p *prometheusReporter) Reporting() bool { + return true +} + +func (p *prometheusReporter) Tagging() bool { + return true +} + +func (p *prometheusReporter) Flush() { + // no-op +} + +func (p *prometheusReporter) ReportCounter(name string, tags map[string]string, value int64) { + p.stats.Count(name, value, p.tags(tags)) +} + +func (p *prometheusReporter) ReportGauge(name string, tags map[string]string, value float64) { + p.stats.Gauge(name, value, p.tags(tags)) +} + +func (p *prometheusReporter) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound time.Duration, + bucketUpperBound time.Duration, + samples int64, +) { + panic("unimplemented") +} + +func (p *prometheusReporter) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound float64, + bucketUpperBound float64, + samples int64, +) { + panic("unimplemented") +} + +func (p *prometheusReporter) ReportTimer( + name string, + tags map[string]string, + interval time.Duration, +) { + p.stats.Timing(name, interval, p.tags(tags)) +} + +func (p *prometheusReporter) tags(tags map[string]string) map[string]string { + if len(tags) == 0 { + return p.labels() + } + + m := make(map[string]string) + maps.Copy(m, p.labels()) + maps.Copy(m, tags) + + return m +} + +type prometheusStats struct { + mux sync.RWMutex + logger *zap.Logger + + counters map[string]*prometheus.CounterVec + gauges map[string]*prometheus.GaugeVec + histograms map[string]*prometheus.HistogramVec + histogramBuckets map[string][]float64 + defaultBuckets []float64 + reg *prometheus.Registry + + globalLabels prometheus.Labels + namespace string +} + +type prometheusStatsOption func(*prometheusStats) + +func withPrometheusNamespace(namespace string) prometheusStatsOption { + return func(s *prometheusStats) { + s.namespace = namespace + } +} + +func withPrometheusLabels(labels map[string]string) prometheusStatsOption { + return func(s *prometheusStats) { + for k, v := range labels { + s.globalLabels[k] = v + } + } +} + +func withPrometheusHistogramBuckets(buckets map[string][]float64) prometheusStatsOption { + return func(s *prometheusStats) { + for k, v := range buckets { + s.histogramBuckets[k] = v + } + } +} + +func withDefaultPrometheusHistogramBuckets(buckets []float64) prometheusStatsOption { + return func(s *prometheusStats) { + s.defaultBuckets = buckets + } +} + +func newPrometheusStats(logger *zap.Logger, opts ...prometheusStatsOption) *prometheusStats { + s := &prometheusStats{ + logger: logger, + counters: make(map[string]*prometheus.CounterVec), + gauges: make(map[string]*prometheus.GaugeVec), + histograms: make(map[string]*prometheus.HistogramVec), + histogramBuckets: make(map[string][]float64), + defaultBuckets: defaultBuckets, + globalLabels: make(prometheus.Labels), + namespace: "", + reg: prometheus.NewRegistry(), + } + + // Add go runtime metrics and process collectors. + s.reg.MustRegister( + collectors.NewGoCollector(), + collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), + ) + + for _, opt := range opts { + opt(s) + } + + return s +} + +func (c *prometheusStats) Labels() prometheus.Labels { + return c.globalLabels +} + +func (c *prometheusStats) MetricsHandler() http.Handler { + return promhttp.HandlerFor(c.reg, promhttp.HandlerOpts{Registry: c.reg}) +} + +func (c *prometheusStats) Count(key string, n interface{}, tags map[string]string) { + v, err := toFloat64(n) + if err != nil { + return + } + + op, err := c.loadCount(key, tags) + if err != nil { + c.logger.Warn("prometheus.count.error", zap.Error(err)) + return + } + op.With(labels(tags)).Add(v) +} + +func (c *prometheusStats) Inc(key string, tags map[string]string) { + op, err := c.loadGauge(key, tags) + if err != nil { + c.logger.Warn("prometheus.inc.error", zap.Error(err)) + return + } + op.With(labels(tags)).Inc() +} + +func (c *prometheusStats) Dec(key string, tags map[string]string) { + op, err := c.loadGauge(key, tags) + if err != nil { + c.logger.Warn("prometheus.dec.error", zap.Error(err)) + return + } + op.With(labels(tags)).Dec() +} + +func (c *prometheusStats) Gauge(key string, n interface{}, tags map[string]string) { + v, err := toFloat64(n) + if err != nil { + return + } + + op, err := c.loadGauge(key, tags) + if err != nil { + c.logger.Warn("prometheus.gauge.error", zap.Error(err)) + return + } + op.With(labels(tags)).Set(v) +} + +func (c *prometheusStats) Histogram(key string, n interface{}, tags map[string]string) { + v, err := toFloat64(n) + if err != nil { + return + } + + op, err := c.loadHistogram(key, tags) + if err != nil { + c.logger.Warn("prometheus.histogram.error", zap.Error(err)) + return + } + op.With(labels(tags)).Observe(v) +} + +func (c *prometheusStats) Timing(key string, t time.Duration, tags map[string]string) { + op, err := c.loadHistogram(key, tags) + if err != nil { + c.logger.Warn("prometheus.timing.error", zap.Error(err)) + return + } + + op.With(labels(tags)).Observe(float64(t) / float64(time.Millisecond)) +} + +func (c *prometheusStats) loadGauge(key string, tags map[string]string) (*prometheus.GaugeVec, error) { + key = c.key(key) + id, labelNames := labelKey(key, tags) + + c.mux.RLock() + gauge, ok := c.gauges[id] + c.mux.RUnlock() + if ok { + return gauge, nil + } + + c.mux.Lock() + gauge, err := registerMetric(c.reg, prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: c.namespace, + Name: key, + ConstLabels: c.globalLabels, + }, labelNames)) + if err != nil { + c.mux.Unlock() + return nil, err + } + c.gauges[id] = gauge + c.mux.Unlock() + + return gauge, nil +} + +func (c *prometheusStats) loadCount(key string, tags map[string]string) (*prometheus.CounterVec, error) { + key = c.key(key) + id, labelNames := labelKey(key, tags) + + c.mux.RLock() + counter, ok := c.counters[id] + c.mux.RUnlock() + if ok { + return counter, nil + } + + c.mux.Lock() + counter, err := registerMetric(c.reg, prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: c.namespace, + Name: key, + ConstLabels: c.globalLabels, + }, labelNames)) + if err != nil { + c.mux.Unlock() + return nil, err + } + c.counters[id] = counter + c.mux.Unlock() + + return counter, nil +} + +func labelKey(key string, tags map[string]string) (id string, labelNames []string) { + for k := range labels(tags) { + labelNames = append(labelNames, k) + } + + sort.Strings(labelNames) + newKey := strings.Join(append([]string{key}, labelNames...), ".") + + return newKey, labelNames +} + +func (c *prometheusStats) loadHistogram(key string, tags map[string]string) (*prometheus.HistogramVec, error) { + key = c.key(key) + id, labelNames := labelKey(key, tags) + + c.mux.RLock() + histogram, registered := c.histograms[id] + histogramBuckets, hasBuckets := c.histogramBuckets[key] + c.mux.RUnlock() + + if registered { + return histogram, nil + } + + if !hasBuckets { + histogramBuckets = defaultBuckets + } + + c.mux.Lock() + histogram, err := registerMetric(c.reg, prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: c.namespace, + Name: key, + ConstLabels: c.globalLabels, + Buckets: histogramBuckets, + }, labelNames)) + if err != nil { + c.mux.Unlock() + return nil, err + } + c.histograms[id] = histogram + c.mux.Unlock() + + return histogram, nil +} + +func (c *prometheusStats) key(key string) string { + return strings.ReplaceAll(key, ".", "_") +} + +func labels(tags map[string]string) prometheus.Labels { + if len(tags) > 0 { + return prometheus.Labels(tags) + } + return prometheus.Labels{} +} + +func registerMetric[T prometheus.Collector]( + reg prometheus.Registerer, + metric T, +) (T, error) { + var err error + if reg != nil { + err = reg.Register(metric) + } else { + err = prometheus.Register(metric) + } + if err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + existing, ok := are.ExistingCollector.(T) + if !ok { + return metric, fmt.Errorf("metric with different type already exists") + } + + return existing, nil + } + } + + return metric, err +} + +func toFloat64(n interface{}) (float64, error) { + var v float64 + switch n := n.(type) { + case float64: + v = n + case float32: + v = float64(n) + case int: + v = float64(n) + case int8: + v = float64(n) + case int16: + v = float64(n) + case int32: + v = float64(n) + case int64: + v = float64(n) + default: + // NaN + return math.NaN(), errors.New("failed to convert value to float64") + } + return v, nil +} diff --git a/internal/tally/stats_reporter.go b/internal/tally/stats_reporter.go index 734d2a21..73bc3f2b 100644 --- a/internal/tally/stats_reporter.go +++ b/internal/tally/stats_reporter.go @@ -1,10 +1,6 @@ package tally import ( - "context" - "time" - - smirastatsd "github.com/smira/go-statsd" "github.com/uber-go/tally/v4" "go.uber.org/fx" "go.uber.org/zap" @@ -19,97 +15,15 @@ type ( Logger *zap.Logger Config *config.Config } - - reporter struct { - client *smirastatsd.Client - } -) - -const ( - reportingInterval = time.Second -) - -var ( - // hardcoding this to be datadog format - // we need think about whats the best way to set it up in config such that - // when we switch reporter impl, config will still be backward compatible - tagFormat = smirastatsd.TagFormatDatadog ) func NewStatsReporter(params StatsReporterParams) tally.StatsReporter { - if params.Config.StatsD == nil { + switch { + case params.Config.StatsD != nil: + return newStatsDReporter(params.Config.StatsD, params.Lifecycle, params.Logger) + case params.Config.Prometheus != nil: + return newPrometheusReporter(params.Config.Prometheus, params.Lifecycle, params.Logger) + default: return tally.NullStatsReporter } - cfg := params.Config.StatsD - client := smirastatsd.NewClient( - cfg.Address, - smirastatsd.MetricPrefix(cfg.Prefix), - smirastatsd.TagStyle(tagFormat), - smirastatsd.ReportInterval(reportingInterval), - ) - params.Logger.Info("initialized statsd client") - params.Lifecycle.Append(fx.Hook{ - OnStop: func(ctx context.Context) error { - return client.Close() - }, - }) - return &reporter{ - client: client, - } -} - -func convertTags(tagsMap map[string]string) []smirastatsd.Tag { - tags := make([]smirastatsd.Tag, 0, len(tagsMap)) - for key, value := range tagsMap { - tags = append(tags, smirastatsd.StringTag(key, value)) - } - return tags -} - -func (r *reporter) ReportCounter(name string, tags map[string]string, value int64) { - r.client.Incr(name, value, convertTags(tags)...) -} - -func (r *reporter) ReportGauge(name string, tags map[string]string, value float64) { - r.client.FGauge(name, value, convertTags(tags)...) -} - -func (r *reporter) ReportTimer(name string, tags map[string]string, value time.Duration) { - r.client.PrecisionTiming(name, value, convertTags(tags)...) -} - -func (r *reporter) ReportHistogramValueSamples( - name string, - tags map[string]string, - buckets tally.Buckets, - bucketLowerBound, - bucketUpperBound float64, - samples int64) { - panic("no implemented") -} - -func (r *reporter) ReportHistogramDurationSamples( - name string, - tags map[string]string, - buckets tally.Buckets, - bucketLowerBound, - bucketUpperBound time.Duration, - samples int64) { - panic("no implemented") -} - -func (r *reporter) Capabilities() tally.Capabilities { - return r -} - -func (r *reporter) Reporting() bool { - return true -} - -func (r *reporter) Tagging() bool { - return true -} - -func (r *reporter) Flush() { - // no-op } diff --git a/internal/tally/stats_reporter_test.go b/internal/tally/stats_reporter_test.go index 834a1cfa..cd263200 100644 --- a/internal/tally/stats_reporter_test.go +++ b/internal/tally/stats_reporter_test.go @@ -47,3 +47,28 @@ func TestNewReporterDefaultWithStatsD(t *testing.T) { require.Equal(true, reporter.Capabilities().Tagging()) }) } + +func TestNewReporterDefaultWithPrometheus(t *testing.T) { + testapp.TestAllConfigs(t, func(t *testing.T, cfg *config.Config) { + require := testutil.Require(t) + cfg.Prometheus = &config.PrometheusConfig{ + // use any available port + Port: 0, + } + + var reporter tally.StatsReporter + app := testapp.New( + t, + testapp.WithConfig(cfg), + fx.Provide(NewStatsReporter), + fx.Populate(&reporter), + ) + + // close app after the test so that the port is released + t.Cleanup(app.Close) + + require.NotEqual(tally.NullStatsReporter, reporter) + require.Equal(true, reporter.Capabilities().Reporting()) + require.Equal(true, reporter.Capabilities().Tagging()) + }) +} diff --git a/internal/tally/statsd_reporter.go b/internal/tally/statsd_reporter.go new file mode 100644 index 00000000..787d90d8 --- /dev/null +++ b/internal/tally/statsd_reporter.go @@ -0,0 +1,103 @@ +package tally + +import ( + "context" + "time" + + smirastatsd "github.com/smira/go-statsd" + "github.com/uber-go/tally/v4" + "go.uber.org/fx" + "go.uber.org/zap" + + "github.com/coinbase/chainstorage/internal/config" +) + +type statsDReporter struct { + client *smirastatsd.Client +} + +func newStatsDReporter( + cfg *config.StatsDConfig, + lifecycle fx.Lifecycle, + logger *zap.Logger, +) tally.StatsReporter { + // hardcoding this to be datadog format + // we need think about whats the best way to set it up in config such that + // when we switch reporter impl, config will still be backward compatible + tagFormat := smirastatsd.TagFormatDatadog + + client := smirastatsd.NewClient( + cfg.Address, + smirastatsd.MetricPrefix(cfg.Prefix), + smirastatsd.TagStyle(tagFormat), + smirastatsd.ReportInterval(reportingInterval), + ) + logger.Info("initialized statsd client") + lifecycle.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return client.Close() + }, + }) + + return &statsDReporter{ + client: client, + } +} + +func (r *statsDReporter) convertTags(tagsMap map[string]string) []smirastatsd.Tag { + tags := make([]smirastatsd.Tag, 0, len(tagsMap)) + for key, value := range tagsMap { + tags = append(tags, smirastatsd.StringTag(key, value)) + } + return tags +} + +func (r *statsDReporter) ReportCounter(name string, tags map[string]string, value int64) { + r.client.Incr(name, value, r.convertTags(tags)...) +} + +func (r *statsDReporter) ReportGauge(name string, tags map[string]string, value float64) { + r.client.FGauge(name, value, r.convertTags(tags)...) +} + +func (r *statsDReporter) ReportTimer(name string, tags map[string]string, value time.Duration) { + r.client.PrecisionTiming(name, value, r.convertTags(tags)...) +} + +func (r *statsDReporter) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { + panic("no implemented") +} + +func (r *statsDReporter) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { + panic("no implemented") +} + +func (r *statsDReporter) Capabilities() tally.Capabilities { + return r +} + +func (r *statsDReporter) Reporting() bool { + return true +} + +func (r *statsDReporter) Tagging() bool { + return true +} + +func (r *statsDReporter) Flush() { + // no-op +} diff --git a/internal/tally/tally.go b/internal/tally/tally.go index 9d065cb1..44090b49 100644 --- a/internal/tally/tally.go +++ b/internal/tally/tally.go @@ -2,6 +2,7 @@ package tally import ( "context" + "time" "github.com/uber-go/tally/v4" "go.uber.org/fx" @@ -10,6 +11,10 @@ import ( "github.com/coinbase/chainstorage/internal/utils/consts" ) +const ( + reportingInterval = time.Second +) + type ( MetricParams struct { fx.In @@ -25,8 +30,8 @@ func NewRootScope(params MetricParams) tally.Scope { Reporter: params.Reporter, Tags: params.Config.GetCommonTags(), } - //report interval will be set on reporter - scope, closer := tally.NewRootScope(opts, 0) + // report interval will be set on reporter + scope, closer := tally.NewRootScope(opts, reportingInterval) params.Lifecycle.Append(fx.Hook{ OnStop: func(ctx context.Context) error { return closer.Close() diff --git a/internal/utils/fixtures/parser/tron/raw_block_header.json b/internal/utils/fixtures/parser/tron/raw_block_header.json new file mode 100644 index 00000000..e3451e40 --- /dev/null +++ b/internal/utils/fixtures/parser/tron/raw_block_header.json @@ -0,0 +1,58 @@ +{ + "baseFeePerGas": "0x0", + "difficulty": "0x0", + "extraData": "0x", + "gasLimit": "0x2b3b43dc6", + "gasUsed": "0xb1006d", + "hash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "miner": "0x8b0359acac03bac62cbf89c4b787cb10b3c3f513", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "number": "0x4034f5c", + "parentHash": "0x0000000004034f5b43c5934257b3d1f1a313bba4af0a4dd2f778fda9e641b615", + "receiptsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sha3Uncles": "0x0000000000000000000000000000000000000000000000000000000000000000", + "size": "0x1a366", + "stateRoot": "0x", + "timestamp": "0x6745cb8a", + "totalDifficulty": "0x0", + "transactions": [ + { + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "from": "0x25a51e3e65287539b8d4eb559cbca4488a08bb00", + "gas": "0x1fced", + "gasPrice": "0xd2", + "hash": "0xd581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + "input": "0xa9059cbb0000000000000000000000009dc5da2b3c502661c8448ba88bacf7f0b22272ad0000000000000000000000000000000000000000000000000000000000027165", + "nonce": "0x0000000000000000", + "r": "0x8178c20b4100cdab4eadd22cefb4944504b51272d6693a4e5b4a00ae8b237313", + "s": "0x36acd444b8e94dc157824da1aba4325df38e2c8e806826f4c71b06148e88dd91", + "to": "0xa614f803b6fd780986a42c78ec9c7f77e6ded13c", + "transactionIndex": "0x0", + "type": "0x0", + "v": "0x1c", + "value": "0x0" + }, + { + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "from": "0x89ae01b878dffc8088222adf1fb08ebadfeea53a", + "gas": "0x12197", + "gasPrice": "0xd2", + "hash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "input": "0xaf6f48960000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6000000000000000000000000000000000000000000000000000000bf9e4899ba0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x0000000000000000", + "r": "0xe30301c81bcbdf7e69116543964366b84bd34606115cc5cae96927fb5214a6ea", + "s": "0x219db63879a044df44b855f6e481398942c9d5ab774a2a1fae16d3646f418e1f", + "to": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "transactionIndex": "0x45", + "type": "0x0", + "v": "0x1b", + "value": "0x0" + } + ], + "transactionsRoot": "0xd270690faa58558c2b03ae600334f71f9d5a0ad42d7313852fb3742e8576eec9", + "uncles": [] +} \ No newline at end of file diff --git a/internal/utils/fixtures/parser/tron/raw_block_trace_tx_info.json b/internal/utils/fixtures/parser/tron/raw_block_trace_tx_info.json new file mode 100644 index 00000000..05a98e16 --- /dev/null +++ b/internal/utils/fixtures/parser/tron/raw_block_trace_tx_info.json @@ -0,0 +1,191 @@ +[ + { + "log": [ + { + "address": "a614f803b6fd780986a42c78ec9c7f77e6ded13c", + "data": "0000000000000000000000000000000000000000000000000000000000027165", + "topics": [ + "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "00000000000000000000000025a51e3e65287539b8d4eb559cbca4488a08bb00", + "0000000000000000000000009dc5da2b3c502661c8448ba88bacf7f0b22272ad" + ] + } + ], + "blockNumber": 67325788, + "contractResult": [ + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "blockTimeStamp": 1732627338000, + "receipt": { + "result": "SUCCESS", + "energy_penalty_total": 100635, + "energy_usage": 130285, + "energy_usage_total": 130285, + "net_usage": 345 + }, + "id": "d581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + "contract_address": "41a614f803b6fd780986a42c78ec9c7f77e6ded13c" + }, + { + "log": [ + { + "address": "c60a6f5c81431c97ed01b61698b6853557f3afd4", + "data": "00000000000000000000000000000000000000000000000000000001f9873bc7000000000000000000000000000000000000000000000000093732ae413feb69000000000000000000000000000000000000000000000000093732b42dd59ebe0000000000000000000000000000000000000000000000000000801f33d9f651000000000000000000000000000000000000000000000000000000000036b158", + "topics": [ + "da6e3523d5765dedff9534b488c7e508318178571c144293451989755e9379e7", + "0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "address": "c60a6f5c81431c97ed01b61698b6853557f3afd4", + "data": "000000000000000000000000000000000000000000000000093732a856669e8f000000000000000000000000000000000000000000000000093732b42dd59ebe000000000000000000000000000000000000000000000000000000bf9e4899ba000000000000000000000000000000000000000000000000000000000000a3810000000000000000000000000000000000000000000000000000000000000000", + "topics": [ + "74fed619850adf4ba83cfb92b9566b424e3de6de4d9a7adc3b1909ea58421a55", + "00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "address": "c60a6f5c81431c97ed01b61698b6853557f3afd4", + "data": "000000000000000000000000000000000000000000000000000000bf9e4899ba", + "topics": [ + "f2def54ec5eba61fd8f18d019c7beaf6a47df317fb798b3263ad69ec227c9261", + "00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "address": "c60a6f5c81431c97ed01b61698b6853557f3afd4", + "data": "000000000000000000000000000000000000000000000000000000bf9e4899ba0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000c032ffd0000000000000000000000000000000000000000000000000000000054e4691a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093732b42dd59ebe", + "topics": [ + "f7e21d5bf17851f93ab7bda7e390841620f59dfbe9d86add32824f33bd40d3f5", + "00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6" + ] + } + ], + "blockNumber": 67325788, + "contractResult": [ + "0000000000000000000000000000000000000000000000000000000054e4691a" + ], + "blockTimeStamp": 1732627338000, + "fee": 379, + "receipt": { + "result": "SUCCESS", + "energy_usage": 68976, + "energy_usage_total": 74135, + "origin_energy_usage": 5159, + "net_fee": 379 + }, + "id": "e14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "contract_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "internal_transactions": [ + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "callValueInfo": [ + { + "callValue": 100 + }, + { + "callValue": 100 + } + ], + "hash": "499bdbdfaae021dd510c70b433bc48d88d8ca6e0b7aee13ce6d726114e365aaf" + }, + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "41e8667633c747066c70672c58207cc745a9860527", + "callValueInfo": [ + { + "tokenId": "1004777", + "callValue": 1000000000000000 + }, + { + "callValue": 1000 + } + ], + "hash": "997225b56440a9bd172f05f44a663830b72093a12502551cda99b0bc7c60cbc1" + }, + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "41e8667633c747066c70672c58207cc745a9860527", + "callValueInfo": [ + { + "tokenId": "1004777", + "callValue": 1000 + }, + { + "tokenId": "1004777", + "callValue": 100 + } + ], + "hash": "7ac8dd16dede5c512330f5033c8fd6f5390d742aa51b805f805098109eb54fe9" + }, + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "41c64e69acde1c7b16c2a3efcdbbdaa96c3644c2b3", + "callValueInfo": [ + { + "tokenId": "1004777", + "callValue": 100 + }, + { + "callValue": 100000 + } + ], + "hash": "cf6f699d9bdae8aa25fae310a06bb60a29a7812548cf3c1d83c737fd1a22c0ee" + }, + { + "caller_address": "41c64e69acde1c7b16c2a3efcdbbdaa96c3644c2b3", + "note": "63616c6c", + "transferTo_address": "41c64e69acde1c7b16c2a3efcdbbdaa96c3644c2b3", + "callValueInfo": [ + {} + ], + "hash": "95787b9a6558c7b6b624d0c1bece9723a7f4c3d414010b6ac105ae5f5aebffbc" + }, + { + "caller_address": "41c64e69acde1c7b16c2a3efcdbbdaa96c3644c2b3", + "note": "756e44656c65676174655265736f757263654f66456e65726779", + "transferTo_address": "414d12f87c18a914dddbc2b27f378ad126a79b76b6", + "callValueInfo": [ + { + "callValue": 822994311610 + }, + { + "callValue": 2000000 + } + + ], + "hash": "14526162e31d969ef0dca9b902d51ecc0ffab87dc936dce62022f368119043af" + }, + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "41e8667633c747066c70672c58207cc745a9860527", + "callValueInfo": [ + {} + ], + "hash": "8e088220a26ca8d794786e78096e71259cf8744cccdc4f07a8129aa8ee29bb98" + }, + { + "caller_address": "41c60a6f5c81431c97ed01b61698b6853557f3afd4", + "note": "63616c6c", + "transferTo_address": "4189ae01b878dffc8088222adf1fb08ebadfeea53a", + "callValueInfo": [ + { + "callValue": 1424255258 + } + ], + "hash": "83b1d41ba953aab4da6e474147f647599ea53bb3213306897127b57e85ddd1ca" + } + ] + } +] \ No newline at end of file diff --git a/internal/utils/fixtures/parser/tron/raw_block_tx_receipt.json b/internal/utils/fixtures/parser/tron/raw_block_tx_receipt.json new file mode 100644 index 00000000..e5f9a5bb --- /dev/null +++ b/internal/utils/fixtures/parser/tron/raw_block_tx_receipt.json @@ -0,0 +1,112 @@ +[ + { + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "contractAddress": null, + "cumulativeGasUsed": "0x1fced", + "effectiveGasPrice": "0xd2", + "from": "0x25a51e3e65287539b8d4eb559cbca4488a08bb00", + "gasUsed": "0x1fced", + "logs": [ + { + "address": "0xa614f803b6fd780986a42c78ec9c7f77e6ded13c", + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "data": "0x0000000000000000000000000000000000000000000000000000000000027165", + "logIndex": "0x0", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000025a51e3e65287539b8d4eb559cbca4488a08bb00", + "0x0000000000000000000000009dc5da2b3c502661c8448ba88bacf7f0b22272ad" + ], + "transactionHash": "0xd581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + "transactionIndex": "0x0" + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xa614f803b6fd780986a42c78ec9c7f77e6ded13c", + "transactionHash": "0xd581afa9158fbed69fb10d6a2245ad45d912a3da03ff24d59f3d2f6df6fd9529", + "transactionIndex": "0x0", + "type": "0x0" + }, + { + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "contractAddress": null, + "cumulativeGasUsed": "0x15dc77", + "effectiveGasPrice": "0xd2", + "from": "0x89ae01b878dffc8088222adf1fb08ebadfeea53a", + "gasUsed": "0x12197", + "logs": [ + { + "address": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "data": "0x00000000000000000000000000000000000000000000000000000001f9873bc7000000000000000000000000000000000000000000000000093732ae413feb69000000000000000000000000000000000000000000000000093732b42dd59ebe0000000000000000000000000000000000000000000000000000801f33d9f651000000000000000000000000000000000000000000000000000000000036b158", + "logIndex": "0x10", + "removed": false, + "topics": [ + "0xda6e3523d5765dedff9534b488c7e508318178571c144293451989755e9379e7", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "transactionIndex": "0x45" + }, + { + "address": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "data": "0x000000000000000000000000000000000000000000000000093732a856669e8f000000000000000000000000000000000000000000000000093732b42dd59ebe000000000000000000000000000000000000000000000000000000bf9e4899ba000000000000000000000000000000000000000000000000000000000000a3810000000000000000000000000000000000000000000000000000000000000000", + "logIndex": "0x11", + "removed": false, + "topics": [ + "0x74fed619850adf4ba83cfb92b9566b424e3de6de4d9a7adc3b1909ea58421a55", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "transactionIndex": "0x45" + }, + { + "address": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "data": "0x000000000000000000000000000000000000000000000000000000bf9e4899ba", + "logIndex": "0x12", + "removed": false, + "topics": [ + "0xf2def54ec5eba61fd8f18d019c7beaf6a47df317fb798b3263ad69ec227c9261", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "transactionIndex": "0x45" + }, + { + "address": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "blockHash": "0x0000000004034f5cd8946001c721db6457608ad887b3734c825d55826c3c3c87", + "blockNumber": "0x4034f5c", + "data": "0x000000000000000000000000000000000000000000000000000000bf9e4899ba0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000c032ffd0000000000000000000000000000000000000000000000000000000054e4691a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093732b42dd59ebe", + "logIndex": "0x13", + "removed": false, + "topics": [ + "0xf7e21d5bf17851f93ab7bda7e390841620f59dfbe9d86add32824f33bd40d3f5", + "0x00000000000000000000000089ae01b878dffc8088222adf1fb08ebadfeea53a", + "0x0000000000000000000000004d12f87c18a914dddbc2b27f378ad126a79b76b6" + ], + "transactionHash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "transactionIndex": "0x45" + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xc60a6f5c81431c97ed01b61698b6853557f3afd4", + "transactionHash": "0xe14935e6144007163609bb49292897ba81bf7ee93bf28ba4cc5ebd0d6b95f4b9", + "transactionIndex": "0x45", + "type": "0x0" + } +] \ No newline at end of file diff --git a/internal/utils/instrument/instrument.go b/internal/utils/instrument/instrument.go index ada8e15d..cd4961da 100644 --- a/internal/utils/instrument/instrument.go +++ b/internal/utils/instrument/instrument.go @@ -244,7 +244,7 @@ func (i *instrumentWithResult[T]) onSuccess(logger *zap.Logger, span tracer.Span func (i *instrumentWithResult[T]) onSuccessWithFilter(logger *zap.Logger, span tracer.Span, finishTime time.Time, err error) { i.successWithFilter.Inc(1) - logger.Info(i.loggerMsg, zap.Error(err)) + logger.Debug(i.loggerMsg, zap.Error(err)) span.Finish(tracer.FinishTime(finishTime), tracer.WithError(err)) } diff --git a/internal/workflow/activity/activity.go b/internal/workflow/activity/activity.go index 62545d39..323ebe35 100644 --- a/internal/workflow/activity/activity.go +++ b/internal/workflow/activity/activity.go @@ -28,6 +28,7 @@ const ( ActivityEventLoader = "activity.event_loader" ActivityReplicator = "activity.replicator" ActivityUpdateWatermark = "activity.update_watermark" + ActivityLatestBlock = "activity.latest_block" loggerMsg = "activity.request" diff --git a/internal/workflow/activity/latest_block.go b/internal/workflow/activity/latest_block.go new file mode 100644 index 00000000..99d02560 --- /dev/null +++ b/internal/workflow/activity/latest_block.go @@ -0,0 +1,78 @@ +package activity + +import ( + "context" + + "go.temporal.io/sdk/workflow" + "go.uber.org/fx" + "go.uber.org/zap" + "golang.org/x/xerrors" + + "github.com/coinbase/chainstorage/internal/cadence" + "github.com/coinbase/chainstorage/internal/config" + "github.com/coinbase/chainstorage/internal/gateway" + "github.com/coinbase/chainstorage/internal/utils/fxparams" + api "github.com/coinbase/chainstorage/protos/coinbase/chainstorage" +) + +type ( + LatestBlock struct { + baseActivity + config *config.Config + logger *zap.Logger + client gateway.Client + } + + LatestBlockParams struct { + fx.In + fxparams.Params + Runtime cadence.Runtime + Client gateway.Client + } + + LatestBlockRequest struct { + } + + LatestBlockResponse struct { + Height uint64 + } +) + +func NewLatestBlock(params LatestBlockParams) *LatestBlock { + r := &LatestBlock{ + baseActivity: newBaseActivity(ActivityLatestBlock, params.Runtime), + config: params.Config, + logger: params.Logger, + client: params.Client, + } + r.register(r.execute) + return r +} + +func (r *LatestBlock) Execute(ctx workflow.Context, request *LatestBlockRequest) (*LatestBlockResponse, error) { + var response LatestBlockResponse + err := r.executeActivity(ctx, request, &response) + return &response, err +} + +func (r *LatestBlock) execute(ctx context.Context, request *LatestBlockRequest) (*LatestBlockResponse, error) { + if err := r.validateRequest(request); err != nil { + return nil, err + } + + logger := r.getLogger(ctx).With(zap.Reflect("request", request)) + + latestBlock, err := r.client.GetLatestBlock(ctx, &api.GetLatestBlockRequest{}) + if err != nil { + return nil, xerrors.Errorf("failed to get chainstorage latest block: %w", err) + } + + logger.Debug("GetLatestBlock", + zap.Uint64("height", latestBlock.GetHeight()), + zap.String("hash", latestBlock.GetHash()), + ) + + return &LatestBlockResponse{ + Height: latestBlock.GetHeight(), + }, nil +} diff --git a/internal/workflow/activity/module.go b/internal/workflow/activity/module.go index c7391883..7df9333d 100644 --- a/internal/workflow/activity/module.go +++ b/internal/workflow/activity/module.go @@ -18,5 +18,6 @@ var Module = fx.Options( fx.Provide(NewEventReconciler), fx.Provide(NewEventLoader), fx.Provide(NewReplicator), + fx.Provide(NewLatestBlock), fx.Provide(NewUpdateWatermark), ) diff --git a/internal/workflow/activity/replicator.go b/internal/workflow/activity/replicator.go index aea3aa69..27d27a66 100644 --- a/internal/workflow/activity/replicator.go +++ b/internal/workflow/activity/replicator.go @@ -6,6 +6,8 @@ import ( "net/http" "time" + "google.golang.org/protobuf/types/known/timestamppb" + "go.temporal.io/sdk/workflow" "go.uber.org/fx" "go.uber.org/zap" @@ -67,8 +69,10 @@ type ( } ReplicatorResponse struct { - StartHeight uint64 - EndHeight uint64 + StartHeight uint64 + EndHeight uint64 + LatestBlockHeight uint64 + LatestBlockTimestamp *timestamppb.Timestamp } ) @@ -258,7 +262,9 @@ func (a *Replicator) execute(ctx context.Context, request *ReplicatorRequest) (* } return &ReplicatorResponse{ - StartHeight: request.StartHeight, - EndHeight: request.EndHeight, + StartHeight: request.StartHeight, + EndHeight: request.EndHeight, + LatestBlockHeight: blockMetas[len(blockMetas)-1].Height, + LatestBlockTimestamp: blockMetas[len(blockMetas)-1].Timestamp, }, nil } diff --git a/internal/workflow/backfiller.go b/internal/workflow/backfiller.go index 2d239069..eb9740ea 100644 --- a/internal/workflow/backfiller.go +++ b/internal/workflow/backfiller.go @@ -78,7 +78,11 @@ func NewBackfiller(params BackfillerParams) *Backfiller { } func (w *Backfiller) Execute(ctx context.Context, request *BackfillerRequest) (client.WorkflowRun, error) { - return w.startWorkflow(ctx, w.name, request) + workflowId := w.name + if v, ok := ctx.Value("workflowId").(string); ok && v != "" { + workflowId = v + } + return w.startWorkflow(ctx, workflowId, request) } func (w *Backfiller) execute(ctx workflow.Context, request *BackfillerRequest) error { diff --git a/internal/workflow/replicator.go b/internal/workflow/replicator.go index d4f9ea9f..0cc32edf 100644 --- a/internal/workflow/replicator.go +++ b/internal/workflow/replicator.go @@ -3,6 +3,7 @@ package workflow import ( "context" "strconv" + "time" "go.temporal.io/sdk/client" "go.temporal.io/sdk/workflow" @@ -22,6 +23,7 @@ type ( Replicator struct { baseWorkflow replicator *activity.Replicator + latestBLock *activity.LatestBlock updateWatermark *activity.UpdateWatermark } @@ -30,22 +32,34 @@ type ( fxparams.Params Runtime cadence.Runtime Replicator *activity.Replicator + LatestBLock *activity.LatestBlock UpdateWatermark *activity.UpdateWatermark } ReplicatorRequest struct { Tag uint32 StartHeight uint64 - EndHeight uint64 `validate:"gt=0,gtfield=StartHeight"` + EndHeight uint64 `validate:"eq=0|gtfield=StartHeight"` UpdateWatermark bool DataCompression string // Optional. If not specified, it is read from the workflow config. BatchSize uint64 // Optional. If not specified, it is read from the workflow config. MiniBatchSize uint64 // Optional. If not specified, it is read from the workflow config. CheckpointSize uint64 // Optional. If not specified, it is read from the workflow config. Parallelism int // Optional. If not specified, it is read from the workflow config. + ContinuousSync bool // Optional. Whether to continuously sync data + SyncInterval string // Optional. Interval for continuous sync } ) +const defaultSyncInterval = 1 * time.Minute + +const ( + // Replicator metrics. need to have `workflow.replicator` as prefix + replicatorHeightGauge = "workflow.replicator.height" + replicatorGapGauge = "workflow.replicator.gap" + replicatorTimeSinceLastBlockGauge = "workflow.replicator.time_since_last_block" +) + // GetTags implements InstrumentedRequest. func (r *ReplicatorRequest) GetTags() map[string]string { return map[string]string{ @@ -61,6 +75,7 @@ func NewReplicator(params ReplicatorParams) *Replicator { w := &Replicator{ baseWorkflow: newBaseWorkflow(¶ms.Config.Workflows.Replicator, params.Runtime), replicator: params.Replicator, + latestBLock: params.LatestBLock, updateWatermark: params.UpdateWatermark, } w.registerWorkflow(w.execute) @@ -121,6 +136,27 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e logger.Info("workflow started", zap.Uint64("batchSize", batchSize)) ctx = w.withActivityOptions(ctx) + metrics := w.runtime.GetMetricsHandler(ctx).WithTags(map[string]string{ + tagBlockTag: strconv.Itoa(int(request.Tag)), + }) + + syncInterval := defaultSyncInterval + if request.SyncInterval != "" { + interval, err := time.ParseDuration(request.SyncInterval) + if err == nil { + syncInterval = interval + } + } + + if request.ContinuousSync && request.EndHeight == 0 { + latestBlockResponse, err := w.latestBLock.Execute(ctx, &activity.LatestBlockRequest{}) + if err != nil { + return xerrors.Errorf("failed to get latest block through activity: %w", err) + } + var chainConfig config.ChainConfig + request.EndHeight = latestBlockResponse.Height - chainConfig.IrreversibleDistance + } + for startHeight := request.StartHeight; startHeight < request.EndHeight; startHeight = startHeight + batchSize { if startHeight >= request.StartHeight+checkpointSize { newRequest := *request @@ -148,6 +184,9 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e reprocessChannel := workflow.NewNamedBufferedChannel(ctx, "replicator.reprocess", miniBatchCount) defer reprocessChannel.Close() + responsesChannel := workflow.NewNamedBufferedChannel(ctx, "replicator.mini-batches.response", parallelism+miniBatchCount) + defer responsesChannel.Close() + // Phase 1: running mini batches in parallel. for i := 0; i < parallelism; i++ { workflow.Go(ctx, func(ctx workflow.Context) { @@ -161,7 +200,7 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e if batchEnd > endHeight { batchEnd = endHeight } - _, err := w.replicator.Execute(ctx, &activity.ReplicatorRequest{ + replicatorResponse, err := w.replicator.Execute(ctx, &activity.ReplicatorRequest{ Tag: tag, StartHeight: batchStart, EndHeight: batchEnd, @@ -176,6 +215,7 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e zap.Error(err), ) } + responsesChannel.Send(ctx, *replicatorResponse) } }) } @@ -192,7 +232,7 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e if batchEnd > endHeight { batchEnd = endHeight } - _, err := w.replicator.Execute(ctx, &activity.ReplicatorRequest{ + retryResponse, err := w.replicator.Execute(ctx, &activity.ReplicatorRequest{ Tag: tag, StartHeight: batchStart, EndHeight: batchEnd, @@ -202,19 +242,56 @@ func (w *Replicator) execute(ctx workflow.Context, request *ReplicatorRequest) e if err != nil { return xerrors.Errorf("failed to replicate block from %d to %d: %w", batchStart, batchEnd, err) } + responsesChannel.Send(ctx, *retryResponse) } // Phase 3: update watermark if request.UpdateWatermark { + var validateStart uint64 + if startHeight == 0 { + validateStart = startHeight + } else { + validateStart = startHeight - 1 + } _, err := w.updateWatermark.Execute(ctx, &activity.UpdateWatermarkRequest{ Tag: request.Tag, - ValidateStart: startHeight - 1, + ValidateStart: validateStart, BlockHeight: endHeight - 1, }) if err != nil { return xerrors.Errorf("failed to update watermark: %w", err) } } + + var latestResp activity.ReplicatorResponse + for { + var resp activity.ReplicatorResponse + if ok := responsesChannel.ReceiveAsync(&resp); !ok { + break + } + if resp.LatestBlockHeight > latestResp.LatestBlockHeight { + latestResp = resp + } + } + if latestResp != (activity.ReplicatorResponse{}) { + metrics.Gauge(replicatorHeightGauge).Update(float64(latestResp.LatestBlockHeight)) + metrics.Gauge(replicatorGapGauge).Update(float64(request.EndHeight - latestResp.LatestBlockHeight + 1)) + metrics.Gauge(replicatorTimeSinceLastBlockGauge).Update(utils.SinceTimestamp(latestResp.LatestBlockTimestamp).Seconds()) + } + } + + if request.ContinuousSync { + logger.Info("new continuous sync workflow") + newRequest := *request + newRequest.StartHeight = request.EndHeight + newRequest.EndHeight = 0 + // Wait for syncInterval minutes before starting a new continuous sync workflow. + err := workflow.Sleep(ctx, syncInterval) + if err != nil { + return xerrors.Errorf("workflow await failed: %w", err) + } + logger.Info("start new continuous sync workflow") + return workflow.NewContinueAsNewError(ctx, w.name, &newRequest) } logger.Info("workflow finished") diff --git a/protos/coinbase/c3/common/common.pb.go b/protos/coinbase/c3/common/common.pb.go index 3b82eadc..e88a03ef 100644 --- a/protos/coinbase/c3/common/common.pb.go +++ b/protos/coinbase/c3/common/common.pb.go @@ -25,19 +25,23 @@ const ( type Blockchain int32 const ( - Blockchain_BLOCKCHAIN_UNKNOWN Blockchain = 0 - Blockchain_BLOCKCHAIN_SOLANA Blockchain = 11 - Blockchain_BLOCKCHAIN_BITCOIN Blockchain = 16 - Blockchain_BLOCKCHAIN_ETHEREUM Blockchain = 17 - Blockchain_BLOCKCHAIN_DOGECOIN Blockchain = 26 - Blockchain_BLOCKCHAIN_BSC Blockchain = 31 - Blockchain_BLOCKCHAIN_AVACCHAIN Blockchain = 32 - Blockchain_BLOCKCHAIN_POLYGON Blockchain = 35 - Blockchain_BLOCKCHAIN_OPTIMISM Blockchain = 39 - Blockchain_BLOCKCHAIN_ARBITRUM Blockchain = 41 - Blockchain_BLOCKCHAIN_APTOS Blockchain = 47 // L1 network using the Move language (originally created for Libra/Diem) - Blockchain_BLOCKCHAIN_FANTOM Blockchain = 51 - Blockchain_BLOCKCHAIN_BASE Blockchain = 56 // Coinbase L2 + Blockchain_BLOCKCHAIN_UNKNOWN Blockchain = 0 + Blockchain_BLOCKCHAIN_SOLANA Blockchain = 11 + Blockchain_BLOCKCHAIN_BITCOIN Blockchain = 16 + Blockchain_BLOCKCHAIN_ETHEREUM Blockchain = 17 + Blockchain_BLOCKCHAIN_BITCOINCASH Blockchain = 18 + Blockchain_BLOCKCHAIN_LITECOIN Blockchain = 19 + Blockchain_BLOCKCHAIN_DOGECOIN Blockchain = 26 + Blockchain_BLOCKCHAIN_TRON Blockchain = 30 + Blockchain_BLOCKCHAIN_BSC Blockchain = 31 + Blockchain_BLOCKCHAIN_AVACCHAIN Blockchain = 32 + Blockchain_BLOCKCHAIN_POLYGON Blockchain = 35 + Blockchain_BLOCKCHAIN_OPTIMISM Blockchain = 39 + Blockchain_BLOCKCHAIN_ARBITRUM Blockchain = 41 + Blockchain_BLOCKCHAIN_APTOS Blockchain = 47 // L1 network using the Move language (originally created for Libra/Diem) + Blockchain_BLOCKCHAIN_FANTOM Blockchain = 51 + Blockchain_BLOCKCHAIN_BASE Blockchain = 56 // Coinbase L2 + Blockchain_BLOCKCHAIN_STORY Blockchain = 60 ) // Enum value maps for Blockchain. @@ -47,7 +51,10 @@ var ( 11: "BLOCKCHAIN_SOLANA", 16: "BLOCKCHAIN_BITCOIN", 17: "BLOCKCHAIN_ETHEREUM", + 18: "BLOCKCHAIN_BITCOINCASH", + 19: "BLOCKCHAIN_LITECOIN", 26: "BLOCKCHAIN_DOGECOIN", + 30: "BLOCKCHAIN_TRON", 31: "BLOCKCHAIN_BSC", 32: "BLOCKCHAIN_AVACCHAIN", 35: "BLOCKCHAIN_POLYGON", @@ -56,21 +63,26 @@ var ( 47: "BLOCKCHAIN_APTOS", 51: "BLOCKCHAIN_FANTOM", 56: "BLOCKCHAIN_BASE", + 60: "BLOCKCHAIN_STORY", } Blockchain_value = map[string]int32{ - "BLOCKCHAIN_UNKNOWN": 0, - "BLOCKCHAIN_SOLANA": 11, - "BLOCKCHAIN_BITCOIN": 16, - "BLOCKCHAIN_ETHEREUM": 17, - "BLOCKCHAIN_DOGECOIN": 26, - "BLOCKCHAIN_BSC": 31, - "BLOCKCHAIN_AVACCHAIN": 32, - "BLOCKCHAIN_POLYGON": 35, - "BLOCKCHAIN_OPTIMISM": 39, - "BLOCKCHAIN_ARBITRUM": 41, - "BLOCKCHAIN_APTOS": 47, - "BLOCKCHAIN_FANTOM": 51, - "BLOCKCHAIN_BASE": 56, + "BLOCKCHAIN_UNKNOWN": 0, + "BLOCKCHAIN_SOLANA": 11, + "BLOCKCHAIN_BITCOIN": 16, + "BLOCKCHAIN_ETHEREUM": 17, + "BLOCKCHAIN_BITCOINCASH": 18, + "BLOCKCHAIN_LITECOIN": 19, + "BLOCKCHAIN_DOGECOIN": 26, + "BLOCKCHAIN_TRON": 30, + "BLOCKCHAIN_BSC": 31, + "BLOCKCHAIN_AVACCHAIN": 32, + "BLOCKCHAIN_POLYGON": 35, + "BLOCKCHAIN_OPTIMISM": 39, + "BLOCKCHAIN_ARBITRUM": 41, + "BLOCKCHAIN_APTOS": 47, + "BLOCKCHAIN_FANTOM": 51, + "BLOCKCHAIN_BASE": 56, + "BLOCKCHAIN_STORY": 60, } ) @@ -106,33 +118,40 @@ func (Blockchain) EnumDescriptor() ([]byte, []int) { type Network int32 const ( - Network_NETWORK_UNKNOWN Network = 0 - Network_NETWORK_SOLANA_MAINNET Network = 22 - Network_NETWORK_SOLANA_TESTNET Network = 23 - Network_NETWORK_BITCOIN_MAINNET Network = 33 - Network_NETWORK_BITCOIN_TESTNET Network = 34 - Network_NETWORK_ETHEREUM_MAINNET Network = 35 - Network_NETWORK_ETHEREUM_TESTNET Network = 36 - Network_NETWORK_ETHEREUM_GOERLI Network = 66 - Network_NETWORK_DOGECOIN_MAINNET Network = 56 - Network_NETWORK_DOGECOIN_TESTNET Network = 57 - Network_NETWORK_BSC_MAINNET Network = 70 - Network_NETWORK_BSC_TESTNET Network = 71 - Network_NETWORK_AVACCHAIN_MAINNET Network = 72 - Network_NETWORK_AVACCHAIN_TESTNET Network = 73 - Network_NETWORK_POLYGON_MAINNET Network = 78 - Network_NETWORK_POLYGON_TESTNET Network = 79 - Network_NETWORK_OPTIMISM_MAINNET Network = 86 - Network_NETWORK_OPTIMISM_TESTNET Network = 87 - Network_NETWORK_ARBITRUM_MAINNET Network = 91 - Network_NETWORK_ARBITRUM_TESTNET Network = 92 - Network_NETWORK_APTOS_MAINNET Network = 103 - Network_NETWORK_APTOS_TESTNET Network = 104 - Network_NETWORK_FANTOM_MAINNET Network = 111 - Network_NETWORK_FANTOM_TESTNET Network = 112 - Network_NETWORK_BASE_MAINNET Network = 123 // Coinbase L2 running on Ethereum mainnet - Network_NETWORK_BASE_GOERLI Network = 125 // Coinbase L2 running on Ethereum Goerli - Network_NETWORK_ETHEREUM_HOLESKY Network = 136 + Network_NETWORK_UNKNOWN Network = 0 + Network_NETWORK_SOLANA_MAINNET Network = 22 + Network_NETWORK_SOLANA_TESTNET Network = 23 + Network_NETWORK_BITCOIN_MAINNET Network = 33 + Network_NETWORK_BITCOIN_TESTNET Network = 34 + Network_NETWORK_ETHEREUM_MAINNET Network = 35 + Network_NETWORK_ETHEREUM_TESTNET Network = 36 + Network_NETWORK_BITCOINCASH_MAINNET Network = 37 + Network_NETWORK_BITCOINCASH_TESTNET Network = 38 + Network_NETWORK_LITECOIN_MAINNET Network = 39 + Network_NETWORK_LITECOIN_TESTNET Network = 40 + Network_NETWORK_TRON_MAINNET Network = 64 + Network_NETWORK_TRON_TESTNET Network = 65 + Network_NETWORK_ETHEREUM_GOERLI Network = 66 + Network_NETWORK_DOGECOIN_MAINNET Network = 56 + Network_NETWORK_DOGECOIN_TESTNET Network = 57 + Network_NETWORK_BSC_MAINNET Network = 70 + Network_NETWORK_BSC_TESTNET Network = 71 + Network_NETWORK_AVACCHAIN_MAINNET Network = 72 + Network_NETWORK_AVACCHAIN_TESTNET Network = 73 + Network_NETWORK_POLYGON_MAINNET Network = 78 + Network_NETWORK_POLYGON_TESTNET Network = 79 + Network_NETWORK_OPTIMISM_MAINNET Network = 86 + Network_NETWORK_OPTIMISM_TESTNET Network = 87 + Network_NETWORK_ARBITRUM_MAINNET Network = 91 + Network_NETWORK_ARBITRUM_TESTNET Network = 92 + Network_NETWORK_APTOS_MAINNET Network = 103 + Network_NETWORK_APTOS_TESTNET Network = 104 + Network_NETWORK_FANTOM_MAINNET Network = 111 + Network_NETWORK_FANTOM_TESTNET Network = 112 + Network_NETWORK_BASE_MAINNET Network = 123 // Coinbase L2 running on Ethereum mainnet + Network_NETWORK_BASE_GOERLI Network = 125 // Coinbase L2 running on Ethereum Goerli + Network_NETWORK_ETHEREUM_HOLESKY Network = 136 + Network_NETWORK_STORY_MAINNET Network = 140 ) // Enum value maps for Network. @@ -145,6 +164,12 @@ var ( 34: "NETWORK_BITCOIN_TESTNET", 35: "NETWORK_ETHEREUM_MAINNET", 36: "NETWORK_ETHEREUM_TESTNET", + 37: "NETWORK_BITCOINCASH_MAINNET", + 38: "NETWORK_BITCOINCASH_TESTNET", + 39: "NETWORK_LITECOIN_MAINNET", + 40: "NETWORK_LITECOIN_TESTNET", + 64: "NETWORK_TRON_MAINNET", + 65: "NETWORK_TRON_TESTNET", 66: "NETWORK_ETHEREUM_GOERLI", 56: "NETWORK_DOGECOIN_MAINNET", 57: "NETWORK_DOGECOIN_TESTNET", @@ -165,35 +190,43 @@ var ( 123: "NETWORK_BASE_MAINNET", 125: "NETWORK_BASE_GOERLI", 136: "NETWORK_ETHEREUM_HOLESKY", + 140: "NETWORK_STORY_MAINNET", } Network_value = map[string]int32{ - "NETWORK_UNKNOWN": 0, - "NETWORK_SOLANA_MAINNET": 22, - "NETWORK_SOLANA_TESTNET": 23, - "NETWORK_BITCOIN_MAINNET": 33, - "NETWORK_BITCOIN_TESTNET": 34, - "NETWORK_ETHEREUM_MAINNET": 35, - "NETWORK_ETHEREUM_TESTNET": 36, - "NETWORK_ETHEREUM_GOERLI": 66, - "NETWORK_DOGECOIN_MAINNET": 56, - "NETWORK_DOGECOIN_TESTNET": 57, - "NETWORK_BSC_MAINNET": 70, - "NETWORK_BSC_TESTNET": 71, - "NETWORK_AVACCHAIN_MAINNET": 72, - "NETWORK_AVACCHAIN_TESTNET": 73, - "NETWORK_POLYGON_MAINNET": 78, - "NETWORK_POLYGON_TESTNET": 79, - "NETWORK_OPTIMISM_MAINNET": 86, - "NETWORK_OPTIMISM_TESTNET": 87, - "NETWORK_ARBITRUM_MAINNET": 91, - "NETWORK_ARBITRUM_TESTNET": 92, - "NETWORK_APTOS_MAINNET": 103, - "NETWORK_APTOS_TESTNET": 104, - "NETWORK_FANTOM_MAINNET": 111, - "NETWORK_FANTOM_TESTNET": 112, - "NETWORK_BASE_MAINNET": 123, - "NETWORK_BASE_GOERLI": 125, - "NETWORK_ETHEREUM_HOLESKY": 136, + "NETWORK_UNKNOWN": 0, + "NETWORK_SOLANA_MAINNET": 22, + "NETWORK_SOLANA_TESTNET": 23, + "NETWORK_BITCOIN_MAINNET": 33, + "NETWORK_BITCOIN_TESTNET": 34, + "NETWORK_ETHEREUM_MAINNET": 35, + "NETWORK_ETHEREUM_TESTNET": 36, + "NETWORK_BITCOINCASH_MAINNET": 37, + "NETWORK_BITCOINCASH_TESTNET": 38, + "NETWORK_LITECOIN_MAINNET": 39, + "NETWORK_LITECOIN_TESTNET": 40, + "NETWORK_TRON_MAINNET": 64, + "NETWORK_TRON_TESTNET": 65, + "NETWORK_ETHEREUM_GOERLI": 66, + "NETWORK_DOGECOIN_MAINNET": 56, + "NETWORK_DOGECOIN_TESTNET": 57, + "NETWORK_BSC_MAINNET": 70, + "NETWORK_BSC_TESTNET": 71, + "NETWORK_AVACCHAIN_MAINNET": 72, + "NETWORK_AVACCHAIN_TESTNET": 73, + "NETWORK_POLYGON_MAINNET": 78, + "NETWORK_POLYGON_TESTNET": 79, + "NETWORK_OPTIMISM_MAINNET": 86, + "NETWORK_OPTIMISM_TESTNET": 87, + "NETWORK_ARBITRUM_MAINNET": 91, + "NETWORK_ARBITRUM_TESTNET": 92, + "NETWORK_APTOS_MAINNET": 103, + "NETWORK_APTOS_TESTNET": 104, + "NETWORK_FANTOM_MAINNET": 111, + "NETWORK_FANTOM_TESTNET": 112, + "NETWORK_BASE_MAINNET": 123, + "NETWORK_BASE_GOERLI": 125, + "NETWORK_ETHEREUM_HOLESKY": 136, + "NETWORK_STORY_MAINNET": 140, } ) @@ -230,27 +263,33 @@ var file_coinbase_c3_common_common_proto_rawDesc = []byte{ 0x0a, 0x1f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x33, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2a, 0xbf, 0x02, 0x0a, 0x0a, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2a, 0x9f, 0x03, 0x0a, 0x0a, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x4c, 0x41, 0x4e, 0x41, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x42, 0x49, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0x10, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, - 0x55, 0x4d, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, - 0x49, 0x4e, 0x5f, 0x44, 0x4f, 0x47, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0x1a, 0x12, 0x12, 0x0a, - 0x0e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x42, 0x53, 0x43, 0x10, - 0x1f, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, - 0x41, 0x56, 0x41, 0x43, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x10, 0x20, 0x12, 0x16, 0x0a, 0x12, 0x42, - 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, - 0x4e, 0x10, 0x23, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, - 0x4e, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x10, 0x27, 0x12, 0x17, 0x0a, 0x13, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, - 0x52, 0x55, 0x4d, 0x10, 0x29, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, - 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x50, 0x54, 0x4f, 0x53, 0x10, 0x2f, 0x12, 0x15, 0x0a, 0x11, 0x42, - 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, - 0x10, 0x33, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, - 0x5f, 0x42, 0x41, 0x53, 0x45, 0x10, 0x38, 0x2a, 0x87, 0x06, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, + 0x55, 0x4d, 0x10, 0x11, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, + 0x49, 0x4e, 0x5f, 0x42, 0x49, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x43, 0x41, 0x53, 0x48, 0x10, 0x12, + 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x4c, + 0x49, 0x54, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0x13, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x44, 0x4f, 0x47, 0x45, 0x43, 0x4f, 0x49, 0x4e, + 0x10, 0x1a, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x54, 0x52, 0x4f, 0x4e, 0x10, 0x1e, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x42, 0x53, 0x43, 0x10, 0x1f, 0x12, 0x18, 0x0a, 0x14, 0x42, + 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x56, 0x41, 0x43, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x10, 0x20, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x23, 0x12, 0x17, 0x0a, + 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x50, 0x54, 0x49, + 0x4d, 0x49, 0x53, 0x4d, 0x10, 0x27, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, + 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x10, 0x29, 0x12, + 0x14, 0x0a, 0x10, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x50, + 0x54, 0x4f, 0x53, 0x10, 0x2f, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x10, 0x33, 0x12, 0x13, 0x0a, 0x0f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x10, + 0x38, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, + 0x53, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x3c, 0x2a, 0xd5, 0x07, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x53, 0x4f, 0x4c, 0x41, 0x4e, 0x41, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, @@ -263,47 +302,60 @@ var file_coinbase_c3_common_common_proto_rawDesc = []byte{ 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x23, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x54, 0x45, 0x53, - 0x54, 0x4e, 0x45, 0x54, 0x10, 0x24, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, - 0x4b, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x47, 0x4f, 0x45, 0x52, 0x4c, - 0x49, 0x10, 0x42, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x44, - 0x4f, 0x47, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, - 0x38, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x44, 0x4f, 0x47, - 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x39, 0x12, - 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x53, 0x43, 0x5f, 0x4d, - 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x46, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x54, 0x57, - 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x53, 0x43, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, - 0x47, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x56, 0x41, - 0x43, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x48, - 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x56, 0x41, 0x43, - 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x49, 0x12, - 0x1b, 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, - 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x4e, 0x12, 0x1b, 0x0a, 0x17, - 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x5f, - 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x4f, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, - 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x5f, 0x4d, 0x41, - 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x56, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, - 0x52, 0x4b, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, - 0x4e, 0x45, 0x54, 0x10, 0x57, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, - 0x54, 0x10, 0x5b, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, - 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, - 0x5c, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x54, - 0x4f, 0x53, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x67, 0x12, 0x19, 0x0a, 0x15, - 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x54, 0x4f, 0x53, 0x5f, 0x54, 0x45, - 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x68, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x54, 0x57, 0x4f, - 0x52, 0x4b, 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, - 0x54, 0x10, 0x6f, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x46, - 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x70, 0x12, - 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x5f, - 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x7b, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x54, - 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x47, 0x4f, 0x45, 0x52, 0x4c, 0x49, - 0x10, 0x7d, 0x12, 0x1d, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x45, 0x54, - 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x53, 0x4b, 0x59, 0x10, 0x88, - 0x01, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x4e, 0x45, 0x54, 0x10, 0x24, 0x12, 0x1f, 0x0a, 0x1b, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x42, 0x49, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x43, 0x41, 0x53, 0x48, 0x5f, 0x4d, 0x41, + 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x25, 0x12, 0x1f, 0x0a, 0x1b, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x42, 0x49, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x43, 0x41, 0x53, 0x48, 0x5f, 0x54, + 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x26, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, + 0x4f, 0x52, 0x4b, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, + 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x27, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, + 0x45, 0x54, 0x10, 0x28, 0x12, 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, + 0x54, 0x52, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x40, 0x12, 0x18, + 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x52, 0x4f, 0x4e, 0x5f, 0x54, + 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x41, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, + 0x4f, 0x52, 0x4b, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x47, 0x4f, 0x45, + 0x52, 0x4c, 0x49, 0x10, 0x42, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x44, 0x4f, 0x47, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, + 0x54, 0x10, 0x38, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x44, + 0x4f, 0x47, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, + 0x39, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x53, 0x43, + 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x46, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x53, 0x43, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, + 0x54, 0x10, 0x47, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, + 0x56, 0x41, 0x43, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, + 0x10, 0x48, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x56, + 0x41, 0x43, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, + 0x49, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, + 0x59, 0x47, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x4e, 0x12, 0x1b, + 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, + 0x4e, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x4f, 0x12, 0x1c, 0x0a, 0x18, 0x4e, + 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x5f, + 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x56, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x5f, 0x54, 0x45, + 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x57, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x4d, 0x41, 0x49, 0x4e, + 0x4e, 0x45, 0x54, 0x10, 0x5b, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, + 0x54, 0x10, 0x5c, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, + 0x50, 0x54, 0x4f, 0x53, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x67, 0x12, 0x19, + 0x0a, 0x15, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x54, 0x4f, 0x53, 0x5f, + 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x68, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x41, 0x49, 0x4e, + 0x4e, 0x45, 0x54, 0x10, 0x6f, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, + 0x70, 0x12, 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x41, 0x53, + 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x7b, 0x12, 0x17, 0x0a, 0x13, 0x4e, + 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x47, 0x4f, 0x45, 0x52, + 0x4c, 0x49, 0x10, 0x7d, 0x12, 0x1d, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, + 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x53, 0x4b, 0x59, + 0x10, 0x88, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x53, + 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x8c, 0x01, 0x42, + 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2f, 0x63, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/coinbase/c3/common/common.proto b/protos/coinbase/c3/common/common.proto index 9bf93d02..84a940f2 100644 --- a/protos/coinbase/c3/common/common.proto +++ b/protos/coinbase/c3/common/common.proto @@ -11,7 +11,10 @@ enum Blockchain { BLOCKCHAIN_SOLANA = 11; BLOCKCHAIN_BITCOIN = 16; BLOCKCHAIN_ETHEREUM = 17; + BLOCKCHAIN_BITCOINCASH = 18; + BLOCKCHAIN_LITECOIN = 19; BLOCKCHAIN_DOGECOIN = 26; + BLOCKCHAIN_TRON = 30; BLOCKCHAIN_BSC = 31; BLOCKCHAIN_AVACCHAIN = 32; BLOCKCHAIN_POLYGON = 35; @@ -20,6 +23,7 @@ enum Blockchain { BLOCKCHAIN_APTOS = 47; // L1 network using the Move language (originally created for Libra/Diem) BLOCKCHAIN_FANTOM = 51; BLOCKCHAIN_BASE = 56; // Coinbase L2 + BLOCKCHAIN_STORY = 60; } // Network defines an enumeration of supported networks. @@ -35,6 +39,16 @@ enum Network { NETWORK_ETHEREUM_MAINNET = 35; NETWORK_ETHEREUM_TESTNET = 36; + + NETWORK_BITCOINCASH_MAINNET = 37; + NETWORK_BITCOINCASH_TESTNET = 38; + + NETWORK_LITECOIN_MAINNET = 39; + NETWORK_LITECOIN_TESTNET = 40; + + NETWORK_TRON_MAINNET = 64; + NETWORK_TRON_TESTNET = 65; + NETWORK_ETHEREUM_GOERLI = 66; NETWORK_DOGECOIN_MAINNET = 56; @@ -65,4 +79,6 @@ enum Network { NETWORK_BASE_GOERLI = 125; // Coinbase L2 running on Ethereum Goerli NETWORK_ETHEREUM_HOLESKY = 136; + + NETWORK_STORY_MAINNET = 140; } diff --git a/protos/coinbase/chainstorage/api.pb.go b/protos/coinbase/chainstorage/api.pb.go index f18d1ef0..7ffb9c47 100644 --- a/protos/coinbase/chainstorage/api.pb.go +++ b/protos/coinbase/chainstorage/api.pb.go @@ -28,6 +28,7 @@ const ( Compression_NONE Compression = 0 // Compressed using gzip. Compression_GZIP Compression = 1 + Compression_ZSTD Compression = 2 ) // Enum value maps for Compression. @@ -35,10 +36,12 @@ var ( Compression_name = map[int32]string{ 0: "NONE", 1: "GZIP", + 2: "ZSTD", } Compression_value = map[string]int32{ "NONE": 0, "GZIP": 1, + "ZSTD": 2, } ) @@ -2467,139 +2470,140 @@ var file_coinbase_chainstorage_api_proto_rawDesc = []byte{ 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x21, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2b, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x47, 0x5a, 0x49, 0x50, 0x10, 0x01, 0x2a, 0x2b, 0x0a, 0x0f, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x41, - 0x52, 0x4c, 0x49, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x54, 0x45, - 0x53, 0x54, 0x10, 0x01, 0x32, 0xaa, 0x0f, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x6d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x04, 0x47, 0x5a, 0x49, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x53, 0x54, 0x44, 0x10, + 0x02, 0x2a, 0x2b, 0x0a, 0x0f, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x41, 0x52, 0x4c, 0x49, 0x45, 0x53, 0x54, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x54, 0x45, 0x53, 0x54, 0x10, 0x01, 0x32, 0xaa, + 0x0f, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, + 0x6d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2a, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, + 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, + 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, - 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x29, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x63, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2d, 0x2e, 0x63, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, + 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, - 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x30, 0x01, 0x12, 0x6d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, + 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, + 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, + 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x73, 0x65, 0x74, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6c, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x6d, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x82, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x42, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x88, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x35, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3f, 0x5a, 0x3d, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/coinbase/chainstorage/api.proto b/protos/coinbase/chainstorage/api.proto index 9ead69de..3eeb8e7d 100644 --- a/protos/coinbase/chainstorage/api.proto +++ b/protos/coinbase/chainstorage/api.proto @@ -12,6 +12,7 @@ enum Compression { NONE = 0; // Compressed using gzip. GZIP = 1; + ZSTD = 2; } enum InitialPosition { diff --git a/protos/coinbase/chainstorage/blockchain_ethereum.pb.go b/protos/coinbase/chainstorage/blockchain_ethereum.pb.go index a7215ec2..d5685347 100644 --- a/protos/coinbase/chainstorage/blockchain_ethereum.pb.go +++ b/protos/coinbase/chainstorage/blockchain_ethereum.pb.go @@ -1203,6 +1203,38 @@ type EthereumTransactionReceipt struct { // // *EthereumTransactionReceipt_BlobGasUsed OptionalBlobGasUsed isEthereumTransactionReceipt_OptionalBlobGasUsed `protobuf_oneof:"optional_blob_gas_used"` + // Types that are assignable to OptionalFee: + // + // *EthereumTransactionReceipt_Fee + OptionalFee isEthereumTransactionReceipt_OptionalFee `protobuf_oneof:"optional_fee"` + // Types that are assignable to OptionalNetFee: + // + // *EthereumTransactionReceipt_NetFee + OptionalNetFee isEthereumTransactionReceipt_OptionalNetFee `protobuf_oneof:"optional_net_fee"` + // Types that are assignable to OptionalNetUsage: + // + // *EthereumTransactionReceipt_NetUsage + OptionalNetUsage isEthereumTransactionReceipt_OptionalNetUsage `protobuf_oneof:"optional_net_usage"` + // Types that are assignable to OptionalEnergyUsage: + // + // *EthereumTransactionReceipt_EnergyUsage + OptionalEnergyUsage isEthereumTransactionReceipt_OptionalEnergyUsage `protobuf_oneof:"optional_energy_usage"` + // Types that are assignable to OptionalEnergyFee: + // + // *EthereumTransactionReceipt_EnergyFee + OptionalEnergyFee isEthereumTransactionReceipt_OptionalEnergyFee `protobuf_oneof:"optional_energy_fee"` + // Types that are assignable to OptionalOriginEnergyUsage: + // + // *EthereumTransactionReceipt_OriginEnergyUsage + OptionalOriginEnergyUsage isEthereumTransactionReceipt_OptionalOriginEnergyUsage `protobuf_oneof:"optional_origin_energy_usage"` + // Types that are assignable to OptionalEnergyUsageTotal: + // + // *EthereumTransactionReceipt_EnergyUsageTotal + OptionalEnergyUsageTotal isEthereumTransactionReceipt_OptionalEnergyUsageTotal `protobuf_oneof:"optional_energy_usage_total"` + // Types that are assignable to OptionalEnergyPenaltyTotal: + // + // *EthereumTransactionReceipt_EnergyPenaltyTotal + OptionalEnergyPenaltyTotal isEthereumTransactionReceipt_OptionalEnergyPenaltyTotal `protobuf_oneof:"optional_energy_penalty_total"` } func (x *EthereumTransactionReceipt) Reset() { @@ -1419,6 +1451,118 @@ func (x *EthereumTransactionReceipt) GetBlobGasUsed() uint64 { return 0 } +func (m *EthereumTransactionReceipt) GetOptionalFee() isEthereumTransactionReceipt_OptionalFee { + if m != nil { + return m.OptionalFee + } + return nil +} + +func (x *EthereumTransactionReceipt) GetFee() uint64 { + if x, ok := x.GetOptionalFee().(*EthereumTransactionReceipt_Fee); ok { + return x.Fee + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalNetFee() isEthereumTransactionReceipt_OptionalNetFee { + if m != nil { + return m.OptionalNetFee + } + return nil +} + +func (x *EthereumTransactionReceipt) GetNetFee() uint64 { + if x, ok := x.GetOptionalNetFee().(*EthereumTransactionReceipt_NetFee); ok { + return x.NetFee + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalNetUsage() isEthereumTransactionReceipt_OptionalNetUsage { + if m != nil { + return m.OptionalNetUsage + } + return nil +} + +func (x *EthereumTransactionReceipt) GetNetUsage() uint64 { + if x, ok := x.GetOptionalNetUsage().(*EthereumTransactionReceipt_NetUsage); ok { + return x.NetUsage + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalEnergyUsage() isEthereumTransactionReceipt_OptionalEnergyUsage { + if m != nil { + return m.OptionalEnergyUsage + } + return nil +} + +func (x *EthereumTransactionReceipt) GetEnergyUsage() uint64 { + if x, ok := x.GetOptionalEnergyUsage().(*EthereumTransactionReceipt_EnergyUsage); ok { + return x.EnergyUsage + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalEnergyFee() isEthereumTransactionReceipt_OptionalEnergyFee { + if m != nil { + return m.OptionalEnergyFee + } + return nil +} + +func (x *EthereumTransactionReceipt) GetEnergyFee() uint64 { + if x, ok := x.GetOptionalEnergyFee().(*EthereumTransactionReceipt_EnergyFee); ok { + return x.EnergyFee + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalOriginEnergyUsage() isEthereumTransactionReceipt_OptionalOriginEnergyUsage { + if m != nil { + return m.OptionalOriginEnergyUsage + } + return nil +} + +func (x *EthereumTransactionReceipt) GetOriginEnergyUsage() uint64 { + if x, ok := x.GetOptionalOriginEnergyUsage().(*EthereumTransactionReceipt_OriginEnergyUsage); ok { + return x.OriginEnergyUsage + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalEnergyUsageTotal() isEthereumTransactionReceipt_OptionalEnergyUsageTotal { + if m != nil { + return m.OptionalEnergyUsageTotal + } + return nil +} + +func (x *EthereumTransactionReceipt) GetEnergyUsageTotal() uint64 { + if x, ok := x.GetOptionalEnergyUsageTotal().(*EthereumTransactionReceipt_EnergyUsageTotal); ok { + return x.EnergyUsageTotal + } + return 0 +} + +func (m *EthereumTransactionReceipt) GetOptionalEnergyPenaltyTotal() isEthereumTransactionReceipt_OptionalEnergyPenaltyTotal { + if m != nil { + return m.OptionalEnergyPenaltyTotal + } + return nil +} + +func (x *EthereumTransactionReceipt) GetEnergyPenaltyTotal() uint64 { + if x, ok := x.GetOptionalEnergyPenaltyTotal().(*EthereumTransactionReceipt_EnergyPenaltyTotal); ok { + return x.EnergyPenaltyTotal + } + return 0 +} + type isEthereumTransactionReceipt_OptionalStatus interface { isEthereumTransactionReceipt_OptionalStatus() } @@ -1480,6 +1624,89 @@ type EthereumTransactionReceipt_BlobGasUsed struct { func (*EthereumTransactionReceipt_BlobGasUsed) isEthereumTransactionReceipt_OptionalBlobGasUsed() {} +type isEthereumTransactionReceipt_OptionalFee interface { + isEthereumTransactionReceipt_OptionalFee() +} + +type EthereumTransactionReceipt_Fee struct { + Fee uint64 `protobuf:"varint,22,opt,name=fee,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_Fee) isEthereumTransactionReceipt_OptionalFee() {} + +type isEthereumTransactionReceipt_OptionalNetFee interface { + isEthereumTransactionReceipt_OptionalNetFee() +} + +type EthereumTransactionReceipt_NetFee struct { + NetFee uint64 `protobuf:"varint,23,opt,name=net_fee,json=netFee,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_NetFee) isEthereumTransactionReceipt_OptionalNetFee() {} + +type isEthereumTransactionReceipt_OptionalNetUsage interface { + isEthereumTransactionReceipt_OptionalNetUsage() +} + +type EthereumTransactionReceipt_NetUsage struct { + NetUsage uint64 `protobuf:"varint,24,opt,name=net_usage,json=netUsage,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_NetUsage) isEthereumTransactionReceipt_OptionalNetUsage() {} + +type isEthereumTransactionReceipt_OptionalEnergyUsage interface { + isEthereumTransactionReceipt_OptionalEnergyUsage() +} + +type EthereumTransactionReceipt_EnergyUsage struct { + EnergyUsage uint64 `protobuf:"varint,25,opt,name=energy_usage,json=energyUsage,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_EnergyUsage) isEthereumTransactionReceipt_OptionalEnergyUsage() {} + +type isEthereumTransactionReceipt_OptionalEnergyFee interface { + isEthereumTransactionReceipt_OptionalEnergyFee() +} + +type EthereumTransactionReceipt_EnergyFee struct { + EnergyFee uint64 `protobuf:"varint,26,opt,name=energy_fee,json=energyFee,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_EnergyFee) isEthereumTransactionReceipt_OptionalEnergyFee() {} + +type isEthereumTransactionReceipt_OptionalOriginEnergyUsage interface { + isEthereumTransactionReceipt_OptionalOriginEnergyUsage() +} + +type EthereumTransactionReceipt_OriginEnergyUsage struct { + OriginEnergyUsage uint64 `protobuf:"varint,27,opt,name=origin_energy_usage,json=originEnergyUsage,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_OriginEnergyUsage) isEthereumTransactionReceipt_OptionalOriginEnergyUsage() { +} + +type isEthereumTransactionReceipt_OptionalEnergyUsageTotal interface { + isEthereumTransactionReceipt_OptionalEnergyUsageTotal() +} + +type EthereumTransactionReceipt_EnergyUsageTotal struct { + EnergyUsageTotal uint64 `protobuf:"varint,28,opt,name=energy_usage_total,json=energyUsageTotal,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_EnergyUsageTotal) isEthereumTransactionReceipt_OptionalEnergyUsageTotal() { +} + +type isEthereumTransactionReceipt_OptionalEnergyPenaltyTotal interface { + isEthereumTransactionReceipt_OptionalEnergyPenaltyTotal() +} + +type EthereumTransactionReceipt_EnergyPenaltyTotal struct { + EnergyPenaltyTotal uint64 `protobuf:"varint,29,opt,name=energy_penalty_total,json=energyPenaltyTotal,proto3,oneof"` +} + +func (*EthereumTransactionReceipt_EnergyPenaltyTotal) isEthereumTransactionReceipt_OptionalEnergyPenaltyTotal() { +} + type EthereumEventLog struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1715,25 +1942,26 @@ type EthereumTransactionFlattenedTrace struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` - Value string `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` - Gas uint64 `protobuf:"varint,6,opt,name=gas,proto3" json:"gas,omitempty"` - GasUsed uint64 `protobuf:"varint,7,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` - Input string `protobuf:"bytes,8,opt,name=input,proto3" json:"input,omitempty"` - Output string `protobuf:"bytes,9,opt,name=output,proto3" json:"output,omitempty"` - Subtraces uint64 `protobuf:"varint,10,opt,name=subtraces,proto3" json:"subtraces,omitempty"` - TraceAddress []uint64 `protobuf:"varint,11,rep,packed,name=trace_address,json=traceAddress,proto3" json:"trace_address,omitempty"` - TraceType string `protobuf:"bytes,12,opt,name=trace_type,json=traceType,proto3" json:"trace_type,omitempty"` - CallType string `protobuf:"bytes,13,opt,name=call_type,json=callType,proto3" json:"call_type,omitempty"` - TraceId string `protobuf:"bytes,14,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` - Status uint64 `protobuf:"varint,15,opt,name=status,proto3" json:"status,omitempty"` - BlockHash string `protobuf:"bytes,16,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` - BlockNumber uint64 `protobuf:"varint,17,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` - TransactionHash string `protobuf:"bytes,18,opt,name=transaction_hash,json=transactionHash,proto3" json:"transaction_hash,omitempty"` - TransactionIndex uint64 `protobuf:"varint,19,opt,name=transaction_index,json=transactionIndex,proto3" json:"transaction_index,omitempty"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` + Value string `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` + Gas uint64 `protobuf:"varint,6,opt,name=gas,proto3" json:"gas,omitempty"` + GasUsed uint64 `protobuf:"varint,7,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + Input string `protobuf:"bytes,8,opt,name=input,proto3" json:"input,omitempty"` + Output string `protobuf:"bytes,9,opt,name=output,proto3" json:"output,omitempty"` + Subtraces uint64 `protobuf:"varint,10,opt,name=subtraces,proto3" json:"subtraces,omitempty"` + TraceAddress []uint64 `protobuf:"varint,11,rep,packed,name=trace_address,json=traceAddress,proto3" json:"trace_address,omitempty"` + TraceType string `protobuf:"bytes,12,opt,name=trace_type,json=traceType,proto3" json:"trace_type,omitempty"` + CallType string `protobuf:"bytes,13,opt,name=call_type,json=callType,proto3" json:"call_type,omitempty"` + TraceId string `protobuf:"bytes,14,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + Status uint64 `protobuf:"varint,15,opt,name=status,proto3" json:"status,omitempty"` + BlockHash string `protobuf:"bytes,16,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` + BlockNumber uint64 `protobuf:"varint,17,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` + TransactionHash string `protobuf:"bytes,18,opt,name=transaction_hash,json=transactionHash,proto3" json:"transaction_hash,omitempty"` + TransactionIndex uint64 `protobuf:"varint,19,opt,name=transaction_index,json=transactionIndex,proto3" json:"transaction_index,omitempty"` + CallValueInfo []*CallValueInfo `protobuf:"bytes,20,rep,name=call_value_info,json=callValueInfo,proto3" json:"call_value_info,omitempty"` } func (x *EthereumTransactionFlattenedTrace) Reset() { @@ -1901,6 +2129,13 @@ func (x *EthereumTransactionFlattenedTrace) GetTransactionIndex() uint64 { return 0 } +func (x *EthereumTransactionFlattenedTrace) GetCallValueInfo() []*CallValueInfo { + if x != nil { + return x.CallValueInfo + } + return nil +} + type EthereumTokenTransfer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2337,6 +2572,61 @@ func (x *EthereumAccountStateResponse) GetCodeHash() string { return "" } +type CallValueInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + CallValue int64 `protobuf:"varint,2,opt,name=call_value,json=callValue,proto3" json:"call_value,omitempty"` +} + +func (x *CallValueInfo) Reset() { + *x = CallValueInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CallValueInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CallValueInfo) ProtoMessage() {} + +func (x *CallValueInfo) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CallValueInfo.ProtoReflect.Descriptor instead. +func (*CallValueInfo) Descriptor() ([]byte, []int) { + return file_coinbase_chainstorage_blockchain_ethereum_proto_rawDescGZIP(), []int{18} +} + +func (x *CallValueInfo) GetTokenId() string { + if x != nil { + return x.TokenId + } + return "" +} + +func (x *CallValueInfo) GetCallValue() int64 { + if x != nil { + return x.CallValue + } + return 0 +} + type EthereumTransactionReceipt_L1FeeInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2351,7 +2641,7 @@ type EthereumTransactionReceipt_L1FeeInfo struct { func (x *EthereumTransactionReceipt_L1FeeInfo) Reset() { *x = EthereumTransactionReceipt_L1FeeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[18] + mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2364,7 +2654,7 @@ func (x *EthereumTransactionReceipt_L1FeeInfo) String() string { func (*EthereumTransactionReceipt_L1FeeInfo) ProtoMessage() {} func (x *EthereumTransactionReceipt_L1FeeInfo) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[18] + mi := &file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2626,7 +2916,7 @@ var file_coinbase_chainstorage_blockchain_ethereum_proto_rawDesc = []byte{ 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x1f, 0x0a, 0x1d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x1a, + 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x22, 0xcf, 0x0c, 0x0a, 0x1a, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, @@ -2677,46 +2967,96 @@ var file_coinbase_chainstorage_blockchain_ethereum_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x48, 0x05, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x1a, 0x88, 0x01, 0x0a, 0x09, 0x4c, - 0x31, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0b, 0x6c, 0x31, 0x5f, 0x67, - 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6c, - 0x31, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x31, 0x5f, 0x67, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x6c, 0x31, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x31, - 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x31, 0x46, 0x65, - 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x31, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x31, 0x46, 0x65, 0x65, 0x53, - 0x63, 0x61, 0x6c, 0x61, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x31, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x42, 0x18, 0x0a, 0x16, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x42, 0x22, 0x0a, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x19, - 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, - 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, - 0x73, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x22, 0xa9, 0x02, 0x0a, 0x10, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, - 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0xa0, 0x02, 0x0a, 0x18, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, + 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x65, + 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x04, 0x48, 0x06, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x19, + 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x07, 0x52, 0x06, 0x6e, 0x65, 0x74, 0x46, 0x65, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x6e, 0x65, 0x74, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x04, 0x48, 0x08, 0x52, 0x08, + 0x6e, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x65, 0x6e, 0x65, 0x72, + 0x67, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x48, 0x09, + 0x52, 0x0b, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, + 0x0a, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, + 0x04, 0x48, 0x0a, 0x52, 0x09, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x46, 0x65, 0x65, 0x12, 0x30, + 0x0a, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x48, 0x0b, 0x52, 0x11, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x48, 0x0c, 0x52, 0x10, + 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x32, 0x0a, 0x14, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, + 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x04, 0x48, 0x0d, + 0x52, 0x12, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x88, 0x01, 0x0a, 0x09, 0x4c, 0x31, 0x46, 0x65, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0b, 0x6c, 0x31, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6c, 0x31, 0x47, 0x61, 0x73, 0x55, 0x73, + 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x31, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6c, 0x31, 0x47, 0x61, 0x73, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x31, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x31, 0x46, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, + 0x31, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x31, 0x46, 0x65, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x42, + 0x11, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, + 0x31, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x18, 0x0a, 0x16, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x42, 0x22, 0x0a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x19, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x42, 0x0e, 0x0a, + 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x42, 0x12, 0x0a, + 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x66, 0x65, + 0x65, 0x42, 0x14, 0x0a, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, + 0x74, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x42, 0x15, 0x0a, 0x13, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x65, + 0x72, 0x67, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x42, 0x1e, 0x0a, 0x1c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, + 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x1f, 0x0a, 0x1d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x22, 0xa9, 0x02, + 0x0a, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, + 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0xa0, 0x02, 0x0a, 0x18, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x45, 0x0a, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0xfc, 0x04, 0x0a, + 0x21, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, @@ -2729,111 +3069,101 @@ var file_coinbase_chainstorage_blockchain_ethereum_proto_rawDesc = []byte{ 0x73, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x45, 0x0a, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x21, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x03, 0x67, 0x61, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x11, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xe6, 0x03, 0x0a, 0x15, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, - 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x45, - 0x52, 0x43, 0x32, 0x30, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x12, 0x44, 0x0a, 0x06, 0x65, 0x72, - 0x63, 0x37, 0x32, 0x31, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x2e, 0x45, 0x52, 0x43, 0x37, 0x32, 0x31, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x65, 0x72, 0x63, 0x37, 0x32, 0x31, - 0x42, 0x10, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x22, 0x6c, 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x72, 0x0a, 0x13, 0x45, 0x52, 0x43, 0x37, 0x32, 0x31, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, - 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x19, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x3b, 0x0a, 0x12, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x45, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x22, 0x74, 0x0a, 0x1c, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, - 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4c, 0x0a, + 0x0f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x63, 0x61, + 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe6, 0x03, 0x0a, 0x15, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, + 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, + 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x65, 0x72, 0x63, + 0x32, 0x30, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x12, 0x44, 0x0a, 0x06, + 0x65, 0x72, 0x63, 0x37, 0x32, 0x31, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2e, 0x45, 0x52, 0x43, 0x37, 0x32, 0x31, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x65, 0x72, 0x63, 0x37, + 0x32, 0x31, 0x42, 0x10, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x22, 0x6c, 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x72, 0x0a, 0x13, 0x45, 0x52, 0x43, 0x37, 0x32, 0x31, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x19, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x3b, 0x0a, 0x12, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x45, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0x74, 0x0a, 0x1c, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, + 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x22, 0x49, 0x0a, 0x0d, 0x43, + 0x61, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x61, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2848,7 +3178,7 @@ func file_coinbase_chainstorage_blockchain_ethereum_proto_rawDescGZIP() []byte { return file_coinbase_chainstorage_blockchain_ethereum_proto_rawDescData } -var file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_coinbase_chainstorage_blockchain_ethereum_proto_goTypes = []interface{}{ (*EthereumBlobdata)(nil), // 0: coinbase.chainstorage.EthereumBlobdata (*PolygonExtraData)(nil), // 1: coinbase.chainstorage.PolygonExtraData @@ -2868,32 +3198,34 @@ var file_coinbase_chainstorage_blockchain_ethereum_proto_goTypes = []interface{} (*EthereumAccountStateProof)(nil), // 15: coinbase.chainstorage.EthereumAccountStateProof (*EthereumExtraInput)(nil), // 16: coinbase.chainstorage.EthereumExtraInput (*EthereumAccountStateResponse)(nil), // 17: coinbase.chainstorage.EthereumAccountStateResponse - (*EthereumTransactionReceipt_L1FeeInfo)(nil), // 18: coinbase.chainstorage.EthereumTransactionReceipt.L1FeeInfo - (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp + (*CallValueInfo)(nil), // 18: coinbase.chainstorage.CallValueInfo + (*EthereumTransactionReceipt_L1FeeInfo)(nil), // 19: coinbase.chainstorage.EthereumTransactionReceipt.L1FeeInfo + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_coinbase_chainstorage_blockchain_ethereum_proto_depIdxs = []int32{ 1, // 0: coinbase.chainstorage.EthereumBlobdata.polygon:type_name -> coinbase.chainstorage.PolygonExtraData 4, // 1: coinbase.chainstorage.EthereumBlock.header:type_name -> coinbase.chainstorage.EthereumHeader 7, // 2: coinbase.chainstorage.EthereumBlock.transactions:type_name -> coinbase.chainstorage.EthereumTransaction 4, // 3: coinbase.chainstorage.EthereumBlock.uncles:type_name -> coinbase.chainstorage.EthereumHeader - 19, // 4: coinbase.chainstorage.EthereumHeader.timestamp:type_name -> google.protobuf.Timestamp + 20, // 4: coinbase.chainstorage.EthereumHeader.timestamp:type_name -> google.protobuf.Timestamp 3, // 5: coinbase.chainstorage.EthereumHeader.withdrawals:type_name -> coinbase.chainstorage.EthereumWithdrawal 5, // 6: coinbase.chainstorage.EthereumTransactionAccessList.access_list:type_name -> coinbase.chainstorage.EthereumTransactionAccess 8, // 7: coinbase.chainstorage.EthereumTransaction.receipt:type_name -> coinbase.chainstorage.EthereumTransactionReceipt 12, // 8: coinbase.chainstorage.EthereumTransaction.token_transfers:type_name -> coinbase.chainstorage.EthereumTokenTransfer 6, // 9: coinbase.chainstorage.EthereumTransaction.transaction_access_list:type_name -> coinbase.chainstorage.EthereumTransactionAccessList 11, // 10: coinbase.chainstorage.EthereumTransaction.flattened_traces:type_name -> coinbase.chainstorage.EthereumTransactionFlattenedTrace - 19, // 11: coinbase.chainstorage.EthereumTransaction.block_timestamp:type_name -> google.protobuf.Timestamp + 20, // 11: coinbase.chainstorage.EthereumTransaction.block_timestamp:type_name -> google.protobuf.Timestamp 9, // 12: coinbase.chainstorage.EthereumTransactionReceipt.logs:type_name -> coinbase.chainstorage.EthereumEventLog - 18, // 13: coinbase.chainstorage.EthereumTransactionReceipt.l1_fee_info:type_name -> coinbase.chainstorage.EthereumTransactionReceipt.L1FeeInfo + 19, // 13: coinbase.chainstorage.EthereumTransactionReceipt.l1_fee_info:type_name -> coinbase.chainstorage.EthereumTransactionReceipt.L1FeeInfo 10, // 14: coinbase.chainstorage.EthereumTransactionTrace.calls:type_name -> coinbase.chainstorage.EthereumTransactionTrace - 13, // 15: coinbase.chainstorage.EthereumTokenTransfer.erc20:type_name -> coinbase.chainstorage.ERC20TokenTransfer - 14, // 16: coinbase.chainstorage.EthereumTokenTransfer.erc721:type_name -> coinbase.chainstorage.ERC721TokenTransfer - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 18, // 15: coinbase.chainstorage.EthereumTransactionFlattenedTrace.call_value_info:type_name -> coinbase.chainstorage.CallValueInfo + 13, // 16: coinbase.chainstorage.EthereumTokenTransfer.erc20:type_name -> coinbase.chainstorage.ERC20TokenTransfer + 14, // 17: coinbase.chainstorage.EthereumTokenTransfer.erc721:type_name -> coinbase.chainstorage.ERC721TokenTransfer + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_coinbase_chainstorage_blockchain_ethereum_proto_init() } @@ -3119,6 +3451,18 @@ func file_coinbase_chainstorage_blockchain_ethereum_proto_init() { } } file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CallValueInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthereumTransactionReceipt_L1FeeInfo); i { case 0: return &v.state @@ -3156,6 +3500,14 @@ func file_coinbase_chainstorage_blockchain_ethereum_proto_init() { (*EthereumTransactionReceipt_DepositReceiptVersion)(nil), (*EthereumTransactionReceipt_BlobGasPrice)(nil), (*EthereumTransactionReceipt_BlobGasUsed)(nil), + (*EthereumTransactionReceipt_Fee)(nil), + (*EthereumTransactionReceipt_NetFee)(nil), + (*EthereumTransactionReceipt_NetUsage)(nil), + (*EthereumTransactionReceipt_EnergyUsage)(nil), + (*EthereumTransactionReceipt_EnergyFee)(nil), + (*EthereumTransactionReceipt_OriginEnergyUsage)(nil), + (*EthereumTransactionReceipt_EnergyUsageTotal)(nil), + (*EthereumTransactionReceipt_EnergyPenaltyTotal)(nil), } file_coinbase_chainstorage_blockchain_ethereum_proto_msgTypes[12].OneofWrappers = []interface{}{ (*EthereumTokenTransfer_Erc20)(nil), @@ -3167,7 +3519,7 @@ func file_coinbase_chainstorage_blockchain_ethereum_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_coinbase_chainstorage_blockchain_ethereum_proto_rawDesc, NumEnums: 0, - NumMessages: 19, + NumMessages: 20, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/coinbase/chainstorage/blockchain_ethereum.proto b/protos/coinbase/chainstorage/blockchain_ethereum.proto index b5b9d02d..0046d490 100644 --- a/protos/coinbase/chainstorage/blockchain_ethereum.proto +++ b/protos/coinbase/chainstorage/blockchain_ethereum.proto @@ -168,8 +168,33 @@ message EthereumTransactionReceipt { oneof optional_blob_gas_used { uint64 blob_gas_used = 21; } + oneof optional_fee { + uint64 fee = 22; + } + oneof optional_net_fee { + uint64 net_fee = 23; + } + oneof optional_net_usage { + uint64 net_usage = 24; + } + oneof optional_energy_usage { + uint64 energy_usage = 25; + } + oneof optional_energy_fee { + uint64 energy_fee = 26; + } + oneof optional_origin_energy_usage { + uint64 origin_energy_usage = 27; + } + oneof optional_energy_usage_total { + uint64 energy_usage_total = 28; + } + oneof optional_energy_penalty_total { + uint64 energy_penalty_total = 29; + } } + message EthereumEventLog { bool removed = 1; uint64 log_index = 2; @@ -215,6 +240,7 @@ message EthereumTransactionFlattenedTrace { uint64 block_number = 17; string transaction_hash = 18; uint64 transaction_index = 19; + repeated CallValueInfo call_value_info = 20; } message EthereumTokenTransfer { @@ -258,3 +284,8 @@ message EthereumAccountStateResponse { string storage_hash = 2; string code_hash = 3; } + +message CallValueInfo { + string token_id = 1; + int64 call_value = 2; +} diff --git a/scripts/protogen-py.sh b/scripts/protogen-py.sh new file mode 100755 index 00000000..b4e7984b --- /dev/null +++ b/scripts/protogen-py.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -eo pipefail + +python -m grpc_tools.protoc \ + --python_out=gen/src/python \ + --grpc_python_out=gen/src/python \ + --proto_path=protos \ + protos/coinbase/chainstorage/*.proto \ + protos/coinbase/c3/common/*.proto \ + protos/coinbase/crypto/rosetta/types/*.proto